簡體   English   中英

將問題轉換為 .pdf 合並后的 .docx 文件可以在 Word 中正常打開

[英]Issue converting to .pdf a merged .docx file that opens fine in Word

所以,我有以下情況。

我正在研究學術論文系統。 我有幾個輸入,用於作者姓名、合著者、標題、論文類型、介紹、目標等。 我將所有這些信息存儲在數據庫中。 用戶有一個預覽按鈕,單擊該按鈕會異步生成一個 Word 並將文件位置發回給用戶,然后該文件會使用 Google Doc Viewer 在 iframe 中顯示給用戶。

有一個特定的用例,論文的用戶/作者可以附加一個帶有表格的 .docx 文件,或一個帶有圖形的 .jpeg 文件。 該表/圖必須包含在 final.docx 文件中。

對於 the.docx 生成過程,我使用的是PHPWord

所以到目前為止一切正常,但是當我嘗試混合所有內容並將 .docx 文件放在一起時,我的問題就開始了。

方法一

我這樣做的第一個方法是用 PHPWord 做所有事情。 我創建文件,在需要的地方添加文本,如果是圖像,只需插入圖像,然后在圖像下方插入圖形標題。

但是,當我嘗試對 .docx 表格文件做同樣的事情時,事情變得棘手了。 我唯一的選擇是使用this獲取表 XML。 它成功了,但我遇到的問題是,當我打開生成的 Word 文件時,表格就在那里,但它的所有樣式都丟失了並且有透明邊框。 由於這些透明邊框,之后將其轉換為 PDF 時,邊框被忽略,表格信息只是亂碼文本。

方法二(當前方法)

在與第一方法抗爭並使事情變得更加復雜之后,我決定做一些不同的事情。 由於我已經生成了一個包含主要論文信息的 docx 文件並且我需要添加另一個 docx 文件,所以我決定使用DocX Merge Library

所以,我基本上做的是生成三個 word 文件,一個用於主要論文信息,一個用於表格,一個用於表格標題(最后一個主要是為了不使信息的順序過於復雜)。 此外,該數據不在 table.docx 文件中。

然后我運行這個:

$dm->merge( [
    'paper-info.docx',
    'attached-table.docx',
    'attached-table-caption.docx'
], 'complete-file.docx');

因此,之后,我檢查並根據需要生成 Word 文件,表格保持其原始 styles 和尺寸。

但是,如果我在 LibreOffice 中打開它,則會收到以下錯誤消息:

LibreOffice 錯誤消息

然后,如果我繼續並打開該文件,該文件將正確打開所有數據,唯一的例外是它不再尊重文件在 Word 中出現的 fonts。

那么,問題就出現在下一步了。 由於我需要使用以下語法使用 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 文件時出現問題,字體 styles 已取消配置。

同樣奇怪的是,如果我嘗試在我的 PHP 腳本中運行它:

shell_exec('soffice --headless --convert-to pdf complete-file.docx');

什么都沒發生。

我在 Windows 10 x64 上運行 Apache 2.4.25、PHP 7.4.11。

結論

到目前為止,我最好的結果是合並文件,但它也導致了這個問題。 所以也許問題出在我正在使用的合並過程中。 理想的情況是能夠插入帶有 styles 的表格以及使用 PHPWord 的所有內容,但我還沒有能夠也沒有找到任何關於如何做到這一點的示例。

我見過的另一個選擇是這個庫,但合並功能僅在 599 美元的許可證中,而且由於我非常接近解決這個問題,我不確定它是否能解決我的問題。 如果是這樣,我會投資它,因為我需要盡快完成這項工作,但我想與你們核實你們對這種情況的建議。 也許另一個合並庫或通過 PHPWord 做所有事情。

感謝幫助!

在多次嘗試修復它之后,我無法使用 PHPWord 和我提到的合並庫實現我想要的。

因為我需要解決這個問題,所以我決定投資我在問題中提到的付費圖書館。 這是一筆昂貴的購買,但對於那些感興趣的人來說,它完全符合要求,而且做得很完美。

我需要的兩個主要功能是文檔合並和將內容導入 .docx 文件。

所以我不得不購買 Premium package。一旦到了那里,圖書館就會為你做所有的事情。

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

如您所見,這很容易。 這個答案絕不是這個圖書館的廣告,但對於那些和我有同樣問題的人來說,這是一個救命稻草。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM