0

所以,我有以下场景。

我正在开发一个学术论文系统。我有几个输入,例如作者姓名、合著者、标题、论文类型、介绍、目标等。我将所有这些信息存储在数据库中。用户有一个预览按钮,单击该按钮后,会异步生成一个 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 中打开它,我会收到以下错误消息:

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 做所有事情。

帮助表示赞赏!

4

1 回答 1

0

经过多次尝试修复它,我无法使用 PHPWord 和我提到的合并库来实现我想要的。

因为我需要解决这个问题,所以我决定投资我在问题中提到的付费图书馆。这是一个昂贵的购买,但对于那些感兴趣的人来说,它完全符合要求并且完美地做到了。

我需要的两个主要功能是文档合并和将内容导入 .docx 文件。

所以我不得不购买高级套餐。一旦到了那里,图书馆就会为您做所有事情。

docx 文件合并代码示例:

require_once 'classes/MultiMerge.php';

$merge = new MultiMerge();

$merge->mergeDocx('document.docx', array('second.docx', 'other.docx'), 'output.docx', array());

如何从另一个 docx 文件导入表的示例

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');

如您所见,这很容易。这个答案绝不是这个图书馆的广告,但对于那些和我有同样问题的人来说,这是一个救命稻草。

于 2021-04-17T14:33:47.540 回答