Skannattu sopimus on muutaman sadan pisteen verran mustaa mustetta valkoisella paperilla tuumaa kohden. Yksibittisenä pikseliä kohti tallennettu bittikartta on jo pieni, silti sata sellaista sivua paisuttaa PDF-tiedoston pidemmälle kuin mitä lähettäisit sähköpostilla. Oikea suodatin muuttaa aritmetiikkaa. JBIG2 on korkeimman suhteen pakkaus, jonka standardi ISO 32000-1 määrittelee kaksitasoisille kuville, ja pinolla skannattua tekstiä se rutiininomaisesti puolittaa sen, mitä CCITT Group 4 tuottaa. Tämä on suodatin, johon tavoitellaan silloin, kun syöte on faksattu, skannattu tai muuten pienennetty kahteen väriin, ja HotPDF voi kirjoittaa sen suoraan PDF-muotoon
Muoto ansaitsee suhteen kahdella idealla, joita yleisellä kuvakoodekilla ei ole. Se mallintaa kuinka mustat viivat istuvat valkoista taustaa vasten ja havaitsee, että skannattu sivu on enimmäkseen samat muutaman sadan kuviomuodot toistettuna tuhansia kertoja. Molempien ymmärtäminen antaa sinun valita koodausvaihtoehdot tietoisesti arvaamisen sijaan
Missä JBIG2 sijaitsee PDF-määrityksissä
ISO 32000-1 luettelee koodin JBIG2Decode virtasuodattimien joukossa kohdassa 7.4.7, saatavilla PDF-versiosta 1.4 alkaen. Se koskee vain yhtä paikkaa: kuvien XObjekteja, joiden /BitsPerComponent on 1 ja joiden väriavaruus ratkeaa yhdelle kanavalle. Siinä on koko juttu. JBIG2 on kaksitasoinen koodekki, joten se ei koskaan kilpaile DCT:n tai JPXDecoden kanssa valokuvissa. Se kilpailee komennon CCITTFaxDecode, ryhmien 3 ja 4 faksisuodattimien, kanssa juuri sellaisella kaksisävyisellä sivulla, jollaisen asiakirjaskanneri tuottaa
Dekooderi kuluttaa upotetun JBIG2-organisaation, jota standardi kutsuu PDF-profiiliksi, jossa jokaisessa kuvavirrassa on segmenttisarja paljaan bittivirran sijaan. Valinnainen /JBIG2Globals-virta sisältää useiden kuvien kesken jaettuja segmenttejä samassa asiakirjassa, mikä on mekanismi, joka mahdollistaa toistetun sisällön tallentamisen kerran koko tiedostolle eikä kerran sivua kohti. HotPDF lähettää kuvakohtaisen virran oletuksena ja pitää globaalit kanavan vapaana, ellei taustaosa sitä pyydä
Taustaosa-ensin -kooderin arkkitehtuuri
Täydellinen JBIG2-kooderi on iso ohjelmisto, ja sen aggressiivisimmat osat ovat historiallisesti olleet patenttien kuormittamia ja toimitettu lisensseillä, jotka eivät sovi jokaiseen tuotteeseen. HotPDF ratkaisee jännityksen erottamalla käyttöliittymän moottorista. Yksikkö HPDFJBIG2 määrittää kutsut, joita muu kirjasto soittaa, ja se toimitetaan vaatimattomalla sisäänrakennetulla kooderilla, jotta JBIG2 toimii valmiina. Kun tarvitset tuotantotason suhteita, rekisteröit vahvemman moottorin ja kirjasto siirtyy sille ilman muutoksia kutsuvaan koodiisi
Kytkin on yksi rekisteröintikutsu. Ilman rekisteröityä taustajärjestelmää anturi palaa sisäänrakennetulle polulleen. Rekisteröi yksi ja jokainen seuraava koodaus kulkee sen läpi
uses
HPDFJBIG2;
// Tiedustele, mikä on aktiivista, ja asenna sitten valinnaisesti vahvempi moottori.
if not IsJBIG2EncoderBackendAvailable then
// Tuotannon taustajärjestelmää ei ole: HotPDF käyttää sisäänrakennettua MMR-polkuaan.
RegisterJBIG2EncoderBackend(MyVendorJBIG2Encode);
// Myöhemmin sisäänrakennettuun käyttäytymiseen palaamiseksi:
// ClearJBIG2Backends;
Sama koukku on olemassa purkamiseen komennon RegisterJBIG2DecoderBackend kautta komennon IsJBIG2DecoderBackendAvailable avulla sen tutkimiseen. Tästä syystä kirjasto toimitetaan pienellä sisäänrakennetulla polulla ja taustaosasaumalla yhden monoliittisen anturin sijaan. Sisäänrakennettu polku pitää binaarin laihana ja vapaana lisenssisotkuista, kun taas sauma antaa tiimin, joka on lisensoinut täyden anturin, kytkeä sen koskematta PDF-tiedoston kirjoituskerrokseen ollenkaan
Mitä koodausvaihtoehdot todella kauppaavat
Koodaus määritetään koodin TJBIG2EncodeOptions kautta, tietueen, jossa on kentät Lossless, UseGlobalSegments, UseSymbolDictionary ja LossyLevel. Komponenttiystävällinen kääre THPDFJBIG2Options julkaisee Lossless, UseSymbolDictionary ja LossyLevel, joten ne voidaan asettaa Object Inspectorista, ja se muunnetaan tietueeksi sisäisesti. Asetuksia ohjaa kolme tarkoitusta
Häviötön rekonstruktio säilyttää jokaisen pikselin. Aseta Lossless arvoon True ja jätä LossyLevel nollaan, ja dekoodattu bittikartta on bitiltä bittiin identtinen syötteen kanssa. Tämä on ainoa turvallinen valinta viivapiirroksille, teknisille piirustuksille ja kaikille sivuille, joissa pudonnut pikseli voi muuttaa merkitystä, kuten allekirjoitus tai leima. Symbolisanakirjan koodaus ottaa käyttöön tekstitietoisen kopioinnin ja on vaihtoehto, joka erottaa JBIG2:n faksisuodattimista. Häviöllinen taso, kokonaisluku 0-9, antaa pystyvän taustajärjestelmän vaihtaa uskollisuutta kokoon käsittelemällä lähes identtisiä merkkejä samoina symboleina. Nolla tarkoittaa häviötöntä. Sisäänrakennettu anturi kunnioittaa vain häviötöntä polkua ja jättää huomiotta minkä tahansa nollasta poikkeavan häviöllisen tason, joten korkeammat tasot tulevat voimaan vasta, kun ne toteuttava taustaosa on rekisteröity
var
Options: TJBIG2EncodeOptions;
begin
Options := DefaultJBIG2EncodeOptions; // Häviötön tosi, symbolisanakirja päällä
Options.Lossless := True;
Options.LossyLevel := 0; // 0 säilyttää jokaisen pikselin
Options.UseSymbolDictionary := True; // estä toistuvat kuviot
// Anna asetukset taustaosaan tai anna komennon THPDFJBIG2Options kantaa niitä.
end;
Symbolisanakirjat ja miksi tekstin skannaukset voittavat
Sivu skannattua tekstiä ei todellakaan ole kuva sanoista. Se on sama kirjain e tulostettuna useita satoja kertoja, sama t, sama pilkku, jokainen tapaus on hieman meluisa kopio yhdestä taustalla olevasta muodosta. Symbolisanakirja kaappaa kyseisen rakenteen. Anturi kerää sivulla olevat erilliset merkit sanakirjaan, tallentaa kunkin muodon kerran ja tallentaa sitten sivun luettelona paikoista, jotka viittaavat sanakirjamerkintöihin. Tuhat saman glyyfin esiintymistä maksaa yhden tallennetun bittikartan sekä tuhat halpaa sijoitusta
Tässä on täsmälleen kohta, jossa JBIG2 vetäytyy CCITT Group 4:n edelle. Ryhmä 4 koodaa jokaisen skannausviivan sen yläpuolella olevaa viivaa vasten ilman käsitystä glyyfistä, joten se maksaa kunkin kirjaimen täyden hinnan joka kerta, kun kirjain ilmestyy. JBIG2 maksaa kerran. Kun sama sanakirja mainostetaan asiakirjatason globaalivirtaan, tallennus yhdistyy usean sivun skannaukseen, koska sivu toisensa jälkeen jakamat muodot tallennetaan yhden kerran koko tiedostolle. Tiheässä tekstissä ero ei ole marginaalinen. Se on syy JBIG2:n olemassaoloon
Yleinen alue ja MMR kaikelle muulle
Jokainen kaksitasoinen kuva ei ole tekstiä. Kartoissa, kaavioissa, teknisissä piirustuksissa ja sekasivuissa on viivapiirroksia, joita yksikään sanakirja ei voi tiivistää. Niille JBIG2 koodaa yleisen alueen, suorakulmion, jossa on pikseliä pakattuina suoraan ilman symboliharjoittelua. Standardin mukaan yleinen alue voi käyttää MMR:ää, ryhmän 4 faksin jo käyttämää muokattua muokattua READ-koodausta, joka mallintaa jokaisen pikselirivin sen yläpuolella olevaa riviä vasten
Tämä on se polku, jota HotPDF toimittaa sisäänrakennetun anturinsa mukana. Kun mitään taustajärjestelmää ei ole rekisteröity ja pyyntö on häviötön, kirjasto pakkaa bittikartan yhdeksi MMR:n yleiseksi alueeksi ja kääri sen JBIG2-segmenttirakenteeseen, jota PDF-profiili vaatii. Se ei tarvitse sanakirjaa, ei harjoittelupassia eikä toista viitattavaa kuvaa, joten se on luotettava oletus viivapiirroksille ja sekatasoiselle sisällölle. Se ei vastaa täyttä symboli-sanakirjakooderia pelkällä tekstillä, mutta se on aina oikea, aina häviötön ja aina läsnä. Sen anturin pinta on yksi puhelu
var
Encoder: THPDFJBIG2Encoder;
ImageData: TJBIG2ByteArray;
Scanlines: TJBIG2ScanlineArray; // yksi tavutaulukko riviä kohti, MSB ensin
W, H: Integer;
begin
// Juovat W ja H kuvaavat 1-bittistä sivua; jokainen rivi on (L + 7) jao 8 tavua.
Encoder := THPDFJBIG2Encoder.Create;
try
if Encoder.EncodeToByteArray(Scanlines, W, H, ImageData) then
// ImageData sisältää nyt JBIG2-virran, joka on valmis /JBIG2Decode XObjectiin.
;
finally
Encoder.Free;
end;
end;
Kytkeminen päälle asiakirjan rakentamisen yhteydessä
Jokapäiväisessä käytössä anturiluokkaa ei kosketa suoraan. HotPDF paljastaa JBIG2:n kuvanpakkausvaihtoehtona asiakirjassa. Luettelo THPDFImageCompressionType sisältää icJBIG2 Flate-, JPEG- ja CCITT-vaihtoehtojen rinnalla, ja asiakirjassa on tyypin JBIG2Options ominaisuus THPDFJBIG2Options, joka sisältää asetukset, joita käytetään kun kyseinen pakkaus on valittu. Määritä molemmat ennen kuin lisäät tällä tavalla pakattuja kaksitasoisia kuvia
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.ImageCompressionType := icJBIG2; // reitittää 1-bittiset kuvat JBIG2:n kautta
Pdf.JBIG2Options.Lossless := True; // säilyttää jokaisen pikselin
Pdf.JBIG2Options.UseSymbolDictionary := True;
Pdf.JBIG2Options.LossyLevel := 0;
// Lisää sivuja ja sijoita skannatut 1-bittiset kuvasi tähän.
finally
Pdf.Free;
end;
end;
Yksi huomioimisen arvoinen käyttömukavuus on DBGridHotPDFExport-lisäosa, joka tekee tiedostosta TDBGrid suoraan PDF-tiedostoksi. Sen tulostus on suurelta osin kaksitasoisia sääntöjä ja tekstiä, joten JBIG2:lle määritetty asiakirja pitää nämä viennit tiiviinä ilman ylimääräistä käsittelyä. Tämän blogin kaksi toisiinsa liittyvää aihetta menevät syvemmälle ympäröivään työnkulkuun. Katso lisätietoja siitä, kuinka kuvat ja fontit laaditaan raporttien laatimisessa kohdasta raportin tulostus fonteilla ja kuvilla Delphissä. Kun pakatun asiakirjan on täytettävä arkistointiprofiili, PDF/A-, PDF/X- ja PDF/UA-vahvistuksen säännöt Delphissä kertovat, mitkä suodattimet tietty vaatimustenmukaisuustaso hyväksyy. JBIG2 toimitetaan osana Delphin ja C++Builderin HotPDF Component -komponenttia sekä lataus-, muokkaus- ja salaussovellusliittymiä, joita on käsitelty muualla täällä