使用 PHPWord 将 DOCX 转换为 PDF 时没有样式
No styling when converting DOCX into PDF with PHPWord
我正在尝试使用 PHPWord 将 DOCX 文件转换为 PDF。当我执行脚本时,看起来有些样式元素没有被转换。在 DOCX 文件中,我有一张图片,两张带有 1px 边框和隐藏边框的表格,我正在使用 Tabs。
当我执行脚本时,我得到一个没有图像的 PDF 文件,所有的标签都被替换为 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 表示 before 让它被另一个转换器 dompdf 保存到 PDF。
打开的 issue #1139 证实了这一点,此外它还处理缺少的样式:
The PDF writers being used are taking in the HTML output, which also lacks the styling. The classes are being defined in the <style>
tag, but they are just not being used.
此外 last message 添加:
This still seems to be an issue. html and pdf outputs do not replicate the some styles in docx (header / footers).
关于您的边框问题,另一个 SO question shows a similar issue in a conversion HTML -> PDF. A solution 是编辑 CSS 样式,您显然无法在示例代码中执行此操作,除非您继续预转换为 HTML .
总之,短期内可能无法解决您的问题。如果您不是开发团队的一员,您可以 向他们提交错误报告 (而不是向 dompdf,因为它是一个 HTML-to-PDF 转换器并且它们不在范围内)。 Github 允许您将 DOCX 文件添加到问题报告中。
备选方案
您可以查看关于 服务器端 PDF 编辑 库 的 SO 问题 204860。下面两种选择,一种是免费软件,另一种是闭源收费软件。
LibreOffice
另一种方法是在无头模式下使用LibreOffice(无界面的命令行执行):
libreoffice --headless --convert-to pdf <filename_to_convert>
LibreOffice 的 PHP 包装器,如果您不想要,Office Converter 也可以在这里找到通过 exec()
.
麻烦使用 libreoffice
检查 LibreOffice 转换是否满足您的需求(它可能无法涵盖所有情况,但会满足您的范围)。
Aspose
我在工作中用过的最好的转换器是 Aspose,一个 API 涵盖文档 Aspose.Words 包,工作表 Aspose.Cells,演示文稿用 Aspose.Slides 等等。但它是封闭源代码,pretty expensive (and you'll pay for updates 如果您在许可证到期后需要它们)。
有一种方法可以在PHP到Java(Aspose.Words and Aspose.Cells) or .NET (Aspose.Words same seems to go with Aspose.Cells)中使用它。
我正在尝试使用 PHPWord 将 DOCX 文件转换为 PDF。当我执行脚本时,看起来有些样式元素没有被转换。在 DOCX 文件中,我有一张图片,两张带有 1px 边框和隐藏边框的表格,我正在使用 Tabs。
当我执行脚本时,我得到一个没有图像的 PDF 文件,所有的标签都被替换为 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 表示 before 让它被另一个转换器 dompdf 保存到 PDF。
打开的 issue #1139 证实了这一点,此外它还处理缺少的样式:
The PDF writers being used are taking in the HTML output, which also lacks the styling. The classes are being defined in the
<style>
tag, but they are just not being used.
此外 last message 添加:
This still seems to be an issue. html and pdf outputs do not replicate the some styles in docx (header / footers).
关于您的边框问题,另一个 SO question shows a similar issue in a conversion HTML -> PDF. A solution 是编辑 CSS 样式,您显然无法在示例代码中执行此操作,除非您继续预转换为 HTML .
总之,短期内可能无法解决您的问题。如果您不是开发团队的一员,您可以 向他们提交错误报告 (而不是向 dompdf,因为它是一个 HTML-to-PDF 转换器并且它们不在范围内)。 Github 允许您将 DOCX 文件添加到问题报告中。
备选方案
您可以查看关于 服务器端 PDF 编辑 库 的 SO 问题 204860。下面两种选择,一种是免费软件,另一种是闭源收费软件。
LibreOffice
另一种方法是在无头模式下使用LibreOffice(无界面的命令行执行):
libreoffice --headless --convert-to pdf <filename_to_convert>
LibreOffice 的 PHP 包装器,如果您不想要,Office Converter 也可以在这里找到通过 exec()
.
检查 LibreOffice 转换是否满足您的需求(它可能无法涵盖所有情况,但会满足您的范围)。
Aspose
我在工作中用过的最好的转换器是 Aspose,一个 API 涵盖文档 Aspose.Words 包,工作表 Aspose.Cells,演示文稿用 Aspose.Slides 等等。但它是封闭源代码,pretty expensive (and you'll pay for updates 如果您在许可证到期后需要它们)。
有一种方法可以在PHP到Java(Aspose.Words and Aspose.Cells) or .NET (Aspose.Words same seems to go with Aspose.Cells)中使用它。