所以,我有以下场景。
我正在开发一个学术论文系统。我有几个输入,例如作者姓名、合著者、标题、论文类型、介绍、目标等。我将所有这些信息存储在数据库中。用户有一个预览按钮,单击该按钮后,会异步生成一个 Word 并将文件位置发送回用户,然后该文件会使用 Google Doc Viewer 在 iframe 中显示给用户。
有一个特定的用例,论文的用户/作者可以附加一个带有表格的 .docx 文件,或一个用于图形的 .jpeg 文件。该表格/图形必须包含在最终的 .docx 文件中。
对于 .docx 生成过程,我使用的是PHPWord。
所以到目前为止一切正常,但是当我尝试混合所有内容并将 .docx 文件放在一起时,我的问题就开始了。
方法一
我这样做的第一个方法是用 PHPWord 做所有事情。我创建文件,在需要的地方添加文本,如果是图像,只需插入图像,然后在图像下方插入图形标题。
但是,当我尝试对 .docx 表文件做同样的事情时,事情就变得棘手了。我唯一的选择是使用这个来获取表 XML 。它成功了,但我遇到的问题是,当我打开生成的 Word 文件时,表格就在那里,但失去了所有样式并具有透明边框。由于这些透明边框,之后在将其转换为 PDF 时,边框被忽略,表格信息只是乱码。
方法二(当前一)
在与方法一斗争并让事情变得更加复杂之后,我决定做一些不同的事情。由于我已经生成了一个包含主要论文信息的 docx 文件,并且需要添加另一个 docx 文件,因此我决定使用DocX Merge Library。
所以,我基本上做了三个生成的word文件,一个用于主要论文信息,一个用于表格,一个用于表格标题(最后一个主要是为了不使信息顺序过于复杂)。此外,该数据不在表 .docx 文件中。
然后我运行这个:
$dm->merge( [
'paper-info.docx',
'attached-table.docx',
'attached-table-caption.docx'
], 'complete-file.docx');
因此,之后,我检查并生成了我需要的 Word 文件,表格保持其原始样式和尺寸。
但是,如果我在 LibreOffice 中打开它,我会收到以下错误消息:
然后,如果我继续并打开该文件,该文件将正确打开所有数据,唯一的例外是它不再尊重文件在 Word 中显示的字体。
因此,问题出现在下一步。由于我需要使用以下语法使用 Google Doc Viewer 呈现文件预览:
<iframe src="https://docs.google.com/gview?embedded=true&hl=es_LA&url=https://usersite.net/complete-file.docx?pid=explorer&efh=false&a=v&chrome=false&embedded=true" width="100%" height="600" style="border: none;"></iframe>
文档加载得很好,但是当我查看它时,我看到它只显示第一个paper-info.docx
文件的内容,并在表格和表格标题应该出现的地方结束。我在 Word 中打开完全相同的文件,它会显示表格和标题。
另一个问题是当我尝试将文件转换为 PDF 时。
如果我将 PHPWord 的转换方法与 DomPDF 结合使用,我会遇到与 Google Docs Viewer 完全相同的问题,我只有第一个文件的内容,使用以下代码:
$phpWordPDF = \PhpOffice\PhpWord\IOFactory::load('complete-file.docx');
$xmlWriterPDF = \PhpOffice\PhpWord\IOFactory::createWriter($phpWordPDF, 'PDF');
$xmlWriterPDF->save('complete-file-pdf');
所以我唯一可行的方法是使用 LibreOffice 的命令行,使用这个命令:
soffice --headless --convert-to pdf complete-file.docx
这可以正确转换文件,但是在尝试在 LibreOffice 中打开 .docx 文件时提到了问题,字体样式被取消配置。
同样奇怪的是,如果我尝试在我的 PHP 脚本中运行它:
shell_exec('soffice --headless --convert-to pdf complete-file.docx');
什么都没发生。
我在 Windows 10 x64 上运行 Apache 2.4.25、PHP 7.4.11。
结论
到目前为止,我最好的结果是合并文件,但这也导致了这个问题。所以也许问题来自我正在使用的合并过程。理想的是能够使用 PHPWord 插入带有样式和所有内容的表格,但我无法也没有找到任何关于如何做到这一点的示例。
我见过的另一个选择是这个库,但合并功能仅在 599 美元的许可证中,由于我非常接近解决这个问题,我不确定它是否能解决我的问题。如果是这样,我会投资它,因为我需要尽快完成这项工作,但我想与你们核实一下你们对这种情况的建议是什么。也许是另一个合并库或通过 PHPWord 做所有事情。
帮助表示赞赏!