跳轉到

合併 PDF 範例

需求套件nextpdf/core 難度:中級

完整程式碼

基本合併

<?php

declare(strict_types=1);

use NextPDF\Core\Document;
use NextPDF\Core\Merger\PdfMerger;
use NextPDF\Core\Merger\ValueObjects\MergeSource;
use NextPDF\Core\Merger\ValueObjects\MergeOptions;

$merger = PdfMerger::create();

$merged = $merger->merge(
    sources: [
        MergeSource::fromFile('/pdfs/cover.pdf'),
        MergeSource::fromFile('/pdfs/toc.pdf'),
        MergeSource::fromFile('/pdfs/chapter-1.pdf'),
        MergeSource::fromFile('/pdfs/chapter-2.pdf'),
        MergeSource::fromFile('/pdfs/appendix.pdf'),
    ],
    options: MergeOptions::default(),
);

$merged->save('/output/complete-document.pdf');

選擇性頁面合併

$merged = $merger->merge(
    sources: [
        // 完整文件
        MergeSource::fromFile('/pdfs/full-report.pdf'),

        // 只取第 1、3、5 頁
        MergeSource::fromFile('/pdfs/appendix.pdf')
            ->pages([1, 3, 5]),

        // 取第 2 到第 10 頁
        MergeSource::fromFile('/pdfs/data.pdf')
            ->pageRange(from: 2, to: 10),

        // 倒序(最後一頁到第一頁)
        MergeSource::fromFile('/pdfs/index.pdf')
            ->reversed(),
    ],
    options: MergeOptions::default(),
);

從記憶體合併(字串 / 串流)

use NextPDF\Core\Merger\ValueObjects\MergeSource;

// 從字串
$pdfBytes = file_get_contents('/pdfs/remote-document.pdf');
$source   = MergeSource::fromString($pdfBytes);

// 從可讀串流
$stream = fopen('/pdfs/large-document.pdf', 'rb');
$source = MergeSource::fromStream($stream);

$merged = $merger->merge(sources: [$source1, $source2, $source]);

進階合併選項

$options = MergeOptions::create()
    ->withPreserveBookmarks(true)       // 保留原始書籤並重建
    ->withPreserveFormFields(true)      // 保留表單欄位(欄位名稱加前綴)
    ->withPreserveLayers(true)          // 保留圖層(OCG)
    ->withFlattenBeforeMerge(false)     // 不壓平表單
    ->withInsertBlankPageBetween(false) // 不在文件間插入空白頁
    ->withBookmarkRootTitle('Complete Document');

$merged = $merger->merge(sources: $sources, options: $options);

合併後加封面

use NextPDF\Core\Document;
use NextPDF\Core\ValueObjects\PageSize;

// 動態生成封面
$cover = Document::createStandalone(pageSize: PageSize::A4);
$page  = $cover->pages()->add();
$cover->text()->write(
    text:     '年度報告合訂本',
    position: Position::at(x: 105.0, y: 130.0),
    fontSize: 28.0,
    fontName: 'NotoSansCJKtc-Bold',
    alignment: 'center',
    maxWidth: 160.0,
);

$merged = $merger->merge(
    sources: [
        MergeSource::fromDocument($cover),   // 動態生成的封面
        MergeSource::fromFile('/pdfs/q1.pdf'),
        MergeSource::fromFile('/pdfs/q2.pdf'),
        MergeSource::fromFile('/pdfs/q3.pdf'),
        MergeSource::fromFile('/pdfs/q4.pdf'),
    ],
);

合併加水印

// 合併後對每頁加水印
$merged = $merger->merge(sources: $sources);

$watermarker = $merged->watermarker();
$watermarker->applyText(
    text:     'MERGED DOCUMENT',
    opacity:  0.08,
    rotation: 45.0,
    color:    Color::fromHex('#6B7280'),
);

$merged->save('/output/merged-watermarked.pdf');

程式碼說明

延伸閱讀