将在 Word 中打开的合并 .docx 文件转换为 .pdf 的问题
Issue converting to .pdf a merged .docx file that opens fine in Word
所以,我有以下场景。
我正在开发一个学术论文系统。我有几个输入,用于作者姓名、合著者、标题、论文类型、介绍、目标等。我将所有这些信息存储在数据库中。用户有一个预览按钮,单击该按钮会异步生成一个 Word 并将文件位置发回给用户,然后该文件会使用 Google Doc Viewer 在 iframe 中显示给用户。
有一个特定的用例,论文的 user/author 可以附加一个带有 table 的 .docx 文件,或者一个图形的 .jpeg 文件。 table/figure 必须包含在最终的 .docx 文件中。
对于 .docx 生成过程,我使用 PHPWord。
到目前为止,一切正常,但当我尝试混合所有内容并将 .docx 文件放在一起时,我的问题就开始了。
方法一
我做这件事的第一个方法是用 PHPWord 做所有事情。我创建文件,在需要的地方添加文本,如果是图片,只需插入图片,然后在图片下方添加图片标题。
当我尝试对 .docx table 文件做同样的事情时,事情变得棘手了。我唯一的选择是使用 获得 table XML。它成功了,但我 运行 遇到的问题是,当我打开生成的 Word 文件时, table 就在那里,但它的所有样式都丢失了,而且 t运行sparent边界。由于那些 t运行sparent 边框,之后将其转换为 PDF 时边框被忽略,table 信息只是乱码。
方法二(当前方法)
在与第一方法抗争并使事情变得更加复杂之后,我决定做一些不同的事情。由于我已经生成了一个包含主要论文信息的 docx 文件,我需要添加另一个 docx 文件,所以我决定使用 DocX Merge Library.
所以,我基本上做的是生成三个 word 文件,一个用于主要论文信息,一个用于 table,一个用于 table 标题(最后一个主要是不要使信息的顺序过于复杂)。此外,该数据不在 table .docx 文件中。
然后我运行这个:
$dm->merge( [
'paper-info.docx',
'attached-table.docx',
'attached-table-caption.docx'
], 'complete-file.docx');
因此,之后,我检查并生成了我需要的 Word 文件,table 保持其原始样式和尺寸。
如果我在 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
文件的内容,并在 table 和 [=93= 的位置结束] 标题应该出现。我在 Word 中打开完全相同的文件,它显示 table 和标题。
另一个问题是当我尝试将文件转换为 PDF 时。
如果我将 PHPWord 的转换方法与 DomPDF 结合使用,我会遇到与 Google 文档查看器完全相同的问题,我只有第一个文件的内容,使用这个代码:
$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 插入带有样式和所有内容的 table,但我无法做到,也没有找到任何关于如何做到这一点的示例。
我看到的另一个选项是 this library,但合并功能仅在 599 美元的许可证中,并且由于我非常接近解决这个问题,所以我不确定它是否会解决我的问题。如果是这样,我会投资它,因为我需要尽快完成这项工作,但我想与你们核实你们对这种情况的建议。也许另一个合并库或通过 PHPWord 做所有事情。
感谢帮助!
经过多次修复尝试后,我无法使用 PHPWord 和我提到的合并库实现我想要的。
因为我需要解决这个问题,所以我决定投资我在问题中提到的付费图书馆。这是一笔昂贵的购买,但对于那些感兴趣的人来说,它完全符合要求,而且做得很完美。
我需要的两个主要功能是文档合并和将内容导入 .docx 文件。
所以我不得不购买高级套餐。一旦到达那里,图书馆就会为您做一切。
docx 文件合并代码示例:
require_once 'classes/MultiMerge.php';
$merge = new MultiMerge();
$merge->mergeDocx('document.docx', array('second.docx', 'other.docx'), 'output.docx', array());
如何从另一个 docx 文件导入 table 的示例
require_once 'classes/CreateDocx.php';
$docx = new CreateDocxFromTemplate('document.docx');
// import tables
$referenceNode = array(
'type' => 'table',
);
$docx->importContents('document_1.docx', $referenceNode);
$docx->createDocx('output');
如您所见,这非常简单。这个答案绝不是这个图书馆的广告,但是对于那些和我有同样问题的人来说,这是一个救命稻草。
所以,我有以下场景。
我正在开发一个学术论文系统。我有几个输入,用于作者姓名、合著者、标题、论文类型、介绍、目标等。我将所有这些信息存储在数据库中。用户有一个预览按钮,单击该按钮会异步生成一个 Word 并将文件位置发回给用户,然后该文件会使用 Google Doc Viewer 在 iframe 中显示给用户。
有一个特定的用例,论文的 user/author 可以附加一个带有 table 的 .docx 文件,或者一个图形的 .jpeg 文件。 table/figure 必须包含在最终的 .docx 文件中。
对于 .docx 生成过程,我使用 PHPWord。
到目前为止,一切正常,但当我尝试混合所有内容并将 .docx 文件放在一起时,我的问题就开始了。
方法一
我做这件事的第一个方法是用 PHPWord 做所有事情。我创建文件,在需要的地方添加文本,如果是图片,只需插入图片,然后在图片下方添加图片标题。
当我尝试对 .docx table 文件做同样的事情时,事情变得棘手了。我唯一的选择是使用
方法二(当前方法)
在与第一方法抗争并使事情变得更加复杂之后,我决定做一些不同的事情。由于我已经生成了一个包含主要论文信息的 docx 文件,我需要添加另一个 docx 文件,所以我决定使用 DocX Merge Library.
所以,我基本上做的是生成三个 word 文件,一个用于主要论文信息,一个用于 table,一个用于 table 标题(最后一个主要是不要使信息的顺序过于复杂)。此外,该数据不在 table .docx 文件中。
然后我运行这个:
$dm->merge( [
'paper-info.docx',
'attached-table.docx',
'attached-table-caption.docx'
], 'complete-file.docx');
因此,之后,我检查并生成了我需要的 Word 文件,table 保持其原始样式和尺寸。
如果我在 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
文件的内容,并在 table 和 [=93= 的位置结束] 标题应该出现。我在 Word 中打开完全相同的文件,它显示 table 和标题。
另一个问题是当我尝试将文件转换为 PDF 时。
如果我将 PHPWord 的转换方法与 DomPDF 结合使用,我会遇到与 Google 文档查看器完全相同的问题,我只有第一个文件的内容,使用这个代码:
$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 插入带有样式和所有内容的 table,但我无法做到,也没有找到任何关于如何做到这一点的示例。
我看到的另一个选项是 this library,但合并功能仅在 599 美元的许可证中,并且由于我非常接近解决这个问题,所以我不确定它是否会解决我的问题。如果是这样,我会投资它,因为我需要尽快完成这项工作,但我想与你们核实你们对这种情况的建议。也许另一个合并库或通过 PHPWord 做所有事情。
感谢帮助!
经过多次修复尝试后,我无法使用 PHPWord 和我提到的合并库实现我想要的。
因为我需要解决这个问题,所以我决定投资我在问题中提到的付费图书馆。这是一笔昂贵的购买,但对于那些感兴趣的人来说,它完全符合要求,而且做得很完美。
我需要的两个主要功能是文档合并和将内容导入 .docx 文件。
所以我不得不购买高级套餐。一旦到达那里,图书馆就会为您做一切。
docx 文件合并代码示例:
require_once 'classes/MultiMerge.php';
$merge = new MultiMerge();
$merge->mergeDocx('document.docx', array('second.docx', 'other.docx'), 'output.docx', array());
如何从另一个 docx 文件导入 table 的示例
require_once 'classes/CreateDocx.php';
$docx = new CreateDocxFromTemplate('document.docx');
// import tables
$referenceNode = array(
'type' => 'table',
);
$docx->importContents('document_1.docx', $referenceNode);
$docx->createDocx('output');
如您所见,这非常简单。这个答案绝不是这个图书馆的广告,但是对于那些和我有同样问题的人来说,这是一个救命稻草。