Kada uklonite opise stranica, ostaje vam tanak sloj strukture koju niko ne štampa, ali od koje zavisi svaki čitač, indeksator i arhivski sistem. Objekat stranice ne zna ništa o poglavlju kojem pripada, autoru koji ga je napisao ili fusnoti koja vodi na drugo mesto. To znanje živi jedan nivo iznad, u tri strukture povezane sa katalogom dokumenta: tokovima metapodataka, stablu obeleživača (outline tree) i nizovima napomena (annotations) po stranici. One dele osobinu zbog koje je lako napraviti grešku: nijedna ne ostavlja vidljive tragove na stranici, pa se datoteka može iscrtati savršeno, a da joj i dalje nedostaju obeleživači, da protivreči sopstvenom polju za autora ili da usmerava vezu (link) na objekat stranice koji više ne postoji.
Ovo je sloj koji PDF biblioteka izlaže kao svojstva dokumenta, API-je za obeleživače i pozive za linkove ili napomene, i sloj koji pretraživači čitaju da bi odlučili o čemu se radi u vašem dokumentu. Model objekata koji se nalazi ispod njega pokriven je u našem vodiču kroz strukturu PDF dokumenata. Ovde je fokus isključivo na onome što visi sa kataloga.
Sve tri strukture se povezuju na katalogu. Kompletan katalog koji ih povezuje izgleda ovako:
1 0 obj
<< /Type /Catalog
/Pages 2 0 R
/Outlines 3 0 R
/Names << /EmbeddedFiles 4 0 R >>
/Metadata 5 0 R
>>
endobj
Četiri unosa, četiri nezavisna podsistema. /Pages je vidljivi dokument; /Outlines je stablo obeleživača; /Metadata ukazuje na XMP tok; /Names stiže do rečnika naziva na nivou celog dokumenta, koji, između ostalog, sadrži i ugrađene priloge datoteka (attachments). Svaki je opcioni, a čitač koji ne pronađe nijedan od njih i dalje prikazuje stranice. Ta opcionost je upravo razlog zašto je navigacioni sloj prva stvar koja propada kada datoteku uređuju alati koji razumeju samo stranice.
Dva skladišta metapodataka koja se ne slažu
PDF prenosi metapodatke dokumenta na dva mesta istovremeno, a problem nastaje kada ti podaci govore različite stvari. Prvobitni mehanizam je rečnik informacija o dokumentu (document information dictionary), na koji ukazuje /Info u trailer-u: ravan skup parova ključ-vrednost za /Title, /Author, /Subject, /Keywords, /Creator, /Producer i dva datuma. Jednostavan je i svaki pregledač ga čita. Standard PDF 2.0 odbacuje većinu ovih polja u korist drugog mehanizma: XMP toka metapodataka.
XMP je samostalan XML dokument, napisan u RDF formatu, sačuvan kao tok do kojeg katalog dolazi preko ključa /Metadata i označen sa /Type /Metadata /Subtype /XML. Za razliku od rečnika Info koji je zakopan unutar strukture PDF objekata, XMP paket je dizajniran da ga alati koji ne znaju ništa o PDF-u mogu samostalno izdvojiti i analizirati. Evo reprezentativnog paketa:
5 0 obj
<< /Type /Metadata /Subtype /XML /Length 1235 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
<dc:title><rdf:Alt><rdf:li xml:lang="x-default">Quarterly Report</rdf:li></rdf:Alt></dc:title>
<dc:creator><rdf:Seq><rdf:li>A. Author</rdf:li></rdf:Seq></dc:creator>
<xmp:CreateDate>2026-06-16T10:46:27+08:00</xmp:CreateDate>
<xmp:CreatorTool>Reporting Service 4.2</xmp:CreatorTool>
<pdf:Producer>losLab PDF Library</pdf:Producer>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream
endobj
Tri detalja u tom bloku određuju da li će metapodaci preživeti kontakt sa stvarnim alatima. Instrukcije za obradu xpacket nisu ukras: one uokviruju paket kako bi ga program za izdvajanje mogao pronaći unutar većeg toka bajtova, a generator koji izostavi zatvarajući <?xpacket end="w"?> stvara datoteku koja se otvara bez problema, ali ne prolazi stroge validatore. Tipovi podataka svojstava takođe igraju ulogu. dc:title je alternativa za jezik obavijena elementom rdf:Alt, dok je dc:creator uređena lista i zahteva rdf:Seq; upisivanje bilo kog od njih kao običnog tekstualnog čvora je najčešća greška u XMP-u, koju većina pregledača toleriše sve dok ne naiđu na onaj koji to ne dopušta. Prefiksi imenskih prostora (namespaces) su konvencionalni, ali URI adrese sa kojima se povezuju su normativne: parser se oslanja na URI, a ne na prefiks.
Strogo pravilo kod dva skladišta jeste da se moraju slagati. Ako /Info kaže da je autor jedna osoba, a dc:creator navodi drugu, isporučili ste dokument koji na isto pitanje daje dva različita odgovora, a koji će odgovor pobediti zavisi od toga koje polje čita alat koji ga koristi. Biblioteka obično upisuje oba umesto vas, ali onog trenutka kada jedno ručno uredite ili spojite datoteke iz različitih generatora, ta dva skladišta se razilaze. Tretirajte rečnik Info kao stariju kompatibilnost, a XMP kao izvor istine, i regenerišite oba iz jedinstvenog skupa vrednosti umesto da ih krpite odvojeno. Za standard PDF/A ovo postaje zahtev usaglašenosti: ISO 19005 nalaže upotrebu XMP-a i zabranjuje bilo koje svojstvo u Info rečniku koje je u suprotnosti sa odgovarajućim XMP svojstvom.
Stablo obeleživača iza panela sa obeleživačima
Ono što pregledač prikazuje kao panel sa obeleživačima jeste, u datoteci, dvostruko povezano stablo rečnika koje se naziva struktura dokumenta (document outline). Katalog ukazuje na korenski rečnik strukture preko ključa /Outlines; koren ukazuje na svoje prve i poslednje stavke najvišeg nivoa; a svaka stavka je povezana sa svojim susedima i roditeljem. Nigde ne postoji niz obeleživača. Cela struktura se rekonstruiše prateći reference, što je upravo razlog zašto jedna prekinuta veza može učiniti da cela grana nestane sa panela bez ikakve poruke o grešci.
8 0 obj % the outline root
<< /Type /Outlines /Count 4 /First 9 0 R /Last 9 0 R >>
endobj
9 0 obj % top-level: a chapter
<< /Title (Chapter 1: Results)
/Parent 8 0 R /Count 2
/First 12 0 R /Last 15 0 R >>
endobj
12 0 obj % first child
<< /Title (Introduction)
/Parent 9 0 R /Next 15 0 R
/Dest [3 0 R /XYZ 72 720 0] >>
endobj
15 0 obj % second child, last sibling
<< /Title (Methodology)
/Parent 9 0 R /Prev 12 0 R
/Dest [3 0 R /Fit] >>
endobj
Pročitajte veze i pravila povezivanja postaju očigledna. Svaka stavka ukazuje nazad na svoj /Parent. Susedne stavke na istom nivou (siblings) čine lanac preko /Prev i /Next, pri čemu prva stavka izostavlja /Prev, a poslednja /Next. Roditeljska stavka imenuje svoje prvo i poslednje dete preko /First i /Last, dok su deca između njih dostupna samo prolaskom kroz lanac suseda. Ako pogrešite u bilo kojoj vezi, greška će proći neprimećeno: zastarela veza /Next skraćuje poglavlje, roditelj čiji /Last ne završava lanac ostavlja stavke napuštenim, a pregledač iscrtava samo ono što može da dosegne.
Polje /Count nosi informaciju o stanju koja iznenađuje ljude. Na korenu i na bilo kojoj proširenoj (expanded) stavci ono sadrži broj trenutno vidljivih potomaka; na skupljenoj (collapsed) stavci to je negativan broj čija apsolutna vrednost predstavlja broj potomaka koji bi se pojavili pri proširenju. Dakle, /Count nije fiksna strukturna činjenica o stablu, već sačuvano stanje otvorenosti ili zatvorenosti panela, a generator koji ga hardkodira kao pozitivan broj otvoriće svaku granu koju je autor nameravao da ostavi zatvorenom.
Svaka stavka opravdava svoje postojanje time što ukazuje negde. Unos /Title je ono što panel prikazuje; /Dest je mesto na koje klik vodi. Odredište može biti unutar same stavke, kao gore, ili naziv koji se razrešava preko rečnika naziva dokumenta, što je bolji izbor kada mnogo obeleživača i linkova cilja ista mesta, jer se premešteni cilj ispravlja na samo jednom mestu. Biblioteka uglavnom skriva ovo stablo iza objekta korenskog obeleživača i metoda koje dodaju stavke; u HotPDF-u dokument izlaže svojstvo OutlineRoot tipa THPDFDocOutlineObject i automatski povezuje reference /Prev, /Next, /Parent i /Count kako dodajete stavke. To vredi iskoristiti, jer je ručno održavanje tih pravila tokom uređivanja mesto gde se obeleživači najčešće kvare.
Odredišta (Destinations): Gramatika cilja klika
I obeleživači i napomene linkova ukazuju na odredišta, a odredište je više od samog broja stranice. To je niz koji imenuje objekat stranice, a zatim kroz operaciju u drugom slotu specificira kako pregledač treba da je prikaže. Najčešći i najviše zloupotrebljavan je /XYZ, u obliku [page /XYZ left top zoom]. Njegova tri operanda su nezavisna, i svaki može biti null što znači „ostavi ovo onako kako je korisnik već podesio“. Tako [page /XYZ null null null] skače na stranicu bez menjanja pozicije skrolovanja ili zuma, što je obično ono što želite od linka „idi na stranicu“. Brojevi su u podrazumevanom korisničkom prostoru (default user space), mereni od donjeg levog ugla sa y osom koja raste nagore, što je isti koordinatni sistem koji koristi i sadržaj stranice. Autori koji dolaze sa dizajna ekrana refleksivno mere od vrha i šalju čitaoca na pogrešan kraj stranice.
Familija /Fit menja precizno pozicioniranje za otpornost na promene. [page /Fit] skalira celu stranicu da stane u prozor, [page /FitH top] prilagođava širinu stranice sa zadatom gornjom ivicom, a [page /FitR l b r t] zumira pravougaonik da ispuni prikaz. Pošto ove opcije izračunavaju razmeru na osnovu geometrije stranice, a ne fiksnih koordinata, odredište /Fit se i dalje ponaša razumno nakon što se veličina stranice promeni, dok odredište /XYZ sa ugrađenim zumom može ostaviti čitaoca da gleda u marginu. Za sadržaj dokumenta, /FitH sa gornjom koordinatom odeljka traje bolje od /XYZ sa pretpostavljenim zumom.
Napomene (Annotations): Sve interaktivno što nije sadržaj stranice
Napomena (annotation) je objekat koji prekriva stranicu, a da nije deo njenog toka sadržaja. Linkovi, lepljive beleške, isticanja (highlights), polja obrazaca, ikonice za priloge datoteka, pečati: sve su to napomene, navedene u nizu /Annots stranice na kojoj se nalaze. Uklanjanje napomene iz tog niza uklanja je sa stranice iako je osnovni sadržaj netaknut. U tome je i cela poenta: napomene su sloj za uređivanje, odvojen od samih grafičkih elemenata preko kojih leže.
Svaka napomena deli istu osnovnu strukturu. Unos /Subtype navodi vrstu, /Rect daje njen granični okvir (bounding box) u koordinatama stranice, a /Contents sadrži tekst koji služi i kao pristupačan opis. Napomena linka je slučaj koji vredi proučiti jer dolazi u dva oblika: kao čisto odredište i kao akcija.
12 0 obj % link to a destination
<< /Type /Annot /Subtype /Link
/Rect [100 200 300 250]
/Border [0 0 0]
/Dest [5 0 R /XYZ null null null] >>
endobj
13 0 obj % link that runs an action
<< /Type /Annot /Subtype /Link
/Rect [50 50 200 100]
/Border [0 0 0]
/A << /Type /Action /S /URI /URI (https://www.example.com) >> >>
endobj
Unos /Rect predstavlja osetljivu oblast (hotspot); klik unutar nje šalje čitaoca na odredište, koristeći istu gramatiku kao i struktura obeleživača. Unos /Border [0 0 0] obavlja važan zadatak, potiskujući ružni podrazumevani pravougaonik koji pregledači iscrtavaju oko linkova. Drugi oblik zamenjuje čisto odredište /Dest akcijom /A, čiji podtip /S bira ponašanje: /GoTo unutar ove datoteke, /GoToR za drugu datoteku, /URI za veb adresu, /Launch za pokretanje spoljnog programa. Ovaj poslednji zaslužuje poseban oprez. Akcija /Launch koja pokreće izvršnu datoteku je ponašanje koje čini PDF-ove vektorom zlonamernog softvera, pa je usaglašeni pregledači blokiraju ili prikazuju upozorenje, a link ne uspeva kod većine čitača. Oslonite se na /URI i /GoTo, a /Launch izbegavajte.
Markup napomene kao što su isticanja i lepljive beleške, i geometrijske napomene kao što je /Square, donose dodatnu komplikaciju: njihov izgled na ekranu nije impliciran njihovim tipom. Pregledač iscrtava sopstvenu verziju osim ako ne definišete izgled pomoću toka izgleda (appearance stream), odnosno unosa /AP, koji referencira form XObject koji sadrži operatore crtanja. Ako ga preskočite, isto isticanje može izgledati drugačije u dva pregledača, ili pre i posle obrade u editoru. Za sve čiji je tačan izgled deo dokumenta, obezbedite unos /AP. Prilozi datoteka (attachments) inače koriste isti ovaj mehanizam: ugrađeni tok datoteke i rečnik specifikacije datoteke, koji se prikazuju ili kao napomena /FileAttachment ili preko stabla naziva /EmbeddedFiles pod ključem /Names u katalogu.
Gde se ovaj sloj kvari i kako to uočiti
Česta greška u svemu ovome jeste nevažeća (dangling) referenca. Obeleživači prestaju da se prikazuju kada katalog nema unos /Outlines ili kada se lanac susednih stavki prekine na pola stabla; metapodaci se ignorišu kada XMP toku nedostaje oznaka /Type /Metadata /Subtype /XML or when the xpacket wrapper is malformed. In every case the page content is fine, so a casual open looks correct and the defect surfaces only in the panel that no one checked.
Dve jednostavne navike uočavaju većinu problema. Otvorite gotovu datoteku u stvarnom pregledaču i kliknite kroz panel sa obeleživačima i uzorak linkova, čime testirate graf referenci onako kako će ga čitač koristiti. Zatim pročitajte metapodatke pomoću posebnog alata i potvrdite da se Info rečnik i XMP slažu; to je neslaganje koje nijedan broj klikova neće otkriti. Generišite ovaj sloj preko biblioteke koja vodi računa o povezivanju i većina ovih zamki se nikada neće otvoriti. Komponenta HotPDF Component za Delphi i C++Builder izlaže strukture obeleživača, napomena i metapodataka preko API-ja na nivou dokumenta, tako da vi samo opisujete hijerarhiju obeleživača i linkove, a njoj prepuštate povezivanje referenci. Za model objekata na koji se ove strukture povezuju, naš tehnički pregled strukture PDF datoteka pokriva katalog i tabelu unakrsnih referenci od kojih one zavise.