Lewati ke konten
getnextpdf.com

Pro edisi

Writer — Referensi Mendalam

Modul Writer menulis revisi incremental-update PDF dan mengemas objek-objek kecil ke dalam Object Stream. Incremental writer menegakkan aturan append-only yang fail-closed: setiap byte yang dimiliki buffer sebelum sebuah revisi harus tetap tidak berubah setelahnya. Pembangun Object Stream mengelompokkan objek-objek yang memenuhi syarat ke dalam satu objek /Type /ObjStm terkompresi FlateDecode di bawah batas ukuran tertentu.

Kapabilitas ini hadir dalam NextPDF Pro (nextpdf/pro) dan aktif dengan envelope lisensi tingkat Pro. Deployment tanpa entitlement tersebut tidak memuat kelas-kelas kapabilitas ini. Bandingkan edisi dan dapatkan lisensi. Tidak ada flag lisensi per-fitur; kodenya hadir bersama edisi Pro.

Modul ini berada di bawah namespace NextPDF\Pro\Writer. Semua simbol publik tercantum di bawah ini. Value object adalah kelas final readonly yang immutable.

SimbolParameterPerilaku defaultMengembalikanMelempar atau gagal denganCatatan
IncrementalUpdateWriter::writeRevisionBinaryBuffer $buffer, ObjectRegistry $registry, int $prevXrefOffset, int $catalogObject, array $catalogEntries, array $catalogUpdates, array $newObjectNumbers, string $fileIdStatis. Menulis ulang katalog dengan entri yang digabung, menambahkan tabel referensi-silang tradisional untuk objek baru dan yang dimodifikasi, dan menulis trailer dengan /Size, /Root, /Prev, dan /ID. Memverifikasi bahwa prefiks pra-revisi byte-equal setelahnya.int — offset byte tabel referensi-silang baru\NextPDF\Exception\WriterException ketika pemeriksaan prefiks append-only gagal; getWriterState() mengembalikan dss-append-only-invariantTitik masuk statis. Tidak ada keluaran yang dapat digunakan pada pelanggaran.
ObjectStreamWriter::addObjectint $objectNumber, string $contentMenambahkan satu objek ke stream tertunda setelah pemeriksaan ukuran.voidOverflowException ketika gabungan indeks ditambah body akan melampaui 65.536 byte$content tidak menyertakan pembungkus N 0 obj / endobj.
ObjectStreamWriter::canAcceptstring $contentMengestimasi overhead indeks dan menguji total berjalan terhadap maksimum.boolTidak melemparPredikat murni; tanpa perubahan state.
ObjectStreamWriter::buildtidak adaMembangun indeks, menggabungkan body, mengompresi dengan FlateDecode, dan membungkus dictionary /Type /ObjStm.string — konten Object Stream mentahObjectStreamWriteException ketika tidak ada objek yang ditambahkan, atau pada kegagalan kompresi zlibPemanggil menetapkan nomor objek dan membungkus markernya.
ObjectStreamWriter::getEntriestidak adaMenghitung ulang offset relatif-body untuk objek yang terakumulasi.list<ObjectStreamEntry>Tidak melemparOffset bersifat relatif terhadap seksi body.
ObjectStreamWriter::counttidak adaMelaporkan jumlah objek yang terakumulasi.intTidak melempar
ObjStmCompressor::__constructint $maxStreamSize = 65536, int $maxObjectsPerStream = 200Menyimpan batas ukuran dan jumlah-objek yang digunakan untuk pengelompokan.Tidak melemparNilai default sesuai dengan penyetelan Object Stream modul.
ObjStmCompressor::groupObjectslist<array{number: int, generation?: int, content: string}> $objectsMemfilter objek yang tidak memenuhi syarat, lalu mengemas sisanya ke dalam writer dalam batas ukuran dan jumlah.list<ObjectStreamWriter>Tidak melempar; objek yang tidak memenuhi syarat dilewatiObjek dengan generation bukan-nol jatuh ke serialisasi normal.
ObjStmCompressor::isEligiblestring $content, int $generation = 0Menolak objek stream, /Encrypt, /XRef, /Catalog, dan setiap generation bukan-nol.boolTidak melemparPencocokan /Type toleran terhadap whitespace dan escape #xx.
ObjStmCompressor::writeToBufferlist<ObjectStreamWriter> $streams, BinaryBuffer $buffer, ObjectRegistry $registryMengalokasikan satu objek carrier per stream, mendaftarkan entri terkompresi type-2, dan menulis setiap blok ObjStm.list<int> — nomor objek carrierMeneruskan ObjectStreamWriteException dari build() pada kegagalan kompresi yang jarangJalankan setelah objek non-eligible ditulis dan sebelum referensi-silang dipancarkan.
ObjStmCompressor::estimateSavingslist<ObjectStreamWriter> $streams, int $originalSizeMembangun setiap stream untuk mengukur ukuran terkompresi terhadap aslinya.ObjStmCompressionResultMeneruskan ObjectStreamWriteException dari build() pada kegagalan kompresi yang jarangHelper pengukuran read-only.
ObjectStreamEntry::__constructint $objectNumber, string $content, int $offsetRekaman immutable dari satu objek yang dikemas dan offset body-nya.Tidak melemparfinal readonly; properti publik.
ObjStmCompressionResult::__constructint $originalObjectCount, int $streamCount, int $estimatedOriginalSize, int $estimatedCompressedSizeKontainer metrik immutable.Tidak melemparfinal readonly; properti publik.
ObjStmCompressionResult::savedBytestidak adaMengembalikan ukuran asli dikurangi ukuran terkompresi.intTidak melemparDapat bernilai negatif ketika pengemasan memperbesar data.
ObjStmCompressionResult::savedPercenttidak adaMengembalikan persentase pengurangan.floatTidak melemparMengembalikan 0.0 ketika ukuran asli adalah nol.
ObjStmCompressionResult::compressionRatiotidak adaMengembalikan ukuran terkompresi dibagi aslinya.floatTidak melemparMengembalikan 1.0 ketika ukuran asli adalah nol.
ObjectStreamWriteExceptionMenandakan kegagalan build Object Stream.Memperluas RuntimeExceptionDilempar oleh build(); dapat ditangkap via RuntimeException untuk kompatibilitas mundur.
final class IncrementalUpdateWriter
{
public static function writeRevision(
BinaryBuffer $buffer,
ObjectRegistry $registry,
int $prevXrefOffset,
int $catalogObject,
array $catalogEntries,
array $catalogUpdates,
array $newObjectNumbers,
string $fileId,
): int;
}
final class ObjectStreamWriter
{
public function addObject(int $objectNumber, string $content): void;
public function canAccept(string $content): bool;
public function build(): string;
/** @return list<ObjectStreamEntry> */
public function getEntries(): array;
public function count(): int;
}
final class ObjStmCompressor
{
public function __construct(
int $maxStreamSize = 65536,
int $maxObjectsPerStream = 200,
);
/**
* @param list<array{number: int, generation?: int, content: string}> $objects
* @return list<ObjectStreamWriter>
*/
public function groupObjects(array $objects): array;
public function isEligible(string $content, int $generation = 0): bool;
/**
* @param list<ObjectStreamWriter> $streams
* @return list<int>
*/
public function writeToBuffer(array $streams, BinaryBuffer $buffer, ObjectRegistry $registry): array;
/** @param list<ObjectStreamWriter> $streams */
public function estimateSavings(array $streams, int $originalSize): ObjStmCompressionResult;
}

writeRevision menulis satu revisi incremental-update. Ia mengambil snapshot prefiks buffer yang ada sebelum menulis. Ia menulis ulang katalog dengan entri yang digabung, mendaftarkan offset objek baru, menulis tabel referensi-silang tradisional yang dikelompokkan menjadi subseksi kontigu, dan menulis trailer dengan /Size, /Root, /Prev, dan /ID. Setelah menulis, ia membandingkan prefiks kembali. Jika ada byte sebelumnya yang berubah, ia memunculkan WriterException yang membawa state pelanggaran-append-only dan tidak mengembalikan keluaran yang dapat digunakan. Pada keberhasilan, ia mengembalikan offset byte tabel referensi-silang baru untuk merangkai revisi selanjutnya. Mencampur tabel referensi-silang dan stream lintas revisi diperbolehkan.

ObjectStreamWriter mengakumulasi objek. addObject memunculkan galat overflow ketika gabungan indeks dan body akan melampaui maksimum 65.536 byte tak-terkompresi. build memunculkan galat pada stream kosong; jika tidak, ia mengompresi indeks ditambah body dan mengembalikan konten Object Stream dengan entri /Type /ObjStm, /N, /First, /Length, dan /Filter /FlateDecode. Pemanggil menetapkan nomor objek dan membungkus marker N 0 obj / endobj.

ObjStmCompressor memutuskan objek mana yang dikemas. Ia mengecualikan objek stream, dictionary enkripsi, stream referensi-silang, katalog dokumen, dan setiap objek dengan nomor generation bukan-nol. writeToBuffer mengalokasikan satu objek carrier per stream, mendaftarkan setiap objek yang dikemas sebagai entri referensi-silang terkompresi type-2, dan menulis blok ObjStm pada offset buffer saat ini. estimateSavings membangun setiap stream untuk menghitung metrik ukuran tanpa memutasi buffer.

  • Pemeriksaan append-only menyalin prefiks yang ada. Biayanya bertambah seiring ukuran dokumen yang sudah ditulis. Biaya ini disengaja dan melindungi byte yang ditandatangani.
  • Batas Object Stream berlaku pada indeks tak-terkompresi ditambah body. Tempatkan dictionary enkripsi dan tipe objek yang dikecualikan lainnya sebagai objek tak-langsung yang langsung.
  • Pengecualian /Type toleran terhadap whitespace antar-token yang sembarang dan escape heksa #xx. Bentuk seperti /Type /Encrypt, /Type\n/Encrypt, dan /Type /#45ncrypt semuanya ditolak, bukan hanya ejaan literal kanonik.
  • Setiap objek yang membawa nomor generation bukan-nol diperlakukan sebagai tidak memenuhi syarat dan jatuh ke serialisasi N G obj … endobj normal, karena generation objek terkompresi secara implisit adalah nol.
  • writeToBuffer harus berjalan setelah semua objek non-eligible ditulis dan sebelum referensi-silang dipancarkan. Objek yang dikemas tidak boleh juga diserialisasi secara terpisah.

Modul Writer tidak melakukan operasi kriptografis. Ia melindungi byte yang ditandatangani dengan menolak memancarkan ketika sebuah byte sebelumnya akan berubah, yang merupakan uji byte-equality alih-alih uji kriptografis. Pemilihan algoritma FIPS untuk penandatanganan dan hashing diatur oleh modul penandatanganan, bukan oleh writer ini. Mengaktifkan atau menonaktifkan mode FIPS tidak mengubah perilaku metode Writer mana pun.

NextPDF mengimplementasikan modul ini terhadap ISO 32000-2:2020. Incremental writer mengikuti tata bahasa incremental-update §7.5.6: setiap revisi menambahkan seksi referensi-silang yang mencakup hanya objek baru, yang diubah, atau yang dihapus, dan sebuah trailer yang entri /Prev-nya memberikan offset referensi-silang sebelumnya. Pembangun Object Stream mengikuti model object-stream §7.5.7: sebuah indeks berisi pasangan nomor-objek dan offset, dengan offset diukur dari entri /First dalam urutan menaik, mendahului body objek yang dikemas. Kedua rujukan klausa diverifikasi terhadap korpus ISO 32000-2:2020. Perangkaian revisi untuk alur kerja PAdES B-LT dan B-LTA mengikuti ETSI EN 319 142-1 §5.4, sebagaimana dianotasi dalam sumbernya. Dukungan atas suatu klausa adalah pernyataan kapabilitas rekayasa, bukan sertifikasi; NextPDF tidak memegang sertifikasi kesesuaian formal.

  • Pasang paket dengan composer require nextpdf/pro:^3. Kelas-kelasnya teresolusi di bawah NextPDF\Pro\Writer.
  • IncrementalUpdateWriter::writeRevision adalah titik masuk statis; ia tidak menyimpan state instance antar revisi.
  • ObjectStreamEntry, ObjStmCompressionResult, IncrementalUpdateWriter, dan compressor bersama-sama membentuk permukaan publik modul; repositori tidak menyertakan contoh yang dapat dijalankan untuknya.
  • Sebuah WriterException dari writeRevision menandakan pelanggaran append-only. Perlakukan sebagai kegagalan keras dan buang buffer.
  • Carrier Object Stream adalah objek tak-langsung; pemanggil menetapkan nomor objeknya melalui registry.

Halaman ini hanya mendokumentasikan perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Path namespace internal, kelas helper, tabel mekanisme, nama file runbook, dan prefiks tiket berada di luar cakupan.