9

我正在尝试使用 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");
4

1 回答 1

6

查看源代码后,似乎PHPWord之前将文档转换为 HTML表示,然后再通过另一个转换器dompdf将其保存为PDF 。

这就是已打开的问题 #1139所确认的,此外它还处理缺失的样式:

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

最后一条消息还补充说:

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

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

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

备择方案

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

自由办公室

另一种方法是在无头模式下使用LibreOffice(命令行执行无界面):

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

LibreOffice的PHP 包装器如果您不想通过exec().

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

假设

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

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

于 2019-02-12T23:08:35.073 回答