Kontrak hasil pindaian terdiri dari beberapa ratus titik per inci tinta hitam di atas kertas putih. Disimpan sebagai bitmap satu bit per piksel, ukurannya sudah kecil, namun seratus halaman seperti itu masih akan membuat ukuran PDF membengkak melebihi batas wajar untuk dikirim melalui email. Filter yang tepat dapat mengubah perhitungan tersebut. JBIG2 adalah kompresi dengan rasio tertinggi yang ditentukan oleh ISO 32000-1 untuk gambar dwitingkat, dan pada tumpukan teks pindaian, kompresi ini secara rutin mampu mengurangi separuh dari ukuran yang dihasilkan oleh CCITT Group 4. Ini adalah filter yang harus dipilih ketika input berupa faks, pindaian, atau gambar yang direduksi menjadi dua warna, dan HotPDF dapat menuliskannya secara langsung ke dalam PDF
Format ini mencapai rasio tersebut melalui dua gagasan yang tidak dimiliki oleh kodek gambar generik. JBIG2 memodelkan bagaimana deretan piksel hitam ditempatkan pada latar belakang putih, dan mengenali bahwa pindaian halaman sebagian besar merupakan beberapa ratus bentuk glif yang sama dan diulang ribuan kali. Memahami kedua hal ini adalah kunci untuk memungkinkan Anda memilih opsi enkripsi secara sengaja, bukan sekadar menebak
Posisi JBIG2 dalam spesifikasi PDF
ISO 32000-1 mencantumkan JBIG2Decode di antara filter aliran pada §7.4.7, yang tersedia dari PDF 1.4 dan seterusnya. Filter ini hanya berlaku untuk satu tempat: gambar XObject yang nilai /BitsPerComponent-nya adalah 1 dan ruang warnanya bermuara pada satu saluran. Itulah inti utamanya. JBIG2 adalah kodek dwitingkat, sehingga tidak akan pernah bersaing dengan DCT atau JPXDecode pada gambar foto. JBIG2 bersaing dengan CCITTFaxDecode, yaitu filter faks Group 3 dan Group 4, pada jenis halaman dua warna persis seperti yang dihasilkan oleh pemindai dokumen
Dekoder mengonsumsi struktur JBIG2 yang disebut oleh standar sebagai profil PDF, di mana setiap aliran gambar menampung serangkaian segmen alih-alih aliran bit mentah. Aliran /JBIG2Globals opsional membawa segmen yang dibagikan ke beberapa gambar dalam dokumen yang sama, yang merupakan mekanisme untuk memungkinkan konten yang berulang disimpan satu kali untuk keseluruhan berkas dan bukan satu kali per halaman. Secara baku, HotPDF memancarkan aliran per gambar dan membiarkan saluran global tetap bebas kecuali jika backend memintanya
Arsitektur enkoder yang mengutamakan backend
Enkoder JBIG2 yang lengkap adalah perangkat lunak berukuran besar, dan bagian-bagiannya yang paling agresif secara historis terhambat oleh paten serta didistribusikan dengan lisensi yang tidak cocok untuk setiap produk. HotPDF menyelesaikan ketegangan tersebut dengan memisahkan antarmuka dari mesinnya. Unit HPDFJBIG2 mendefinisikan pemanggilan yang dilakukan oleh sisa pustaka, dan menyertakan mesin bawaan yang sederhana sehingga JBIG2 dapat langsung berfungsi. Saat Anda membutuhkan rasio setara produksi, Anda dapat mendaftarkan mesin yang lebih kuat dan pustaka akan mendelegasikannya tanpa mengubah kode pemanggilan Anda
Peralihan ini berupa panggilan pendaftaran tunggal. Jika tidak ada backend yang terdaftar, enkoder akan menggunakan jalur bawaannya. Daftarkan sebuah backend dan setiap enkripsi berikutnya akan berjalan melaluinya
uses
HPDFJBIG2;
// Query what is active, then optionally install a stronger engine.
if not IsJBIG2EncoderBackendAvailable then
// Production backend not present: HotPDF uses its built-in MMR path.
RegisterJBIG2EncoderBackend(MyVendorJBIG2Encode);
// Later, to return to the built-in behaviour:
// ClearJBIG2Backends;
Kait yang sama juga tersedia untuk dekoding melalui RegisterJBIG2DecoderBackend, dengan IsJBIG2DecoderBackendAvailable untuk memeriksanya. Inilah alasan mengapa sebuah pustaka menyertakan jalur bawaan kecil yang dipadukan dengan celah backend daripada menggunakan satu enkoder monolitik. Jalur bawaan menjaga agar biner tetap ramping dan terbebas dari masalah lisensi, sementara celah tersebut memungkinkan tim yang telah melisensikan enkoder penuh untuk menyambungkannya tanpa menyentuh lapisan penulisan PDF sama sekali
Kompromi yang sebenarnya dari opsi enkripsi
Enkripsi dikonfigurasi melalui TJBIG2EncodeOptions, yaitu sebuah rekaman dengan bidang Lossless, UseGlobalSegments, UseSymbolDictionary, dan LossyLevel. Pembungkus yang ramah komponen, THPDFJBIG2Options, memublikasikan Lossless, UseSymbolDictionary, dan LossyLevel sehingga ketiganya dapat diatur melalui Object Inspector, dan akan diubah menjadi rekaman secara internal. Tiga tujuan mendasari pengaturan ini
Rekonstruksi nirkurang (lossless) mempertahankan setiap piksel. Atur Lossless ke True dan biarkan LossyLevel di angka nol, maka bitmap yang didekode akan identik bit demi bit dengan input aslinya. Ini adalah satu-satunya pilihan yang aman untuk gambar garis, gambar teknis, serta halaman apa pun di mana kehilangan piksel dapat mengubah maknanya, seperti tanda tangan atau stempel. Pengodean kamus simbol mengaktifkan deduplikasi sadar teks dan merupakan opsi yang memisahkan JBIG2 dari filter faks. Tingkat kerugian, yang berupa bilangan bulat dari 0 hingga 9, memungkinkan backend yang mumpuni untuk menukar fidelitas dengan ukuran dengan memperlakukan tanda yang hampir identik sebagai simbol yang sama. Angka nol berarti nirkurang. Enkoder bawaan hanya mematuhi jalur nirkurang dan mengabaikan tingkat kerugian apa pun yang bukan nol, sehingga tingkat yang lebih tinggi baru berlaku setelah backend yang mengimplementasikannya terdaftar
var
Options: TJBIG2EncodeOptions;
begin
Options := DefaultJBIG2EncodeOptions; // Lossless True, symbol dictionary on
Options.Lossless := True;
Options.LossyLevel := 0; // 0 keeps every pixel
Options.UseSymbolDictionary := True; // dedupe repeated glyphs
// Pass Options to a backend, or let THPDFJBIG2Options carry them.
end;
Kamus simbol dan alasan pindaian teks lebih unggul
Satu halaman pindaian teks sebenarnya bukanlah sebuah gambar berisi kata-kata. Halaman tersebut adalah huruf e yang sama yang dicetak beberapa ratus kali, t yang sama, koma yang sama, di mana setiap contohnya adalah salinan yang sedikit bising dari satu bentuk dasar. Kamus simbol menangkap struktur tersebut. Enkoder mengumpulkan tanda yang berbeda di halaman tersebut ke dalam kamus, menyimpan setiap bentuk satu kali, dan kemudian merekam halaman tersebut sebagai daftar posisi yang merujuk pada entri kamus. Seribu kemunculan glif yang sama hanya memerlukan biaya satu bitmap tersimpan ditambah seribu penempatan yang murah
Di sinilah JBIG2 mengungguli CCITT Group 4. Group 4 mengodekan setiap garis pindaian terhadap garis di atasnya tanpa konsep glif, sehingga ia akan membayar biaya penuh untuk setiap huruf setiap kali huruf tersebut muncul. JBIG2 hanya membayar satu kali. Jika kamus yang sama dipromosikan ke aliran global tingkat dokumen, penghematan ini akan berlipat ganda di seluruh pindaian multihalaman, karena bentuk-bentuk yang dibagikan berulang kali oleh setiap halaman disimpan cukup satu kali untuk keseluruhan berkas. Pada teks yang padat, perbedaannya bukanlah sesuatu yang marginal. Ini adalah alasan mengapa JBIG2 hadir
Region generik dan MMR untuk yang lainnya
Tidak setiap gambar dwitingkat adalah teks. Peta, skema, gambar teknis, serta halaman campuran memiliki gambar garis yang tidak dapat diringkas oleh kamus mana pun. Untuk kasus tersebut, JBIG2 mengodekan region generik, yaitu kotak berisi piksel yang dikompresi langsung tanpa pelatihan simbol apa pun. Standar ini memungkinkan region generik untuk menggunakan MMR, yaitu pengodean baca yang dimodifikasi (modified modified READ) yang sudah digunakan oleh faks Group 4, yang memodelkan setiap baris piksel terhadap baris di atasnya
Ini adalah jalur yang disertakan HotPDF pada enkoder bawaannya. Apabila tidak ada backend yang terdaftar dan permintaannya adalah nirkurang, pustaka akan mengompres bitmap sebagai region generik MMR tunggal lalu membungkusnya dalam struktur segmen JBIG2 yang disyaratkan oleh profil PDF. Jalur ini tidak memerlukan kamus, tanpa tahap pelatihan, serta tanpa gambar kedua untuk dirujuk, sehingga jalur ini menjadi bawaan yang dapat diandalkan untuk gambar garis dan konten dwitingkat campuran. Jalur ini memang tidak akan menandingi enkoder kamus simbol penuh pada teks murni, tetapi ia selalu tepat, selalu nirkurang, dan selalu tersedia. Permukaan enkoder untuk jalur ini berbentuk satu panggilan
var
Encoder: THPDFJBIG2Encoder;
ImageData: TJBIG2ByteArray;
Scanlines: TJBIG2ScanlineArray; // one byte array per row, MSB-first
W, H: Integer;
begin
// Scanlines, W and H describe a 1-bit page; each row is (W + 7) div 8 bytes.
Encoder := THPDFJBIG2Encoder.Create;
try
if Encoder.EncodeToByteArray(Scanlines, W, H, ImageData) then
// ImageData now holds a JBIG2 stream ready for a /JBIG2Decode XObject.
;
finally
Encoder.Free;
end;
end;
Mengaktifkannya saat Anda menyusun dokumen
Untuk penggunaan sehari-hari, Anda tidak perlu menyentuh kelas enkoder secara langsung. HotPDF mengekspos JBIG2 sebagai pilihan kompresi gambar pada dokumen. Enumerasi THPDFImageCompressionType menyertakan icJBIG2 berdampingan dengan opsi Flate, JPEG, dan CCITT, serta dokumen membawa properti JBIG2Options bertipe THPDFJBIG2Options yang menampung pengaturan saat kompresi tersebut dipilih. Konfigurasikan keduanya sebelum Anda menambahkan gambar dwitingkat yang ingin Anda kompresi menggunakan cara ini
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.ImageCompressionType := icJBIG2; // route 1-bit images through JBIG2
Pdf.JBIG2Options.Lossless := True; // keep every pixel
Pdf.JBIG2Options.UseSymbolDictionary := True;
Pdf.JBIG2Options.LossyLevel := 0;
// Add pages and place your scanned 1-bit images here.
finally
Pdf.Free;
end;
end;
Salah satu kenyamanan yang patut dicatat adalah pengaya DBGridHotPDFExport, yang merender TDBGrid langsung menjadi sebuah PDF. Output-nya sebagian besar adalah garis aturan dwitingkat serta teks, sehingga dokumen yang dikonfigurasi untuk JBIG2 menjaga ekspor tersebut tetap ringkas tanpa penanganan ekstra apa pun dari Anda. Dua topik terkait di blog ini membahas lebih dalam tentang alur kerja di sekitarnya. Untuk mengetahui cara gambar dan fon diletakkan saat Anda membangun laporan, lihat output laporan dengan fon dan gambar di Delphi. Saat dokumen yang terkompresi harus memenuhi profil kearsipan, aturan pada validasi PDF/A, PDF/X, dan PDF/UA di Delphi memberi tahu Anda filter mana yang diterima oleh tingkat kesesuaian tertentu. JBIG2 hadir sebagai bagian dari Komponen HotPDF untuk Delphi dan C++Builder, di samping pemuatan, penyuntingan, serta API enkripsi yang dibahas di bagian lain pada blog ini