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

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

我正在尝试使用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");
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到PDF的转换器,并且不在范围内)。 Github允许您将DOCX文件添加到问题报告。

替代项

您可以查看关于

服务器端

PDF编辑的SO问题204860。下面有两种选择,一种是免费软件,另一种是封闭源代码并定价。LibreOffice

另一种方法是在

headless模式

中使用LibreOffice(无界面的命令行执行):libreoffice --headless --convert-to pdf <filename_to_convert>
用于LibreOffice的[[PHP包装器
,如果您不想通过Office Converter使用libreoffice,也可以在这里使用

exec()

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

我在工作中使用过的最好的转换器是

Aspose

,该API涵盖了带有Aspose.Words包的文档,带有Aspose.Cells的工作表,带有Aspose.Slides的演示文稿等。但这是封闭源代码和pretty expensive(如果您在许可证到期后想要它们,则将为pay for updates。)>

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

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