有没有人知道如何合并(连接)docx文档与PHP(或Python,如果在PHP中不可能)?
为了澄清,我的服务器是基于Linux的。我有2个现有的docx文档,我需要使用PHP或可能的Python将它们放在一个新的docx文档中。
答案 0 :(得分:7)
合并两个不同的Docx文件可能非常复杂,因为标题,样式,图表,注释,用户修改跟踪和其他特殊内容都保存在每个Docx的单独内部XML子文件中。因此,两个Docx可能具有相同ID的不同对象。因此,在两个文档中列出所有可能的对象,给它们新的内部ID,并在一个文档中重新影响它们将是一项非常大的工作。可能只有Office女士目前可以这样做。
尽管如此,如果您知道要合并的两个文档具有相同的样式,并且如果您知道没有图表,标题和其他特殊对象,那么合并将变得非常容易执行。
在这种情况下,您只需使用Zip阅读器(例如TbsZip)打开第一个Docx文件(从技术上讲,它是一个包含XML子文件的zip存档);然后读取子文件“word / document.xml”并提取标签之间的部分< w:身体> 和< / 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');
答案 1 :(得分:0)
您可以使用一行代码将两个Word文档与PHPDocX合并:(来源:Merging Word documents with 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选项丢弃合并文档的节结构,并将其作为最后一节的一部分添加到第一个文档的末尾。在这种情况下,当然,页眉和页脚不会导入,但所有其他元素仍然保留。
答案 2 :(得分:0)
Aspose.Words Cloud SDK for PHP 可以将多个 Word 文档合并/合并为一个 Word 文档,同时根据 ImportFormatMode 参数值保留附加或目标文档的格式。其次,它是一个商业 API,但免费定价计划允许每月 150 次免费 API 调用。
<?php
require_once('D:\xampp\htdocs\aspose-words-cloud-php-master\vendor\autoload.php');
//TODO: Get your ClientId and ClientSecret at https://dashboard.aspose.cloud (free registration is required).
$ClientSecret="xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$ClientId="xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx";
$wordsApi = new Aspose\Words\WordsApi($ClientId,$ClientSecret);
try {
$remoteDataFolder = "Temp";
$localFile = "C:/Temp/02_pages_adobe.docx";
$remoteFileName = "02_pages_adobe.docx";
$localFile1 = "C:/Temp/Sections.docx";
$remoteFileName1 = "Sections.docx";
$outputFileName = "TestAppendDocument.docx";
$uploadRequest = new Aspose\Words\Model\Requests\UploadFileRequest($localFile,$remoteDataFolder."/".$remoteFileName,null);
$wordsApi->uploadFile($uploadRequest);
$uploadRequest1 = new Aspose\Words\Model\Requests\UploadFileRequest($localFile1,$remoteDataFolder."/".$remoteFileName1,null);
$wordsApi->uploadFile($uploadRequest1);
$requestDocumentListDocumentEntries0 = new Aspose\Words\Model\DocumentEntry(array(
"href" => $remoteDataFolder . "/" . $remoteFileName1,
"import_format_mode" => "KeepSourceFormatting",
));
$requestDocumentListDocumentEntries = [
$requestDocumentListDocumentEntries0,
];
$requestDocumentList = new Aspose\Words\Model\DocumentEntryList(array(
"document_entries" => $requestDocumentListDocumentEntries,
));
$request = new Aspose\Words\Model\Requests\AppendDocumentRequest(
$remoteFileName,
$requestDocumentList,
$remoteDataFolder,
NULL,
NULL,
NULL,
$remoteDataFolder . "/" . $outputFileName,
NULL,
NULL
);
$result = $wordsApi->appendDocument($request);
##Download file
$request = new Aspose\Words\Model\Requests\DownloadFileRequest($remoteDataFolder."/".$outputFileName,NULL,NULL);
$result = $wordsApi->downloadFile($request);
copy($result->getPathName(),"AppendOutput.docx");
} catch (Exception $e) {
echo "Something went wrong: ", $e->getMessage(), "\n";
PHP_EOL;
}
?>
P.S:我是 Aspose 的开发人员布道师。