Skenirano pogodbo sestavljajo prek sto pik na palec črnega črnila na belem papirju. Shranjena kot enobiten bitmapa je že majhna, pa vendarle sto takšnih strani napihne PDF čez vse meje, ki bi jih poslali po e-pošti. Pravi filter spremeni to aritmetiko. JBIG2 je kompresija z najvišjim razmerjem, ki jo ISO 32000-1 opredeljuje za binarnoslojevne slike, in na svežnju skeniranega besedila rutinsko prepolovi to, kar ustvari CCITT Group 4. To je filter, ki ga posežete, ko je vhod faksiran, skeniran ali kako drugače zreduciran na dve barvi, HotPDF pa ga lahko zapiše neposredno v PDF
Format si to razmerje zasluži z dvema idejama, ki ju generični kodek za slike nima. Modelira, kako se črni nizi prilegajo belemu ozadju, in opazi, da je skenirana stran večinoma iste petstotine oblik glifov, ki se ponavljajo tisočkrat. Razumevanje obojega vam omogoča, da možnosti kodiranja izbirate premišljeno in ne na slepo
Kje JBIG2 sedi v specifikaciji PDF
ISO 32000-1 navaja JBIG2Decode med filtri tokov v §7.4.7, na voljo od PDF 1.4 naprej. Velja za eno samo mesto: slikovni XObjects, katerih /BitsPerComponent je 1 in katerih barvni prostor se razreši na en kanal. To je bistvo. JBIG2 je binarnoslojevni kodek, zato nikoli ne tekmuje z DCT ali JPXDecode na fotografijah. Tekmuje s CCITTFaxDecode, filtri faks Group 3 in Group 4, natanko na vrsti dvotonskih strani, ki jih ustvarja dokumentni skener
Dekoder porabi vgrajeno organizacijo JBIG2, ki jo standard imenuje profil PDF, kjer vsak tok slike vsebuje zaporedje segmentov namesto golega bitnega toka. Neobvezni tok /JBIG2Globals nosi segmente, skupne za več slik v istem dokumentu, kar je mehanizem, ki omogoča, da se ponavljajoča vsebina shrani enkrat za celotno datoteko in ne enkrat na stran. HotPDF privzeto oddaja tok za posamezno sliko in pusti kanal globalnih spremenljivk prost, razen če ga zaledni sistem ne zahteva
Arhitektura kodirnika z zaledjem
Popoln kodirnik JBIG2 je obsežna programska oprema, in njeni najagresivnejši deli so bili zgodovinsko obremenjeni s patenti in licencirani na načine, ki ne ustrezajo vsakemu izdelku. HotPDF to napetost razreši z ločitvijo vmesnika od pogona. Enota HPDFJBIG2 opredeljuje klice, ki jih preostali del knjižnice izvaja, in vsebuje skromen vgrajeni kodirnik, tako da JBIG2 deluje takoj po namestitvi. Ko potrebujete produkcijsko kakovostna razmerja, registrirate močnejši pogon in knjižnica mu delegira, brez spremembe klicne kode
Stikalo je en sam klic registracije. Brez registriranega zaledja kodirnik pade nazaj na vgrajeno pot. Registrirajte eno in vsako naslednje kodiranje teče skozi njega
uses
HPDFJBIG2;
// Preveri, kaj je aktivno, nato po potrebi namesti zmogljivejši pogon
if not IsJBIG2EncoderBackendAvailable then
// Produkcijsko zaledje ni prisotno: HotPDF uporabi vgrajeno pot MMR
RegisterJBIG2EncoderBackend(MyVendorJBIG2Encode);
// Pozneje se na vgrajeno vedenje vrneš tako:
// ClearJBIG2Backends;
Enak kljukišče obstaja za dekodiranje prek RegisterJBIG2DecoderBackend, s IsJBIG2DecoderBackendAvailable za preverjanje. Zato knjižnica vsebuje majhno vgrajeno pot in šiv zaledja namesto enega monolitnega kodirnika. Vgrajena pot ohranja binarno datoteko majhno in prosto licenčnih obremenitev, medtem ko šiv ekipi, ki je licencirala popoln kodirnik, omogoča, da ga priključi, ne da bi se dotikala plasti pisanja PDF
Kaj možnosti kodiranja dejansko zamenjujejo
Kodiranje se konfigurira prek TJBIG2EncodeOptions, zapisa s polji Lossless, UseGlobalSegments, UseSymbolDictionary in LossyLevel. Ovoj, prijazen do komponent, THPDFJBIG2Options objavlja Lossless, UseSymbolDictionary in LossyLevel, tako da jih je mogoče nastaviti iz Object Inspector, interno pa pretvori v zapis. Tri namene določajo nastavitve
Brezizgubna rekonstrukcija ohrani vsak piksel. Nastavite Lossless na True in pustite LossyLevel pri nič, dekodirani bitmapa pa je bit za bitom identičen vhodu. To je edina varna izbira za linijsko grafiko, tehnične risbe in vsako stran, kjer bi izpadli piksel lahko spremenil pomen, na primer podpis ali žig. Slovarsko kodiranje simbolov vklopi deduplikacijo, usmerjeno v besedilo, in je možnost, ki JBIG2 loči od faks filtrov. Stopnja izgube - celo število od 0 do 9 - dovoli sposobnemu zaledju zamenjati zvestobo za velikost z obravnavo skoraj enakih oznak kot istega simbola. Nič pomeni brezizgubno. Vgrajeni kodirnik upošteva le brezizgubno pot in prezre vsako stopnjo izgube, ki ni nič, tako da višje stopnje začnejo delovati šele, ko je registrirano zaledni sistem, ki jih implementira
var
Options: TJBIG2EncodeOptions;
begin
Options := DefaultJBIG2EncodeOptions; // Lossless True, slovar simbolov vklopljen
Options.Lossless := True;
Options.LossyLevel := 0; // 0 ohrani vsak piksel
Options.UseSymbolDictionary := True; // odstrani dvojnike ponavljajočih se glifov
// Options posreduj zaledju ali jih prepusti THPDFJBIG2Options
end;
Slovarji simbolov in zakaj besedilna skeniranja zmagajo
Stran skeniranega besedila v resnici ni slika besed. Je ista črka e, natisnjena večkrat sto krat, ista črka t, ista vejica - vsak primerek rahlo hrupna kopija ene temeljne oblike. Slovar simbolov zajame to strukturo. Kodirnik zbere različne oznake na strani v slovar, vsako obliko shrani enkrat, nato pa zabeleži stran kot seznam položajev, ki se sklicujejo na vnose slovarja. Tisoč pojavitev istega glifa stane eno shranjeno bitmapa in tisoč poceni postavitev
Točno tukaj JBIG2 preseže CCITT Group 4. Group 4 kodira vsako vrstico skeniranja glede na vrstico nad njo brez pojma glifa, zato plača polno ceno vsake črke vsakič, ko se črka pojavi. JBIG2 plača enkrat. Ko se isti slovar promovira v tok globalnih spremenljivk na ravni dokumenta, se prihranek sešteji prek večstranskega skeniranja, ker so oblike, ki si jih delijo stran za stranjo, shranjene enkrat za celotno datoteko. Pri gostih besedilih razlika ni robna. To je razlog, zakaj JBIG2 obstaja
Generično območje in MMR za vse ostalo
Ni vsaka binarnoslojevna slika besedilo. Zemljevidi, sheme, inženirske risbe in mešane strani vsebujejo linijsko grafiko, ki je noben slovar ne more povzeti. Za te JBIG2 kodira generično območje - pravokotnik pikslov, stisnjen neposredno brez kakršnega koli učenja simbolov. Standard dovoljuje generičnemu območju uporabo MMR, modificiranega modificiranega branja (READ), ki ga faks Group 4 že uporablja in ki modelira vsako vrstico pikslov glede na vrstico nad njo
To je pot, ki jo HotPDF vključuje v svojem vgrajenem koderniku. Ko ni registriranega zaledja in je zahteva brezizgubna, knjižnica stisne bitmapa kot eno generično območje MMR in ga ovije v strukturo segmentov JBIG2, ki jo profil PDF zahteva. Ne potrebuje slovarja, učnega prehoda ali druge slike za sklicevanje, zato je zanesljiva privzeta vrednost za linijsko grafiko in mešano binarnoslojevno vsebino. Ne bo dosegla polnega kodirnika s slovarji simbolov na čistem besedilu, a je vedno pravilna, vedno brezizgubna in vedno prisotna. Površina kodirnika zanjo je en sam klic
var
Encoder: THPDFJBIG2Encoder;
ImageData: TJBIG2ByteArray;
Scanlines: TJBIG2ScanlineArray; // eno polje bajtov na vrstico, najprej MSB
W, H: Integer;
begin
// Scanlines, W in H opisujejo 1-bitno stran; vsaka vrstica ima (W + 7) div 8 bajtov
Encoder := THPDFJBIG2Encoder.Create;
try
if Encoder.EncodeToByteArray(Scanlines, W, H, ImageData) then
// ImageData zdaj vsebuje tok JBIG2, pripravljen za /JBIG2Decode XObject
;
finally
Encoder.Free;
end;
end;
Vklop pri gradnji dokumenta
Pri vsakodnevni uporabi se razredom kodirnika ne dotikate neposredno. HotPDF razkrije JBIG2 kot možnost stiskanja slik v dokumentu. Naštevanje THPDFImageCompressionType vključuje icJBIG2 ob možnostih Flate, JPEG in CCITT, dokument pa nosi lastnost JBIG2Options tipa THPDFJBIG2Options, ki vsebuje nastavitve, ki se uporabijo pri izbiri tega stiskanja. Obe nastavitve konfigurirajte, preden dodate binarnoslojevne slike, ki jih želite stisniti na ta način
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.ImageCompressionType := icJBIG2; // 1-bitne slike usmeri skozi JBIG2
Pdf.JBIG2Options.Lossless := True; // ohrani vsak piksel
Pdf.JBIG2Options.UseSymbolDictionary := True;
Pdf.JBIG2Options.LossyLevel := 0;
// Dodaj strani in sem postavi skenirane 1-bitne slike
finally
Pdf.Free;
end;
end;
Ena prikladnost, ki je vredna omembe, je dodatek DBGridHotPDFExport, ki izrisuje TDBGrid neposredno v PDF. Njegov izhod je večinoma binarnoslojevne vrstice in besedilo, zato dokument, konfiguriran za JBIG2, ohranja te izvoze kompaktne brez kakršne koli dodatne obravnave z vaše strani. Dve sorodni temi na tem blogu se poglabljata v okoliški potek dela. Za informacije o tem, kako se slike in pisave razporedijo pri gradnji poročil, glejte izhod poročil s pisavami in slikami v Delphiju. Ko mora stisnjen dokument ustrezati arhivskemu profilu, pravila v validaciji PDF/A, PDF/X in PDF/UA v Delphiju povedo, katere filtre sprejema določena raven skladnosti. JBIG2 je del komponente HotPDF Delphi Component za Delphi in C++Builder, skupaj z vmesniki API za nalaganje, urejanje in šifriranje, opisanimi drugje na tem blogu