Skip to content

從 mPDF 遷移

本指南協助您從 mPDF(mpdf/mpdf)遷移至 TCPDF-Next。mPDF 是一套類似 DomPDF 的 HTML 轉 PDF 函式庫,但具備更廣泛的 CSS 支援與額外功能。TCPDF-Next 提供 mPDF 功能的超集,並符合現代標準。

功能比較

特性mPDFTCPDF-Next
PHP 版本7.4+8.5+
PDF 版本PDF 1.4 / 1.7PDF 2.0
架構HTML/CSS 為核心PDF 原生,支援 HTML
CJK 支援有(大型字型檔案)有(最佳化子集)
RTL / BiDi有(UAX #9 合規)
加密RC4-40、RC4-128、AES-128、AES-256僅 AES-256(PDF 2.0)
數位簽章不支援PAdES B-B 至 B-LTA
PDF/APDF/A-1b、PDF/A-3b(部分)PDF/A-4(完整)
無障礙有限標記式 PDF(PDF/UA)
記憶體使用高(完整 DOM + 圖片存於記憶體)中等(串流輸出)
相依套件10+ 個 Composer 套件零執行期相依

何時該遷移

若您需要以下功能,請考慮從 mPDF 遷移至 TCPDF-Next:

  • 數位簽章 — mPDF 不支援簽章功能
  • 現代 PDF/A 合規 — PDF/A-4(不僅是 PDF/A-1b)
  • 更佳安全性 — 僅 AES-256,無 RC4
  • 更低記憶體使用 — 大型文件的串流輸出
  • 更少相依套件 — 零執行期相依 vs. 10+
  • 無障礙 — 具結構元素的標記式 PDF

逐步遷移

步驟 1:更新相依套件

bash
composer remove mpdf/mpdf
composer require yeee-fang/tcpdf-next

TIP

移除 mPDF 同時也會移除其 10 多個傳遞相依套件(psr/log、psr/http-message、setasign/fpdi 等),大幅簡化您的相依樹。

步驟 2:替換文件建立

mPDF(遷移前):

php
$mpdf = new \Mpdf\Mpdf([
    'mode' => 'utf-8',
    'format' => 'A4',
    'margin_left' => 15,
    'margin_right' => 15,
    'margin_top' => 16,
    'margin_bottom' => 16,
    'default_font_size' => 12,
    'default_font' => 'dejavusans',
]);

$mpdf->SetTitle('My Document');
$mpdf->SetAuthor('Jane Doe');

TCPDF-Next(遷移後):

php
use YeeeFang\TcpdfNext\Document\PdfDocument;
use YeeeFang\TcpdfNext\Document\PageFormat;
use YeeeFang\TcpdfNext\Document\Margins;
use YeeeFang\TcpdfNext\Html\HtmlRenderer;

$pdf = PdfDocument::create()
    ->setPageFormat(PageFormat::A4)
    ->setMargins(new Margins(left: 15, right: 15, top: 16, bottom: 16))
    ->setTitle('My Document')
    ->setAuthor('Jane Doe')
    ->build();

$renderer = new HtmlRenderer($pdf);
$renderer->setDefaultFont('DejaVuSans', size: 12);

步驟 3:替換 HTML 寫入

mPDF(遷移前):

php
$mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
$mpdf->WriteHTML($htmlBody, \Mpdf\HTMLParserMode::HTML_BODY);

TCPDF-Next(遷移後):

php
$renderer = new HtmlRenderer($pdf);
$renderer->addStylesheet($stylesheet);
$renderer->writeHtml($htmlBody);

步驟 4:替換頁首頁尾

mPDF(遷移前):

php
$mpdf->SetHTMLHeader('<div style="text-align: center;">公司名稱</div>');
$mpdf->SetHTMLFooter('<div style="text-align: center;">第 {PAGENO} 頁,共 {nbpg} 頁</div>');

TCPDF-Next(遷移後):

php
$pdf->setHtmlHeader('<div style="text-align: center;">公司名稱</div>');
$pdf->setHtmlFooter('<div style="text-align: center;">第 {{pageNumber}} 頁,共 {{totalPages}} 頁</div>');

// 或使用回呼方式(更靈活)
$pdf->onPageFooter(function (Page $page, int $pageNumber, int $totalPages) {
    $page->addText("第 {$pageNumber} 頁,共 {$totalPages} 頁")
        ->setPosition(105, 287)
        ->setFont('Helvetica', size: 9)
        ->setAlignment(Alignment::CENTER);
});

步驟 5:替換浮水印

mPDF(遷移前):

php
$mpdf->SetWatermarkText('DRAFT', 0.1);
$mpdf->showWatermarkText = true;

TCPDF-Next(遷移後):

php
use YeeeFang\TcpdfNext\Document\Watermark;

$pdf->setWatermark(
    Watermark::text('DRAFT')
        ->setOpacity(0.1)
        ->setRotation(45)
        ->setFont('Helvetica', size: 72)
        ->setColor(Color::rgb(200, 200, 200))
);

步驟 6:替換 CJK 與 RTL 文字

mPDF(遷移前):

php
$mpdf = new \Mpdf\Mpdf(['mode' => '+aCJK', 'autoScriptToLang' => true, 'autoLangToFont' => true]);
$mpdf->SetDirectionality('rtl');

TCPDF-Next(遷移後):

php
// CJK 支援(註冊 CJK 字型)
$pdf->getFontManager()->registerFont('/path/to/NotoSansCJK-Regular.ttc', 'NotoSansCJK');
$renderer->setAutoFontDetection(true); // 依腳本自動選取字型

// RTL(透過 Unicode BiDi 演算法自動處理)
$renderer->writeHtml('<div dir="rtl">مرحبا بالعالم</div>');

步驟 7:替換輸出

mPDF(遷移前):

php
$mpdf->Output('/path/to/file.pdf', \Mpdf\Output\Destination::FILE);
$mpdf->Output('doc.pdf', \Mpdf\Output\Destination::DOWNLOAD);
$content = $mpdf->Output('', \Mpdf\Output\Destination::STRING_RETURN);

TCPDF-Next(遷移後):

php
$pdf->save('/path/to/file.pdf');   // 儲存至檔案
$bytes = $pdf->toString();          // 以字串回傳

// 下載(Web 框架)
return response($pdf->toString(), 200, [
    'Content-Type' => 'application/pdf',
    'Content-Disposition' => 'attachment; filename="doc.pdf"',
]);

mPDF 自訂標籤對應

mPDF 支援非標準 HTML 的自訂標籤,需要進行適配:

mPDF 自訂標籤TCPDF-Next 對應
<tocpagebreak>$pdf->addTableOfContentsPage()
<tocentry>$toc->addEntry(...)
<barcode>$page->addBarcode(...)
<columnbreak>$renderer->columnBreak()
<pagebreak>標準 <div style="page-break-before: always">
<bookmark>$pdf->addBookmark(...)
<watermarktext>$pdf->setWatermark(Watermark::text(...))
<watermarkimage>$pdf->setWatermark(Watermark::image(...))

相依套件精簡

從 mPDF 遷移至 TCPDF-Next 可大幅精簡相依樹:

移除的 mPDF 相依套件:

  • mpdf/mpdf + 10 多個傳遞套件
  • psr/logpsr/http-messagesetasign/fpdimpdf/qrcode

新增的 TCPDF-Next 相依套件:

  • yeee-fang/tcpdf-next(零執行期相依)

延伸閱讀

以 LGPL-3.0-or-later 授權釋出。