Tehnički članak

Struktura PDF datoteke: Kako format zapravo radi

PDF nije format dokumenta na način na koji su to Word ili RTF. Ti formati pohranjuju slijed sadržaja koji renderer interpretira u trenutku prikaza, tako da izlaz ovisi o tome koji su fontovi i pogon za izgled (layout engine) prisutni. PDF pohranjuje rezultat tog procesa: precizne upute za renderiranje, programe fontova, sažete tokove slika i graf objekata koji ih povezuje u samostalan opis svake stranice. Datoteka nosi dovoljno informacija da identično reproducira svaku stranicu na bilo kojem sukladnom (conforming) rendereru, što je ujedno i njezin glavni cilj dizajna i izvor većine složenosti na koju nailazite kada pokušavate programski generirati, parsirati ili modificirati PDF

Objektni model

Svaki PDF je zbirka numeriranih objekata. Objekt može biti boolean, cijeli broj, realni broj, ime, niz, polje (array), rječnik (dictionary), tok (stream) ili null. Gotovo sve što je zanimljivo je rječnik, što je skup parova ključ-vrijednost gdje su ključevi imena, a vrijednosti bilo koji drugi tip objekta, uključujući reference na druge objekte prema broju i broju generacije. Tok je rječnik iza kojeg slijedi niz bajtova, obično sažet

Kataloški rječnik (catalog dictionary) je korijen (root). On pokazuje na stablo stranica, koje rječnike stranica organizira u strukturu balansiranog stabla radije nego u ravnu (flat) listu, tako da navigacija do stranice 5000 u dokumentu od 10000 stranica ne zahtijeva prelaženje svakog prethodnog deskriptora stranice. Svaki rječnik stranice referencira svoje tokove sadržaja (jedan ili više sekvenci operatora za opis stranice), svoj rječnik resursa (koji zauzvrat referencira deskriptore fontova, prostore boja i XObjects slika) te svoj okvir medija (media box - koordinatni prostor u kojem stranica živi). Koordinatno ishodište (origin) je u donjem lijevom kutu, s pozitivnim Y prema gore, u jedinicama od 1/72 inča

Na kraju datoteke nalazi se tablica unakrsnih referenci (cross-reference table), koja mapira svaki broj objekta na njegov pomak (offset) u bajtovima u datoteci. Ovo omogućuje nasumični (random) pristup: preglednik (viewer) prvo čita tablicu unakrsnih referenci, a zatim izravno traži objekte koji su mu potrebni. PDF 1.5 uveo je tokove unakrsnih referenci, koji komprimiraju tablicu u objekt toka (stream object) i pakiraju srodne objekte u tokove objekata, osjetno smanjujući veličinu datoteke za dokumente s mnogo malih objekata

Tokovi sadržaja i grafički model

Vizualni sadržaj stranice živi u jednom ili više tokova sadržaja (content streams). Svaki tok je slijed PDF operatora prošaran njihovim operandima. Tekstualni operator BT započinje tekstualni objekt, Tf bira font i veličinu iz rječnika resursa, Td pozicionira tekstualni pokazivač (cursor), Tj ili TJ ispisuje niz, a ET zatvara tekstualni objekt. Vektorska grafika prati sličan obrazac: m postavlja početnu točku staze (path), l dodaje segment linije, c dodaje Bezierovu krivulju, a f ili S ispunjava ili iscrtava (strokes) stazu

Grafičko stanje (graphics state) upravlja svime što se događa između operatora: trenutnom matricom transformacije, širinom linije, prostorom boja, bojom ispune, bojom poteza i stazom obrezivanja (clipping path). Operatori poput q i Q guraju (push) i skidaju (pop) grafičko stanje na stog (stack), što je način na koji PDF implementira lokalne koordinatne transformacije i privremena nadjačavanja stanja bez utjecaja na kontekst oko njih. Form XObjects to poopćuju: samostalni tok sadržaja sa svojim vlastitim rječnikom resursa koji se može naslikati na stranici na proizvoljnim pozicijama i u različitim razmjerima pomoću jednog Do operatora

Ugrađivanje fontova i izdvajanje teksta

PDF može referencirati fontove po imenu i osloniti se na to da će preglednik nešto zamijeniti, ali u praksi svaki dokument koji namjeravate dijeliti mora ugraditi (embed) podatke o fontu. Type 1 ili TrueType/OpenType font ugrađen u PDF nosi rječ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. Podskup (subsetting), a to je ono što svaki ozbiljan PDF generator radi, uklanja glifove koje dokument ne referencira, držeći veličine datoteka upravljivima čak i za velike Unicode fontove

Izdvajanje teksta je mjesto gdje se ugrađivanje fontova može osvetiti. Vizualni prikaz znaka određen je glifom u ugrađenom programu fonta. Unicode vrijednost tog znaka određena je ToUnicode CMap tokom pričvršćenim na rječnik fonta. Kada ToUnicode CMap nedostaje ili je pogrešan, preglednik PDF-a može čitljivo renderirati tekst, ali ga ne može izdvojiti kao smislen Unicode, što je razlog zašto copy-paste iz nekih PDF-ova proizvodi smeće. Tagged PDF (Označen PDF) (ISO 32000 §14.8) dodaje drugi sloj: stablo logičke strukture koje mapira sadržaj stranice u uloge semantike dokumenta kao što su odlomci, naslovi i ćelije tablice. Čitači zaslona i programi za prelamanje teksta (reflow engines) koriste stablo strukture, a ne redoslijed izvornog toka sadržaja, što objašnjava zašto vizualno dobro postavljen PDF još uvijek može biti nedostupan ako označavanje (tagging) nedostaje ili je pogrešno

Inkrementalna ažuriranja i digitalni potpisi

Kada spremite promjene u postojeći PDF bez prepisivanja od nule, novi objekti se dodaju nakon izvornog tijela datoteke zajedno s novim odjeljkom unakrsnih referenci i novim rječnikom trailera. Ažurirani trailer ukazuje na nove podatke o unakrsnim referencama, a zamijenjeni objekti ostaju u datoteci, ali ih novi lanac unakrsnih referenci jednostavno ne referencira. Ovo je inkrementalno ažuriranje i ima dvije značajne posljedice

Prvo, datoteka raste sa svakim ciklusom spremanja. Više puta uređivan i spreman dokument akumulira slojeve zastarjelih objekata. Alati poput QPDF-a mogu linearizirati ili sažeti i ponovno napisati datoteku kako bi povratili taj prostor, ali zadana postavka je akumulacija. Drugo, digitalni potpisi ovise o inkrementalnim ažuriranjima za svoj model integriteta. Potpis ISO 32000 pokriva raspon bajtova datoteke, obično sve osim samog rezerviranog mjesta za vrijednost potpisa. Sve promjene nakon potpisivanja koje se pojave kao dodatna inkrementalna ažuriranja vidljive su čitaču koji validira kao izmjene napravljene nakon potpisivanja, što je točno revizijski trag koji želite. Međutim, to također znači da su određene preinake, kao što je dodavanje potpisa odobrenja ili ispunjavanje polja obrasca, izričito dopuštene standardom bez poništavanja izvornog potpisa, pod uvjetom da su promjene u skladu s postavkama dozvole (permission settings) dokumenta (ISO 32000-2 §12.7.6). Promjena koja izlazi iz okvira tih dozvola označena je kao neovlaštena. Ispravno uspostavljanje ove razlike važno je kada generirate dokumente koji će se kasnije supotpisivati

Razine usklađenosti i ISO 32000 loza

PDF je započeo kao vlasnički Adobeov format 1993. godine, apsorbirao je PostScriptov model snimanja, te kroz petnaest verzija nakupio značajke: enkripciju 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 enkripciju u 1.6. Adobe je podnio PDF 1.7 ISO-u 2007. godine, a rezultat je bio ISO 32000-1:2008. ISO 32000-2:2020 pokriva PDF 2.0, koji je pooštrio nekoliko nedovoljno specifičnih područja, revidirao AES-256 derivaciju ključa (revizija 6 zamjenjuje reviziju 5), te dodao eksplicitnu podršku za pridružene datoteke i obogaćene medije

Podstandardi proizlaze iz iste baze. PDF/A (ISO 19005) mijenja značajke za arhivsku stabilnost: bez enkripcije, bez ovisnosti o vanjskom sadržaju, svi fontovi ugrađeni, prostori boja neovisni o uređaju, potrebni XMP metapodaci. PDF/A-1 temelji se na PDF-u 1.4, PDF/A-2 na PDF-u 1.7, dok PDF/A-3 dopušta ugrađene datoteke bilo kojeg formata. PDF/X (ISO 15930) je podskup proizvodnje ispisa (print production): namjere izlaza, okviri preljeva i obrezivanja (bleed and trim boxes), bez transparentnosti u starijim razinama usklađenosti. PDF/UA (ISO 14289) nalaže označenu (tagged) strukturu, Unicode mapiranja i metapodatke jezika radi pristupačnosti. Ovo nisu suparnički formati; oni su skupovi dodatnih ograničenja povrh temeljnog PDF-a, a jedna se datoteka može prilagoditi za više njih istovremeno, pod uvjetom da ograničenja nisu u sukobu

Za svakoga tko piše kod koji stvara ili obrađuje PDF, praktična osnovna linija je ISO 32000-2 s pažljivim obraćanjem pažnje na odjeljke koji pokrivaju model unakrsnih referenci (§7.5), grafičko stanje (§8.4), operatore stanja teksta (§9.3), deskriptore fonta i ToUnicode (§9.6 i §9.10), interaktivne obrasce (§12.7) i digitalne potpise (§12.8). Standard je dugačak, ali većina programskog rada na PDF-u opetovano dotiče uski dio. Razumijevanje modela objekta i mehanizma unakrsnih referenci je ulazna točka; sve ostalo je od tu pa nadalje specijalizacija