所以,我有下面的场景。
我正在研究一套学术论文系统。我有几个输入,如作者的名字,合著者,标题,类型的论文,导言,目标等。我把所有的信息都存储在数据库里。用户有一个预览按钮,单击该按钮,异步生成一个单词,并将文件位置发送回用户,然后使用Google在iframe中向用户显示该文件。
有一个特定的用例,在这个用例中,论文的用户/作者可以将.docx文件附加到表中,或者将.jpeg文件附加到图形中。该表/图必须包含在最终的.docx文件中。
对于.docx生成过程,我使用PHPWord。
因此,在此之前,一切都很好,但当我试图混合所有内容并将.docx文件放在一起时,我的问题就开始了。
逼近一号
我做这件事的第一种方法是使用PHPWord完成所有事情。我创建文件,在需要的地方添加文本,在图像的情况下,只插入图像,然后是图像下面的图形标题。
但是,当我尝试对.docx表文件做同样的事情时,事情就变得棘手起来了。我唯一的选择是使用这获取表XML。它成功了,但我遇到的问题是,当我打开生成的Word文件时,表就在那里,但是已经失去了所有的样式和透明的边框。由于这些透明的边框,后来当将其转换为PDF时,边框被忽略了,表格信息只是被置乱的文本。
方法第二(当前第一)
在与第一招搏斗,使事情变得更复杂之后,我决定做一些不同的事情。由于我已经生成了一个包含主要纸张信息的docx文件,并且需要添加另一个docx文件,所以我决定使用DocX合并库。
所以,基本上,我有三个生成的word文件,一个用于主要的纸张信息,一个用于表,一个用于表标题(最后一个主要是为了不过度复杂信息的顺序)。而且,该数据不在表.docx文件中。
然后我运行这个:
$dm->merge( [
'paper-info.docx',
'attached-table.docx',
'attached-table-caption.docx'
], 'complete-file.docx');
因此,之后,我检查并生成了Word文件,就像我需要它与表一起维护其原始样式和维度一样。
但是,如果我在LibreOffice中打开它,就会收到以下错误消息:
然后,如果我继续并打开该文件,该文件将正确地打开所有数据,唯一的例外是它不再像Word中显示的那样尊重文件的字体。
因此,问题出现在下一步。由于我需要使用使用以下语法显示文件的预览:
<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完全相同,我只有第一个文件的内容,使用以下代码:
$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
这将正确地转换文件,但是当尝试在.docx中打开LibreOffice文件时,字体样式会被取消配置。
还有一个奇怪的部分是,如果我试图在PHP脚本中运行这个程序:
shell_exec('soffice --headless --convert-to pdf complete-file.docx');
什么都没发生。
我在Windows10 x64上运行Apache2.4.25,PHP7.4.11。
结论
直到现在,我最好的结果是合并文件,但也导致了这个问题。因此,也许问题来自于我正在使用的合并过程。理想的方法是能够使用PHPWord插入带有样式和所有内容的表,但是我还没有找到任何关于如何这样做的示例。
我看到的另一个选项是这个图书馆,但是合并功能只存在于599美元的许可中,而且由于我非常接近解决这个问题,所以我不确定它是否能解决我的问题。如果是这样的话,我会投资,因为我需要尽快完成这件事,但我想问一下你们对这个案子的建议是什么。也许是另一个合并库,或者通过PHPWord完成所有事情。
我们很感激你的帮助!
发布于 2021-04-17 06:33:47
经过多次尝试,我无法通过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');
正如你所看到的,这很容易。这个答案绝不是这个图书馆的广告,但是对于那些和我有同样问题的人来说,这是一个救生者。
https://stackoverflow.com/questions/67084480
复制相似问题