将DOCX转换为PDF时没有样式

问题描述 投票:5回答:1

我正在尝试使用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");
php dompdf phpword phpoffice
1个回答
2
投票

看一下源代码之后,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文件添加到问题报告中。

Alternatives

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

LibreOffice的

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

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

如果你不想通过Office Converter使用libreoffice,那么这里也提供了一个用于LibreOffice的PHP包装器,exec()

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

阅读Aspose

我在工作中使用过的最好的转换器是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一样)。

© www.soinside.com 2019 - 2024. All rights reserved.