You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中合并用户指定的多份doc/docx文档?

Merge Multiple DOC/DOCX Files into One with PHP

Got it, let's build that mergeDocumentParts function you need. The easiest and most reliable way to handle Word document manipulation in PHP is using the PhpOffice/PhpWord library—here's a complete, practical implementation:

Step 1: Install the Required Library

First, set up PhpOffice/PhpWord via Composer (it's the standard tool for this kind of work):

composer require phpoffice/phpword

Step 2: Implement the mergeDocumentParts Function

This function will take your base file path and list of document names, then combine them into a single clean DOCX file. Note: For .doc files, you’ll need to convert them to .docx first (PhpWord has limited support for the old binary DOC format—tools like LibreOffice CLI can handle batch conversions if needed).

require 'vendor/autoload.php';

use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;

function mergeDocumentParts(string $filePath, array $filesName): string {
    // Initialize a new empty document for the merged result
    $mergedDoc = new PhpWord();
    
    // Loop through each document in your list
    foreach ($filesName as $index => $fileName) {
        $fullFilePath = rtrim($filePath, '/') . '/' . $fileName;
        
        // Skip if the file doesn't exist to avoid crashes
        if (!file_exists($fullFilePath)) {
            error_log("Skipping missing file: $fullFilePath");
            continue;
        }
        
        try {
            // Load the source document
            $sourceDoc = IOFactory::load($fullFilePath);
            
            // Copy all content sections from the source to the merged document
            foreach ($sourceDoc->getSections() as $sourceSection) {
                $newSection = $mergedDoc->addSection();
                
                // Clone every element (paragraphs, tables, images, etc.) from the source section
                foreach ($sourceSection->getElements() as $element) {
                    $newSection->addElement(clone $element);
                }
            }
            
            // Add a page break after each document except the last one (optional but cleaner)
            if ($index !== count($filesName) - 1) {
                $mergedDoc->addSection()->addPageBreak();
            }
        } catch (\Exception $e) {
            error_log("Failed to process $fileName: " . $e->getMessage());
            continue;
        }
    }
    
    // Define where to save the final merged file (customize this path if needed)
    $finalFilePath = rtrim($filePath, '/') . '/merged_final.docx';
    
    // Save the merged document
    $writer = IOFactory::createWriter($mergedDoc, 'Word2007');
    $writer->save($finalFilePath);
    
    return $finalFilePath;
}

// Your existing code to trigger the merge
$filePath = '../part_folder/' ; 
$filesName = [ '1_en.docx' , '2_en.docx' , '3_en.docx' , '3_en.docx' , '5_en.docx' , ]; 
$finalFile = mergeDocumentParts($filePath , $filesName);

// Optional: Print the result path for confirmation
echo "Merged document saved to: $finalFile";

Key Details to Note:

  • Duplicate Files: The function will process duplicates (like your two 3_en.docx entries) exactly as they appear in the list—both copies will be included in the merged output.
  • Error Resilience: It skips missing files and logs errors, so your script won’t crash if a file is missing or corrupted.
  • DOC File Support: If you need to handle .doc files, convert them to .docx first with a batch command like:
    libreoffice --headless --convert-to docx ../part_folder/*.doc
    

内容的提问来源于stack exchange,提问作者Hussein Alsheikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:57:21