使用PHPWord将DOCX转换为PDF时没有样式



我正在尝试使用PHPWord将DOCX文件转换为PDF。当我执行脚本时,看起来有些样式元素没有转换。在DOCX文件中,我有一个图像,两个带有边框1px和隐藏边框的表,我使用的是选项卡。

当我执行脚本时,我得到一个没有图像的PDF文件,所有的选项卡都被Space替换,所有的表都有一个3px的边框。

有人知道我为什么缺少这些款式吗?

这是我的脚本:

while ($data2 = mysql_fetch_array($rsSql)){
$countLines=$countLines+1;
$templateProcessor->setValue('quantity#'.$countLines, $data2['quantity']);
$templateProcessor->setValue('name#'.$countLines, $data2['name']);
$templateProcessor->setValue('price#'.$countLines, "€ " .$data2['price'] ."");
}
PhpOfficePhpWordSettings::setPdfRenderer('./dompdf');
PhpOfficePhpWordSettings::setPdfRendererPath('./dompdf');
PhpOfficePhpWordSettings::setPdfRendererName('DOMPDF');
$temp_file = tempnam(sys_get_temp_dir(), 'Word');
$templateProcessor->saveAS($temp_file);
$phpWord = PhpOfficePhpWordIOFactory::load($temp_file); 
$xmlWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord , 'PDF');
$xmlWriter->save('result.pdf');  
header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename='result.pdf'");
readfile("result.pdf");

查看源代码后,似乎PHPWord以前将文档转换为HTML表示形式,然后由另一个转换器dompdf将其保存为PDF

这就是打开的问题#1139所证实的,此外,它还处理了缺少的样式:

使用的PDF编写器正在接收HTML输出,而也缺少样式。这些类是在<style>标记中定义的,但它们并没有被使用。

最后一条消息还添加了:

这似乎仍然是一个问题。html和pdf输出不会复制docx(页眉/页脚)中的某些样式。

关于边界问题,另一个SO问题在转换HTML中显示了类似的问题->PDF。一个解决方案是编辑CSS样式,除非您继续预转换为HTML,否则您显然无法在示例代码中执行此操作。

总之,你可能无法在短期内解决你的问题。如果你不是开发团队的一员,你可以向他们提交错误报告(而不是dompdf,因为它是一个HTML到PDF的转换器,它们不在范围内)。Github允许您将DOCX文件添加到问题报告中。

备选方案

您可以查看关于服务器端PDF编辑的SO问题204860。以下两种选择,一种是免费软件,另一种是封闭源代码和定价。

LibreOffice

另一种方法是在无头模式中使用LibreOffice(无接口的命令行执行):

soffice --headless --convert-to pdf <filename_to_convert>

如果您不想通过exec()使用LibreOffice,也可以在此处使用LibreOffice的PHP包装器Office Converter

检查LibreOffice转换是否适合您的需求(它可能不涵盖所有情况,但满足您的范围)。

Aspose

我在工作中使用过的最好的转换器是Aspose,这是一个API,涵盖了Aspose.Words包的文档、Aspose.Cells的工作表、Aspose.Slides的演示文稿等等。但它是封闭源代码的,而且非常昂贵(如果您希望在许可证到期后更新,您将支付更新费用)。

有一种方法可以通过Java(Aspose.Words和Aspose.Cells)或.NET(Aspose.Words似乎与Aspose.Cells相同)在PHP中使用它。

最新更新