Lewati ke konten
getnextpdf.com

stabilitas: Eksperimental

PageBackfill: buffer halaman dipertahankan

Preview opt-in. Buffer halaman dipertahankan default-mati. Dengan ia mati, writer adalah serializer streaming sebagaimana selama ini — byte-identik. Aktifkan hanya saat Anda benar-benar perlu menggambar pada halaman terdahulu, dan baca daftar fail-closed di bawah ini terlebih dahulu.

Secara default, writer melakukan streaming halaman dan mem-flush-nya secara berurutan; begitu sebuah halaman di-flush, ia tidak dapat digambari lagi. Buffer halaman dipertahankan adalah opt-in yang menahan halaman yang sudah di-flush sehingga sebuah halaman yang sudah di-flush dapat diisi-ulang — digambari pada halaman terdahulu — sebelum dokumen diserialisasi. Penggunaan klasiknya adalah total atau kotak ringkasan yang baru dapat Anda tempatkan setelah halaman berikutnya ditata.

Terminal window
composer require nextpdf/core:^3

Buffer halaman dipertahankan disertakan dalam paket core. Config::withRetainedPageBuffer() dan metode pengisian-ulang Document adalah @since 6.1.0. Default tetap writer streaming. ADR-037, yang sebelumnya menangguhkan kapabilitas ini, kini tercatat sebagai terimplementasi.

Config::withRetainedPageBuffer() memilihkan sebuah dokumen ke halaman dipertahankan. Begitu aktif, Document::setActiveBackfillPage(int $pageIndex) mengalihkan penggambaran ke halaman terdahulu yang sudah di-flush; Document::endPageBackfill() mengembalikan penggambaran ke posisi append normal. Konten yang Anda tulis di antara kedua panggilan itu mendarat pada halaman terdahulu. Buffer menahan halaman hingga save(), sehingga pengisian-ulang diterapkan sebelum tabel referensi-silang dan trailer ditulis (ISO 32000-2 §7.5).

Batasan fail-closed — kombinasi yang ditolak

Bagian berjudul “Batasan fail-closed — kombinasi yang ditolak”

Pengisian-ulang adalah operasi akses-acak, dan beberapa fitur dokumen mengasumsikan byte append-only yang di-streaming. Buffer halaman dipertahankan menolak digabung dengan salah satunya, terlepas dari urutan dan sebelum serialisasi, sehingga ia tidak pernah dapat diam-diam merusak tanda tangan atau klaim konformitas:

  • Sebuah tanda tangan digital.
  • PDF bertag (pohon struktur).
  • PDF/A.
  • Linearisasi.
  • Pengemasan object stream.
  • Enkripsi.
  • Mode rendering Safe CSS.

Anggaran byte-tak-terkompresi per-dokumen membatasi seberapa banyak yang boleh ditahan buffer; dokumen yang melampauinya gagal-keras alih-alih mengonsumsi memori tak-terbatas. Default streaming masih gagal secara fail-closed begitu pemanggil mencoba peralihan akses-acak tanpa opt-in — mengaktifkan buffer adalah satu-satunya cara mendapatkan pengisian-ulang, dan ia tidak kompatibel dengan fitur-fitur di atas secara konstruksi.

SimbolLokasiPeran
Config::withRetainedPageBuffer(bool $enabled = true): selfsrc/Core/Config.phpMemilihkan sebuah dokumen ke buffer halaman dipertahankan.
Document::setActiveBackfillPage(int $pageIndex): staticsrc/Core/Document.phpMengalihkan penggambaran ke halaman terdahulu yang sudah di-flush.
Document::endPageBackfill(): staticsrc/Core/Document.phpMengembalikan penggambaran ke posisi append normal.

Sebuah percobaan pengisian-ulang yang melanggar kombinasi yang ditolak memunculkan eksepsi konfigurasi bertipe pada batasnya, bukan dokumen yang rusak.

Cadangkan satu tempat pada halaman satu, isi sisa dokumen, lalu isi-ulang tempat yang dicadangkan dengan nilai yang dihitung di akhir.

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;
use NextPDF\Core\Document;
$config = (new Config())->withRetainedPageBuffer();
$doc = Document::createStandalone($config);
$doc->addPage(); // page 0 — leaves room for a grand total
$doc->writeHtml('<h1>Invoice</h1>');
$doc->addPage(); // page 1 — line items
$doc->writeHtml('<p>Line items…</p>');
$total = 1234.56; // computed after laying out the items
$doc->setActiveBackfillPage(0); // draw back onto page 0
$doc->writeHtml('<p>Grand total: ' . number_format($total, 2) . '</p>');
$doc->endPageBackfill();
$doc->save(__DIR__ . '/invoice.pdf');

Jaga buffer tetap mati untuk dokumen apa pun yang ditandatangani, bertag, PDF/A, ter-linearisasi, terenkripsi, atau object stream — itulah persis kombinasi yang ditolak buffer. Pilih satu jalur secara eksplisit.

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;
use NextPDF\Core\Document;
function renderReport(bool $needsBackfill, bool $mustBeSigned): Document
{
if ($needsBackfill && $mustBeSigned) {
// The buffer refuses to combine with signing. Resolve the requirement
// before building: pre-compute the value, or sign a separate pass.
throw new \LogicException('Back-fill and signing are mutually exclusive.');
}
$config = new Config();
if ($needsBackfill) {
$config = $config->withRetainedPageBuffer();
}
return Document::createStandalone($config);
}
  • Mati bersifat byte-identik. Dengan buffer mati, writer melakukan streaming seperti sebelumnya.
  • Saling eksklusif dengan penandatanganan, tagging, PDF/A, linearisasi, object stream, enkripsi, dan mode Safe CSS. Penolakan ini terlepas dari urutan dan terpicu sebelum serialisasi. Rencanakan dokumen untuk satu mode atau yang lain.
  • Anggaran byte gagal-keras. Buffer dipertahankan bersifat terbatas; dokumen yang melampaui anggaran byte-tak-terkompresi gagal alih-alih tumbuh tanpa batas.
  • Pasangkan panggilannya. Setiap setActiveBackfillPage() harus dipadankan dengan endPageBackfill() agar konten berikutnya di-append secara normal.
  • Default streaming menolak akses acak. Tanpa opt-in, peralihan akses-acak gagal secara fail-closed. Buffer adalah satu-satunya jalur yang didukung.

Buffer halaman dipertahankan menukar memori dengan kapabilitas pengisian-ulang: ia menahan halaman yang sudah di-flush hingga save(), dibatasi oleh anggaran byte-tak-terkompresi per-dokumen. Profil memori datar writer streaming hanya berlaku saat buffer mati. performance_budget (wall_ms: 1500, peak_mb: 128) mencerminkan langit-langit memori yang lebih tinggi pada jalur dipertahankan.

Buffer halaman dipertahankan tidak memperlebar permukaan masukan; ia mengubah kapan byte diserialisasi, bukan apa yang diingesti. Penolakannya untuk digabung dengan enkripsi dan penandatanganan adalah properti keselamatan: sebuah pengisian-ulang tidak akan pernah dapat mengubah byte yang ditandatangani atau terenkripsi setelah faktanya, karena keduanya tidak dapat diaktifkan bersama. Anggaran byte membatasi memori terhadap dokumen yang hostil.

PernyataanStandarKlausul
Writer menserialisasi body, struktur referensi-silang, dan trailer pada waktu save.ISO 32000-2§7.5

Ini adalah kapabilitas preview. NextPDF menolak buffer pengisian-ulang untuk dokumen yang ditandatangani, bertag, PDF/A, ter-linearisasi, terenkripsi, dan object stream, sehingga ia tidak membuat klaim konformitas untuk profil-profil itu melalui jalur ini. Tidak ada teks standar yang direproduksi.

Adapter kompatibilitas TCPDF mengekspos kapabilitas ini sebagai ekstensi konstruktor. Konstruksikan adapter dengan retainedPageBuffer: true, lalu sebuah panggilan setPage() atau lastPage() yang menargetkan halaman terdahulu mendelegasikan ke pengisian-ulang core alih-alih memunculkan UnsupportedFeatureException streaming. Argumen konstruktor ini adalah ekstensi NextPDF, bukan paritas TCPDF legacy — TCPDF legacy tidak memiliki flag semacam itu. Penolakan fail-closed yang sama berlaku. Lihat halaman retained-page-buffer adapter compat untuk detail sisi-adapter.