合併 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');