如何在PHP中合并docx文档?

时间:2011-02-22 21:09:31

标签: php ms-word docx

有没有人知道如何合并(连接)docx文档与PHP(或Python,如果在PHP中不可能)?

为了澄清,我的服务器是基于Linux的。我有2个现有的docx文档,我需要使用PHP或可能的Python将它们放在一个新的docx文档中。

3 个答案:

答案 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 的开发人员布道师。