我正在尝试使用PHPWord将DOCX文件转换为PDF。当我执行脚本时,看起来似乎没有转换某些样式元素。在DOCX文件中,我有一个图像,两个带边框1px和隐藏边框的表,我正在使用Tabs。
当我执行脚本时,我得到一个没有图像的PDF文件,所有的Tab都被替换为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'] ."");
}
\PhpOffice\PhpWord\Settings::setPdfRenderer('./dompdf');
\PhpOffice\PhpWord\Settings::setPdfRendererPath('./dompdf');
\PhpOffice\PhpWord\Settings::setPdfRendererName('DOMPDF');
$temp_file = tempnam(sys_get_temp_dir(), 'Word');
\$templateProcessor->saveAS($temp_file);
$phpWord = \PhpOffice\PhpWord\IOFactory::load($temp_file);
$xmlWriter = \PhpOffice\PhpWord\IOFactory::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。
这就是开放的issue #1139确认的内容,而且它处理缺少的样式:
正在使用的PDF编写器正在接收HTML输出,这也缺乏样式。这些类在
<style>
标记中定义,但它们只是没有被使用。
此外,last message补充说:
这仍然是一个问题。 html和pdf输出不会复制docx(页眉/页脚)中的某些样式。
关于你的边界问题,另一个SO question在转换HTML - > PDF中显示了类似的问题。 solution用于编辑CSS样式,您显然无法在示例代码中执行该样式,除非您继续预转换为HTML。
总之,您可能无法在短期内解决您的问题。如果您不参与开发团队,您可以向他们提交错误报告(而不是dompdf,因为它是HTML-to-PDF转换器,并且它们不在范围内)。 Github允许您将DOCX文件添加到问题报告中。
你可以查看关于服务器端PDF编辑库的SO问题204860。以下两种选择,一种是免费软件,另一种是封闭源和定价。
另一种方法是在无头模式下使用LibreOffice(没有接口的命令行执行):
libreoffice --headless --convert-to pdf <filename_to_convert>
如果你不想通过Office Converter使用libreoffice,那么这里也提供了一个用于LibreOffice的PHP包装器,exec()
。
检查LibreOffice转换是否符合您的需求(可能不会涵盖所有情况,但要满足您的范围)。
我在工作中使用过的最好的转换器是Aspose,一个API,包括使用Aspose.Words包的文档,使用Aspose.Cells的Worksheets,使用Aspose.Slides的演示文稿等等。但它是封闭源和pretty expensive(如果你的许可证到期后你想要它们,你会pay for updates)。
有一种方法可以在PHP中使用它来通过Java(Aspose.Words和Aspose.Cells)或.NET(Aspose.Words似乎与Aspose.Cells一样)。