Migrasi dari mPDF
Panduan ini membantu Anda melakukan migrasi dari mPDF (mpdf/mpdf) ke TCPDF-Next. mPDF adalah library HTML-ke-PDF dengan dukungan CSS yang luas dan fitur seperti teks CJK, barcode, dan watermark. TCPDF-Next menawarkan superset dari kemampuan mPDF dengan kepatuhan standar modern dan nol dependensi runtime.
Perbandingan Fitur
| Fitur | mPDF | TCPDF-Next |
|---|---|---|
| Versi PHP | 7.4+ | 8.5+ |
| Versi PDF | PDF 1.4 / 1.7 | PDF 2.0 |
| Arsitektur | Berpusat pada HTML/CSS | PDF-native dengan dukungan HTML |
| Dependensi runtime | 10+ paket Composer | Nol |
| Enkripsi | RC4, AES-128, AES-256 | AES-256 saja (PDF 2.0) |
| Tanda tangan digital | Tidak didukung | PAdES B-B hingga B-LTA |
| PDF/A | PDF/A-1b, PDF/A-3b (parsial) | PDF/A-4 (ISO 19005-4 penuh) |
| Tagged PDF | Terbatas | Aksesibilitas PDF/UA penuh |
| Dukungan CJK | Ya (bundel font 50+ MB) | Ya (daftarkan sendiri, subsetting optimal) |
| RTL / BiDi | Ya | Ya (sesuai UAX #9) |
| Barcode | Ya (1D dan 2D) | Ya (vektor native, set diperluas) |
| Watermark | Ya | Ya |
| Pembuatan TOC | Ya | Ya |
| Penggunaan memori | Tinggi (DOM penuh di memori) | Sedang (streaming output) |
Fitur Spesifik mPDF dan Padanan TCPDF-Next
Tag HTML Kustom
mPDF mendefinisikan tag HTML non-standar. Tag-tag ini memerlukan adaptasi:
| Tag Kustom mPDF | Padanan TCPDF-Next |
|---|---|
<tocpagebreak> | $pdf->addTableOfContentsPage() |
<tocentry content="..." level="0"> | $toc->addEntry('...', level: 0) |
<barcode code="..." type="C128"> | $page->addBarcode(BarcodeFactory::code128('...')) |
<columnbreak> | $renderer->columnBreak() |
<pagebreak> | <div style="page-break-before: always"> (CSS standar) |
<bookmark content="..."> | $pdf->addBookmark('...') |
<watermarktext content="DRAFT"> | $pdf->setWatermark(Watermark::text('DRAFT')) |
<watermarkimage src="..."> | $pdf->setWatermark(Watermark::image('...')) |
Header dan Footer HTML
mPDF (sebelum):
php
$mpdf->SetHTMLHeader('<div style="text-align: center;">Header</div>');
$mpdf->SetHTMLFooter('<div>Page {PAGENO} of {nbpg}</div>');
$mpdf->SetHTMLHeader('<div>Even header</div>', 'E');TCPDF-Next (sesudah):
php
$pdf->setHtmlHeader('<div style="text-align: center;">Header</div>');
$pdf->setHtmlFooter('<div>Page {{pageNumber}} of {{totalPages}}</div>');
$pdf->setHtmlHeader('<div>Even header</div>', pages: 'even');Mode WriteHTML
mPDF (sebelum):
php
$mpdf->WriteHTML($css, \Mpdf\HTMLParserMode::HEADER_CSS);
$mpdf->WriteHTML($body, \Mpdf\HTMLParserMode::HTML_BODY);TCPDF-Next (sesudah):
php
$renderer = new HtmlRenderer($pdf);
$renderer->addStylesheet($css);
$renderer->writeHtml($body);Watermark
mPDF (sebelum):
php
$mpdf->SetWatermarkText('DRAFT', 0.1);
$mpdf->showWatermarkText = true;TCPDF-Next (sesudah):
php
$pdf->setWatermark(
Watermark::text('DRAFT')
->setOpacity(0.1)
->setRotation(45)
->setColor(Color::rgb(200, 200, 200))
);Pemetaan Konfigurasi
| Konfigurasi mPDF | Padanan TCPDF-Next |
|---|---|
mode => 'utf-8' | Selalu UTF-8 (tidak perlu konfigurasi) |
format => 'A4' | setPageFormat(PageFormat::A4) |
margin_left/right/top/bottom | setMargins(new Margins(...)) |
default_font | $renderer->setDefaultFont(...) |
tempDir | PdfDocument::create()->setTempDir(...) |
autoScriptToLang | $renderer->setAutoFontDetection(true) |
biDirectional | Selalu aktif (UAX #9) |
pdfaAuto | setPdfALevel(PdfALevel::PDF_A_4) |
Method Output
mPDF (sebelum):
php
$mpdf->Output('/path/to/file.pdf', \Mpdf\Output\Destination::FILE);
$mpdf->Output('doc.pdf', \Mpdf\Output\Destination::DOWNLOAD);
$mpdf->Output('doc.pdf', \Mpdf\Output\Destination::INLINE);
$content = $mpdf->Output('', \Mpdf\Output\Destination::STRING_RETURN);TCPDF-Next (sesudah):
php
$pdf->save('/path/to/file.pdf');
$bytes = $pdf->toString();
// Respons web (contoh Laravel)
return response($pdf->toString(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="doc.pdf"',
]);Pengurangan Dependensi
Migrasi dari mPDF menyederhanakan dependency tree Anda secara drastis:
Dihapus (mPDF + transitif):
mpdf/mpdf+ 10+ paket transitifpsr/log,psr/http-message,setasign/fpdi,mpdf/qrcode
Ditambahkan:
yeee-fang/tcpdf-next(nol dependensi runtime)
Perbandingan Performa
| Metrik | mPDF | TCPDF-Next | Peningkatan |
|---|---|---|---|
| PDF sederhana 1 halaman | 45,3 ms | 8,2 ms | 5,5x lebih cepat |
| Dokumen 100 halaman | 3.210 ms | 845 ms | 3,8x lebih cepat |
| Puncak memori (1 halaman) | 18,4 MB | 4,2 MB | 4,4x lebih kecil |
| Puncak memori (100 halaman) | 198,2 MB | 28,6 MB | 6,9x lebih kecil |
| Ukuran file output (1 halaman) | 24,3 KB | 12,4 KB | 2,0x lebih kecil |
Lihat Benchmark Performa untuk metodologi lengkap dan kasus uji.
Bacaan Lanjutan
- Tabel Pemetaan API -- Pemetaan method komprehensif
- Benchmark -- Perbandingan performa lengkap dengan mPDF
- Referensi API -- Dokumentasi API TCPDF-Next lengkap
- FAQ -- Pertanyaan umum migrasi