将DOCX转换为PDF时没有样式

时间:2019-02-10 11:53:27

标签: php dompdf phpword phpoffice

我正在尝试使用PHPWord将DOCX文件转换为PDF。当我执行脚本时,似乎某些样式元素未转换。在DOCX文件中,我有一张图像,两个带有1px边框和隐藏边框的表格,并且我使用的是制表符。

执行脚本时,我得到一个没有图像的PDF文件,所有选项卡都替换为空格,所有表的边框都为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");

1 个答案:

答案 0 :(得分:2)

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

这是打开的issue #1139所确认的,此外,它还处理缺少的样式:

  

正在使用的PDF编写器正在获取HTML输出,该输出也缺少样式。这些类是在<style>标记中定义的,但只是没有使用。

last message还添加:

  

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

关于边界问题,另一个SO question在转换HTML-> PDF中显示了类似的问题。 solution用于编辑CSS样式,除非您继续进行预转换为HTML,否则您显然无法在示例代码中执行该样式。

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

替代项

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

LibreOffice

另一种方法是在 headless模式(无界面的命令行执行)中使用 LibreOffice

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

用于LibreOffice的 PHP包装器,如果您不想通过exec()使用libreoffice,也可以在 Office Converter 中使用。< / p>

检查LibreOffice转换是否满足您的需求(它可能无法满足所有情况,但满足您的范围)。

摆姿势

我曾经在工作中使用过的最好的转换器是 Aspose ,该API涵盖了带有Aspose.Words包的Documents,带有Aspose.Cells的工作表,带有Aspose.Slides的Presentation等。但这是封闭源代码和pretty expensive(如果您在许可证到期后希望使用它们,则会pay for updates)。

有一种方法可以通过Java(Aspose。Words和Aspose。Cells)或.NET(Aspose。Words)在PHP中使用它。Aspose也是如此。{ {3}}。