Как объединить документы DOCX в PHP? - PullRequest
2 голосов
/ 23 февраля 2011

Кто-нибудь знает, как объединить (объединить) документы DOCX с PHP (или Python, если это невозможно в PHP)?

Чтобы уточнить, мой сервер основан на Linux. У меня есть 2 существующих документа docx, мне нужно поместить их в новый документ docx, используя PHP или, возможно, Python.

Ответы [ 2 ]

7 голосов
/ 01 ноября 2011

Объединение двух разных файлов 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');
0 голосов
/ 23 июля 2012

Вы можете объединить два документа Word с PHPDocX с помощью одной строки кода: (Источник: Объединение документов Word с PHPDocX )

require_once 'path /classes/DocxUtilities.inc';
$newDocx = new DocxUtilities();
$myOptions = array('mergeType' => 0);
$newDocx->mergeDocx('firstWordDoc.docx', 'secondWordDoc.docx', 'mergedWord.docx',
                    $myOptions);  

Это объединение позволяет сохранить всю структуру разделов (размер бумаги, поля, связанные нижние и нижние колонтитулы и т. Д.), Включает в себя все необходимые стили, управляет всеми списками (это может показаться тривиальным, но в стандарте OOXML это не так) ), сохраняет изображения и диаграммы, а также сноски, сноски и комментарии.

Кроме того, есть возможность сохранить исходную нумерацию (по умолчанию нумерация страниц продолжается).

Можно также через опцию mergeType отказаться от структуры раздела объединенного документа и добавить его в конце первого документа как часть его последнего раздела. В этом случае, конечно, верхние и нижние колонтитулы не импортируются, но все остальные элементы все еще сохраняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...