Taranmış bir sözleşme, beyaz kağıt üzerinde siyah mürekkebin inç başına birkaç yüz noktasından oluşur. Piksel başına bir bitlik bir bit eşlem olarak depolandığında zaten küçüktür, ancak yine de bu türden yüz sayfa, bir PDF'i e-postayla gönderebileceğiniz herhangi bir boyutun ötesine şişirir. Doğru filtre aritmetiği değiştirir. JBIG2, ISO 32000-1'in iki düzeyli görüntüler için tanımladığı en yüksek oranlı sıkıştırmadır ve taranmış bir metin yığını üzerinde, CCITT Grup 4'ün ürettiğini genellikle yarıya indirir. Girdi fakslandığında, tarandığında veya başka bir şekilde iki renge indirgendiğinde ulaşılması gereken filtre budur ve HotPDF bunu doğrudan bir PDF'ye yazabilir
Biçim bu oranı, genel bir görüntü kodecinin sahip olmadığı iki fikirle kazanır. Siyah koşuların beyaz bir arka plana nasıl oturduğunu modeller ve taranmış bir sayfanın çoğunlukla aynı birkaç yüz glif şeklinin binlerce kez tekrarlanmasından oluştuğunu fark eder. Her ikisini de anlamak, tahmin etmek yerine kodlama seçeneklerini bilinçli olarak seçmenizi sağlayan şeydir
JBIG2 PDF spesifikasyonunda nerede yer alır
ISO 32000-1, JBIG2Decode öğesini §7.4.7'deki akış filtreleri arasında listeler ve bu filtre PDF 1.4 ve sonrasından itibaren mevcuttur. Yalnızca tek bir yere uygulanır: /BitsPerComponent değeri 1 olan ve renk uzayı tek bir kanala çözümlenen görüntü XObject'leri. Bütün mesele de budur. JBIG2 iki düzeyli bir kodektir, bu nedenle fotoğraflar üzerinde hiçbir zaman DCT veya JPXDecode ile rekabet etmez. Tam da bir belge tarayıcısının ürettiği türden iki tonlu bir sayfada CCITTFaxDecode, yani Grup 3 ve Grup 4 faks filtreleri ile rekabet eder
Kod çözücü, her bir görüntü akışının çıplak bir bit akışı yerine bir segment dizisi tuttuğu, standardın PDF profili olarak adlandırdığı gömülü JBIG2 organizasyonunu tüketir. İsteğe bağlı bir /JBIG2Globals akışı, aynı belgedeki birden fazla görüntüde paylaşılan segmentleri taşır; bu mekanizma, tekrarlanan içeriğin her sayfa için bir kez olmak yerine tüm dosya için bir kez depolanmasını sağlar. HotPDF varsayılan olarak görüntü başına akış yayar ve bir arka uç istemediği sürece globals kanalını serbest tutar
Arka uç öncelikli kodlayıcı mimarisi
Eksiksiz bir JBIG2 kodlayıcı büyük bir yazılım parçasıdır ve en agresif kısımları tarihsel olarak patentlerle engellenmiş ve her ürüne uymayan lisanslar altında gönderilmiştir. HotPDF, arayüzü motordan ayırarak bu gerilimi çözer. HPDFJBIG2 birimi, kütüphanenin geri kalanının yaptığı çağrıları tanımlar ve JBIG2'nin kutudan çıktığı gibi çalışması için mütevazı bir yerleşik kodlayıcı gönderir. Üretim düzeyinde oranlara ihtiyacınız olduğunda daha güçlü bir motor kaydedersiniz ve kütüphane çağrı kodunuzda hiçbir değişiklik yapmadan görevi ona devreder
Geçiş tek bir kayıt çağrısıdır. Kayıtlı hiçbir arka uç olmadığında, kodlayıcı yerleşik yoluna geri döner. Bir tane kaydettirdiğinizde, sonraki her kodlama onun üzerinden çalışır
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;
Aynı kanca, onu yoklamak için IsJBIG2DecoderBackendAvailable ile birlikte RegisterJBIG2DecoderBackend aracılığıyla kod çözme için de mevcuttur. İşte bu nedenle bir kütüphane tek bir monolitik kodlayıcı yerine küçük bir yerleşik yol artı bir arka uç yeri (seam) gönderir. Yerleşik yol, ikili dosyayı yalın ve lisans karışıklıklarından uzak tutarken, arka uç yeri tam bir kodlayıcı lisanslamış bir ekibin PDF yazma katmanına hiç dokunmadan onu takmasına olanak tanır
Kodlama seçenekleri aslında neyi takas eder
Kodlama, Lossless, UseGlobalSegments, UseSymbolDictionary ve LossyLevel alanlarına sahip bir kayıt olan TJBIG2EncodeOptions aracılığıyla yapılandırılır. Bileşen dostu sarmalayıcı THPDFJBIG2Options, Nesne Denetçisi'nden ayarlanabilmeleri için Lossless, UseSymbolDictionary ve LossyLevel özelliklerini yayımlar ve dahili olarak kayda dönüştürür. Ayarları üç amaç yönlendirir
Kayıpsız yeniden yapılandırma her pikseli tutar. Lossless özelliğini True olarak ayarlayın ve LossyLevel değerini sıfırda bırakın; kodu çözülmüş bit eşlem, girdiyle bit bit aynı olur. Bu, çizgi sanatı, teknik çizimler ve imza veya damga gibi düşen bir pikselin anlamı değiştirebileceği herhangi bir sayfa için tek güvenli seçimdir. Sembol sözlüğü kodlaması metin duyarlı tekilleştirmeyi açar ve JBIG2'yi faks filtrelerinden ayıran seçenektir. 0'dan 9'a kadar bir tam sayı olan kayıplı seviye (lossy level), yetenekli bir arka ucun neredeyse aynı işaretleri aynı sembol olarak işleyerek boyuta karşılık aslına uygunluğu takas etmesine olanak tanır. Sıfır, kayıpsız anlamına gelir. Yerleşik kodlayıcı yalnızca kayıpsız yolu onurlandırır ve sıfır olmayan herhangi bir kayıplı seviyeyi yok sayar, bu nedenle daha yüksek seviyeler yalnızca bunları uygulayan bir arka uç kaydedildiğinde yürürlüğe girer
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;
Sembol sözlükleri ve metin taramaları neden kazanır
Taranmış bir metin sayfası aslında kelimelerin bir görüntüsü değildir. Aynı e harfinin birkaç yüz kez basılmış hali, aynı t, aynı virgül, altta yatan tek bir şeklin biraz gürültülü kopyalarıdır. Bir sembol sözlüğü o yapıyı yakalar. Kodlayıcı, sayfadaki farklı işaretleri bir sözlükte toplar, her şekli bir kez depolar ve ardından sayfayı sözlük girdilerine atıfta bulunan konumların bir listesi olarak kaydeder. Aynı glifin binlerce kez tekrarlanması, depolanmış bir bit eşlem artı binlerce ucuz yerleşime mal olur
Bu tam da JBIG2'nin CCITT Grup 4'ün önüne geçtiği yerdir. Grup 4 her bir tarama satırını, bir glif nosyonu olmaksızın üzerindeki satıra karşı kodlar, bu nedenle harf her göründüğünde harfin tam maliyetini öder. JBIG2 bir kez öder. Aynı sözlük belge seviyesindeki globals akışına terfi ettirildiğinde, tasarruf çok sayfalı bir tarama boyunca katlanır, çünkü sayfa üstüne sayfa tarafından paylaşılan şekiller tüm dosya için tek bir kez depolanır. Yoğun metinde fark marjinal değildir. JBIG2'nin var olma nedeni budur
Geri kalan her şey için genel bölge ve MMR
Her iki düzeyli görüntü metin değildir. Haritalar, şemalar, mühendislik çizimleri ve karma sayfalar hiçbir sözlüğün özetleyemeyeceği çizgi sanatına sahiptir. Bunlar için JBIG2, herhangi bir sembol eğitimi olmadan doğrudan sıkıştırılmış dikdörtgen piksellerden oluşan genel bir bölge kodlar. Standart, genel bir bölgenin, halihazırda Grup 4 faksının kullandığı, her bir piksel satırını üzerindeki satıra karşı modelleyen, değiştirilmiş değiştirilmiş OKU (modified modified READ) kodlaması olan MMR'yi kullanmasına izin verir
Bu, HotPDF'in yerleşik kodlayıcısında gönderdiği yoldur. Hiçbir arka uç kayıtlı olmadığında ve istek kayıpsız olduğunda, kütüphane bit eşlemi tek bir MMR genel bölgesi olarak sıkıştırır ve PDF profilinin gerektirdiği JBIG2 segment yapısına sarar. Sözlüğe, eğitim geçişine ve atıfta bulunulacak ikinci bir görüntüye ihtiyaç duymaz, bu nedenle çizgi sanatı ve karma iki düzeyli içerik için güvenilir varsayılandır. Saf metin üzerinde tam bir sembol sözlüğü kodlayıcısıyla eşleşmeyecektir, ancak her zaman doğrudur, her zaman kayıpsızdır ve her zaman mevcuttur. Bunun için kodlayıcı yüzeyi tek bir çağrıdır
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;
Bir belge oluşturduğunuzda onu açmak
Günlük kullanım için kodlayıcı sınıfına doğrudan dokunmazsınız. HotPDF, JBIG2'yi belge üzerinde bir görüntü sıkıştırma seçeneği olarak sunar. THPDFImageCompressionType numaralandırması, Flate, JPEG ve CCITT seçeneklerinin yanında icJBIG2'yi içerir ve belge, bu sıkıştırma seçildiğinde kullanılan ayarları tutan THPDFJBIG2Options türünde bir JBIG2Options özelliği taşır. Bu şekilde sıkıştırılmasını istediğiniz iki düzeyli görüntüleri eklemeden önce her ikisini de yapılandırın
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;
Bahsetmeye değer bir kolaylık, bir TDBGrid'i doğrudan bir PDF'ye işleyen DBGridHotPDFExport eklentisidir. Çıktısı büyük ölçüde iki düzeyli kurallar ve metindir, bu nedenle JBIG2 için yapılandırılmış bir belge, sizin tarafınızdan fazladan bir işleme gerek kalmadan bu dışa aktarımları derli toplu tutar. Bu blogdaki birbiriyle ilişkili iki konu, çevreleyen iş akışının daha derinlerine iniyor. Raporları oluştururken resimlerin ve yazı tiplerinin nasıl yerleştirildiği hakkında bilgi için Delphi'de yazı tipleri ve resimlerle rapor çıktısı konusuna bakın. Sıkıştırılmış bir belgenin arşivsel bir profili karşılaması gerektiğinde, Delphi'de PDF/A, PDF/X ve PDF/UA doğrulamasındaki kurallar, belirli bir uyumluluk düzeyinin hangi filtreleri kabul ettiğini size söyler. JBIG2, Delphi ve C++Builder için HotPDF Component'inin bir parçası olarak, burada başka yerlerde ele alınan yükleme, düzenleme ve şifreleme API'lerinin yanında gönderilir