Skip to content

Performa

TCPDF-Next dirancang untuk pembuatan dokumen throughput tinggi. Halaman ini membahas optimasi built-in dan praktik terbaik untuk mendapatkan hasil maksimal dari library.

Siklus Hidup Worker

mermaid
graph TB
    Boot["Boot: DocumentFactory"] --> Lock["Lock Registry"]
    Lock --> Loop{"HTTP Request"}
    Loop --> Create["factory.create()"]
    Create --> Gen["Hasilkan PDF"]
    Gen --> Dispose["Dispose Document"]
    Dispose --> Loop

Lazy Initialization Sub-Engine

Class Document menyimpan referensi ke lebih dari 20 sub-engine (Graphics, Typography, Barcode, Forms, Layers, dll.), tetapi kebanyakan diinisialisasi secara lazy — hanya dibuat saat pertama kali diakses.

PDF teks sederhana tidak akan pernah membuat instance SVG parser, barcode engine, atau form field manager. Ini menjaga penggunaan memori proporsional dengan fitur yang sebenarnya Anda gunakan.

Font Subsetting

Secara default, TCPDF-Next hanya menyematkan glyph yang benar-benar digunakan dalam dokumen. FontSubsetter menganalisis semua konten teks dan menghapus glyph yang tidak digunakan dari font TrueType/OpenType sebelum menyematkan.

Ini dapat mengurangi data font dari beberapa megabyte menjadi beberapa kilobyte untuk dokumen yang menggunakan set karakter kecil.

php
use Yeeefang\TcpdfNext\Core\Document;

// Font subsetting aktif secara default — tidak ada yang perlu diaktifkan
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, 'Hanya glyph ini yang di-embed.');

Kompresi FlateDecode

Semua content stream dikompresi menggunakan zlib (FlateDecode). Ini diaktifkan secara default dan memerlukan extension PHP ext-zlib. Kompresi biasanya mengurangi ukuran file PDF sebesar 60-80%.

Streaming Output (PdfWriterChunked)

Untuk dokumen yang sangat besar, writer chunked men-flush data halaman yang sudah difinalisasi secara inkremental daripada menyimpan seluruh PDF di memori. Ini transparan — method save() dan output() yang sama berfungsi terlepas dari ukuran dokumen.

php
use Yeeefang\TcpdfNext\Core\Document;

// Streaming output untuk dokumen besar
$pdf = Document::create();
$pdf->addPage()->setFont('Helvetica', '', 10);

for ($i = 0; $i < 5000; $i++) {
    $pdf->cell(0, 5, "Baris {$i}: konten data di sini", newLine: true);
}

$pdf->save('large-document.pdf');
// Font subsetting dan kompresi FlateDecode terjadi secara otomatis

Cross-Reference Stream

TCPDF-Next menggunakan cross-reference stream (PDF 1.5+) sebagai pengganti tabel xref tradisional. Cross-reference stream sendiri dikompresi, menghasilkan ukuran file yang lebih kecil — terutama untuk dokumen dengan banyak objek.

Linearization (Tampilan Web Cepat)

Linearization mengatur ulang objek PDF sehingga halaman pertama bisa ditampilkan sebelum seluruh file didownload. Aktifkan untuk PDF yang disajikan melalui HTTP:

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->setLinearization(true)
    ->addPage()
    ->cell(0, 10, 'Rendering progresif di browser')
    ->save('web-optimized.pdf');

Linearizer menyisipkan hint stream yang memberi tahu viewer cara mengambil halaman sesuai permintaan.

Batas Halaman

Konstanta Document::MAX_PAGES default ke 10.000 halaman. Ini adalah pengaman terhadap loop tak terbatas selama pembuatan. Anda bisa meng-override-nya dengan meng-extend class jika use case Anda memerlukan lebih.

Praktik Terbaik

Gunakan Ulang Instance Font Lintas Halaman

Set font sekali dan biarkan berlaku lintas halaman. Hindari memanggil setFont() di setiap halaman kecuali font benar-benar berubah:

php
$pdf = Document::create()
    ->setFont('Helvetica', '', 10);

for ($i = 0; $i < 100; $i++) {
    $pdf->addPage()
        ->cell(0, 5, "Konten halaman {$i}");
}

Gunakan Template (XObject) untuk Konten Berulang

Jika setiap halaman memiliki header, footer, atau watermark yang sama, buat sekali sebagai template dan cap di setiap halaman. Ini menyimpan konten sebagai satu objek PDF yang direferensikan berkali-kali, bukan menduplikatnya.

Aktifkan Kompresi

Kompresi aktif secara default. Jangan nonaktifkan kecuali Anda perlu memeriksa raw PDF stream untuk debugging.

Gunakan Streaming Output untuk Dokumen Besar

Untuk dokumen yang melebihi beberapa ratus halaman, streaming output menjaga penggunaan memori tetap konstan terlepas dari jumlah halaman.

Subset Font

Font subsetting aktif secara default. Pastikan Anda tidak menonaktifkannya di produksi — full font embedding bisa menambah megabyte ke ukuran file.

Minimalkan Cakupan Transaksi

Transaksi menyimpan snapshot dokumen penuh. Jaga agar tetap singkat untuk menghindari penggandaan penggunaan memori. Lihat Transaksi untuk detail.

Ringkasan

FiturDefaultDampak
Font subsettingAktifFont lebih kecil (KB vs MB)
Kompresi FlateDecodeAktifStream 60-80% lebih kecil
Cross-reference streamAktifData xref lebih kecil
Lazy initializationAktifMemori proporsional dengan fitur yang digunakan
Streaming outputOtomatisMemori konstan untuk dokumen besar
LinearizationNonaktifAktifkan untuk PDF yang dikirim via web

Didistribusikan di bawah lisensi LGPL-3.0-or-later.