Technical Article

Struktura PDF datoteke: Kako format zapravo funkcioniše

PDF nije format dokumenta na način na koji su to Word ili RTF. Ti formati čuvaju redosled sadržaja koji renderer interpretira u trenutku prikaza, tako da izlaz zavisi od fontova i pokretača rasporeda koji su trenutno prisutni. PDF čuva rezultat tog procesa: precizna uputstva za renderovanje, programe fontova, kompresovane tokove slika i graf objekata koji ih povezuje u samostalni opis svake stranice. Datoteka nosi dovoljno informacija da identično reprodukuje svaku stranicu na bilo kom usklađenom rendereru, što je i njegov glavni dizajnerski cilj i izvor većine složenosti na koju nailazite kada pokušate da ga programski generišete, analizirate ili izmenite.

Model objekata

Svaki PDF je kolekcija numerisanih objekata. Objekat može biti logička vrednost, ceo broj, realan broj, ime, string, niz, rečnik, tok (stream) ili null. Skoro sve što je zanimljivo jeste rečnik (dictionary), koji predstavlja skup parova ključ-vrednost gde su ključevi imena, a vrednosti bilo koji drugi tip objekta, uključujući reference na druge objekte prema broju i broju generacije. Tok je rečnik praćen redosledom bajtova, koji je obično kompresovan.

Kataloški rečnik je koren (root). On ukazuje na stablo stranica, koje organizuje rečnike stranica u strukturu balansiranog stabla umesto ravne liste, tako da navigacija do 5.000. stranice dokumenta od 10.000 stranica ne zahteva prolazak kroz svaki prethodni deskriptor stranice. Svaki rečnik stranice referencira svoje tokove sadržaja (jedan ili više niza operatora za opis stranice), svoj rečnik resursa (koji zauzvrat referencira deskriptore fontova, prostore boja i slikovne XObjekte) i svoj media box (koordinatni prostor u kojem stranica živi). Koordinatni početak je u donjem levom uglu, sa pozitivnom Y osom koja ide nagore, u jedinicama od 1/72 inča.

Na kraju datoteke nalazi se tabela unakrsnih referenci (cross-reference table), koja mapira svaki broj objekta sa njegovim pomakom bajtova u datoteci. To je ono što omogućava nasumičan pristup: čitač prvo čita tabelu unakrsnih referenci, a zatim ide direktno do objekata koji su mu potrebni. PDF 1.5 je uveo tokove unakrsnih referenci (cross-reference streams), koji kompresuju tabelu u objekat toka i pakuju srodne objekte u tokove objekata, što primetno smanjuje veličinu datoteke za dokumente sa mnogo malih objekata.

Tokovi sadržaja i grafički model

Vizuelni sadržaj stranice živi u jednom ili više tokova sadržaja. Svaki tok je niz PDF operatora pomešanih sa njihovim operandima. Tekstualni operator BT započinje tekstualni objekat, Tf bira font i veličinu iz rečnika resursa, Td pozicionira kursor teksta, Tj ili TJ iscrtava string, a ET zatvara tekstualni objekat. Vektorska grafika prati sličan obrazac: m postavlja početnu tačku putanje, l dodaje segment linije, c dodaje Bezijeovu krivu, a f ili S popunjava ili iscrtava putanju.

Grafičko stanje (graphics state) upravlja svime što se dešava između operatora: trenutna matrica transformacije, širina linije, prostor boja, boja popunjavanja, boja iscrtavanja linije i putanja isecanja (clipping path). Operatori kao što su q i Q postavljaju i skidaju grafičko stanje sa steka, što je način na koji PDF implementira lokalne transformacije koordinata i privremeno poništavanje stanja bez uticaja na kontekst oko njih. Form XObjects to uopštavaju: samostalni tok sadržaja sa sopstvenim rečnikom resursa koji se može iscrtati na stranici na proizvoljnim pozicijama i u različitim razmerama pomoću jednog operatora Do.

Ugradnja fontova i ekstrakcija teksta

PDF može referencirati fontove po imenu i osloniti se na čitač da zameni font, ali u praksi svaki dokument koji nameravate da delite mora da sadrži ugrađene podatke o fontu. Type 1 ili TrueType/OpenType font ugrađen u PDF nosi rečnik deskriptora fonta koji ukazuje na tok datoteke fonta. Za TrueType fontove, taj tok sadrži binarni program fonta; za Type 1, to su PFB podaci. Pravljenje podskupova (subsetting), što radi svaki ozbiljan PDF generator, uklanja glifove koje dokument ne referencira, čime se veličina datoteke održava prihvatljivom čak i za velike Unicode fontove.

Ekstrakcija teksta je oblast gde ugradnja fontova može napraviti probleme. Vizuelni prikaz karaktera određen je glifom u ugrađenom programu fonta. Unicode vrednost tog karaktera određena je ToUnicode CMap tokom koji je priložen rečniku fonta. Kada ToUnicode CMap nedostaje ili je neispravan, PDF čitač može čitko da renderuje tekst, ali ne može da ga izdvoji kao smislen Unicode, zbog čega kopiranje i lepljenje iz nekih PDF-ova proizvodi nerazumljive karaktere. Tagged PDF (ISO 32000 §14.8) dodaje drugi sloj: stablo logičke strukture koje mapira sadržaj stranice sa dokument-semantičkim ulogama kao što su pasusi, naslovi i ćelije tabele. Čitači ekrana i pokretači za prilagođavanje toka stranice (reflow) koriste stablo strukture umesto sirovog redosleda toka sadržaja, što objašnjava zašto vizuelno dobro raspoređen PDF i dalje može biti nedostupan ako označavanje (tagging) nedostaje ili je pogrešno.

Inkrementalna ažuriranja i digitalni potpisi

Kada sačuvate izmene u postojećem PDF-u bez ponovnog pisanja od nule, novi objekti se dodaju nakon originalnog tela datoteke zajedno sa novim odeljkom unakrsnih referenci i novim rečnikom završnice (trailer dictionary). Ažurirani trailer ukazuje na nove podatke unakrsnih referenci, a zamenjeni objekti ostaju u datoteci, ali ih novi lanac unakrsnih referenci jednostavno ne referencira. To je inkrementalno ažuriranje, i ono ima dve značajne posledice.

Prvo, datoteka raste sa svakim ciklusom čuvanja. Dokument koji se više puta menja i čuva akumulira slojeve zastarelih objekata. Alati kao što je QPDF mogu linearizovati ili kompresovati i ponovo upisati datoteku kako bi povratili taj prostor, ali podrazumevano ponašanje je akumulacija. Drugo, digitalni potpisi zavise od inkrementalnih ažuriranja za svoj model integriteta. ISO 32000 potpis pokriva opseg bajtova datoteke, obično sve osim mesta rezervisanog za samu vrednost potpisa. Sve izmene nakon potpisivanja koje se pojavljuju kao dodatna inkrementalna ažuriranja vidljive su čitaču koji vrši validaciju kao modifikacije napravljene nakon potpisivanja, što je upravo revizorski trag koji želite. Međutim, to takođe znači da su određene modifikacije, kao što su dodavanje potpisa odobrenja ili popunjavanje polja obrasca, izričito dozvoljene standardom bez poništavanja originalnog potpisa, pod uslovom da su izmene u skladu sa podešavanjima dozvola dokumenta (ISO 32000-2 §12.7.6). Modifikacija koja izlazi van tih dozvola označava se kao neautorizovana. Pravilno razumevanje ove razlike je važno kada generišete dokumente koji će biti supotpisani kasnije u procesu rada.

Nivoi usklađenosti i poreklo ISO 32000

PDF je započeo kao vlasnički Adobe format 1993. godine, apsorbovao je PostScript-ov model slikanja i kroz petnaest verzija akumulirao funkcije: šifrovanje u 1.1, interaktivne obrasce u 1.2, digitalne potpise i logičku strukturu u 1.3, transparentnost u 1.4, tokove objekata u 1.5, AES šifrovanje u 1.6. Adobe je podneo PDF 1.7 organizaciji ISO 2007. godine, a rezultat je bio ISO 32000-1:2008. ISO 32000-2:2020 pokriva PDF 2.0, koji je pooštrio nekoliko nedovoljno definisanih oblasti, revidirao izvođenje AES-256 ključa (revizija 6 zamenjuje reviziju 5) i dodao eksplicitnu podršku za povezane datoteke i bogate medije.

Podstandardi potiču iz iste osnove. PDF/A (ISO 19005) žrtvuje funkcije zarad stabilnosti arhiviranja: nema šifrovanja, nema zavisnosti od spoljnog sadržaja, svi fontovi moraju biti ugrađeni, prostori boja moraju biti nezavisni od uređaja, potreban je XMP metapodatak. PDF/A-1 je zasnovan na PDF 1.4, PDF/A-2 na PDF 1.7, a PDF/A-3 dozvoljava ugrađene datoteke bilo kog formata. PDF/X (ISO 15930) je podskup za grafičku pripremu i štampu: namera izlaza (output intents), bleed i trim okviri, bez transparentnosti u starijim nivoima usklađenosti. PDF/UA (ISO 14289) nalaže označenu strukturu, Unicode mapiranja i jezičke metapodatke radi pristupačnosti. Ovo nisu konkurentski formati; to su skupovi dodatnih ograničenja povrh osnovnog PDF formata, a jedna datoteka može biti usklađena sa više njih istovremeno, pod uslovom da ograničenja nisu u konfliktu.

Za svakoga ko piše kod koji generiše ili obrađuje PDF, praktična osnova je ISO 32000-2 sa pažljivim fokusom na odeljke koji pokrivaju model unakrsnih referenci (§7.5), grafičko stanje (§8.4), operatore stanja teksta (§9.3), deskriptore fontova i ToUnicode (§9.6 i §9.10), interaktivne obrasce (§12.7) i digitalne potpise (§12.8). Standard je obiman, ali većina programskog rada sa PDF-om se više puta dotiče njegovog uskog dela. Razumevanje modela objekata i mehanizma unakrsnih referenci je polazna tačka; sve ostalo je specijalizacija.