Объединение двух разных файлов Docx может быть очень сложным, поскольку заголовки, стили, диаграммы, комментарии, трассировки изменения пользователя и другое специальное содержимое сохраняются в отдельных внутренних подфайлах XML в каждом Docx.Таким образом, два Docx могут иметь разные объекты, имеющие одинаковые идентификаторы.Поэтому было бы очень сложно составить список всех возможных объектов в двух документах, дать им новые внутренние идентификаторы и заново отразить их в одном.Вероятно, только г-жа Office может сделать это в настоящее время.
Тем не менее, если вы знаете, что два ваших документа должны быть объединены, имеют одинаковые стили, и если вы знаете, что у вас нет диаграмм, заголовков и других специальных объектов, то объединениестановится чем-то довольно простым для выполнения.
В этом случае вам всего лишь нужно использовать Zip-ридер, такой как TbsZip , чтобы открыть первый файл Docx (который технически представляет собой zip-архив, содержащийXML-файлы);затем прочитайте подфайл «word / document.xml» и извлеките часть, которая находится между тегами и </ w: body>.Во втором файле Docx откройте «word / content.xml» и вставьте предыдущий контент непосредственно перед тегом </ w: body>.Сохраните результат в новом файле Docx.
Это можно сделать с помощью TbsZip, например:
<?php
include_once('tbszip.php');
$zip = new clsTbsZip();
// Open the first document
$zip->Open('doc1.docx');
$content1 = $zip->FileRead('word/document.xml');
$zip->Close();
// Extract the content of the first document
$p = strpos($content1, '<w:body');
if ($p===false) exit("Tag <w:body> not found in document 1.");
$p = strpos($content1, '>', $p);
$content1 = substr($content1, $p+1);
$p = strpos($content1, '</w:body>');
if ($p===false) exit("Tag </w:body> not found in document 1.");
$content1 = substr($content1, 0, $p);
// Insert into the second document
$zip->Open('doc2.docx');
$content2 = $zip->FileRead('word/document.xml');
$p = strpos($content2, '</w:body>');
if ($p===false) exit("Tag </w:body> not found in document 2.");
$content2 = substr_replace($content2, $content1, $p, 0);
$zip->FileReplace('word/document.xml', $content2, TBSZIP_STRING);
// Save the merge into a third file
$zip->Flush(TBSZIP_FILE, 'merge.docx');