PDF fájl struktúra

PDF fájl feltérképezése

A PDF dokumentum egy több rétegű fájltípus, amely több abstrakciós réteget is tartalmaz. A legalacsonyabb szinten a PDF fájl a nyers dokumentum adatokat tartalmazza. E felett van az ún. COS réteg, amely ezeket az adatokat egyszerű objektumokból álló hierarchiába szervezi. A PD réteg ezeket az egyszerű objektumokat felhasználva implementál olyan bonyolultabb struktúrákat, mint a fontok vagy képek. Ezen entitások még magasabb szintű összerendezése alkotja például az oldalakat.

Minden rétegnek megvan a maga, a többitől független szabályrendszere. Például a fájl tartalmazhat olyan valós nyers adatokat, amelyek nem tartalmaznak egyetlen objektumot sem. A COS objektum fa pedig tartalmazhat olyan objektumokat, amelyek nem vesznek részt az oldal látható elemeinek felépítésében sőt akár az Acrobat számára nem is értelmezhetőek.

Ezen struktúrák közötti navigáció ismerete elengedhetetlen bármilyen, PDF-hez kapcsolódó fejlesztés esetén. A következőkben röviden ismertetjük, hogyan épül fel egy PDF fájl a COS objektumok szintjén, mik is ezek az objektumok és mire van mindenképen szükség egy PDF dokumentumhoz.

PDF fájl struktúra

A PDF egy szöveges fájl formátum valamennyi bináris adattal keverve. Ha megnyitunk egy PDF fájlt text editorral, láthatjuk a nyers objektumokat amik a dokumentum tartalmának struktúráját definiálják. Minden objektum definíciót egy szöveges előtag előz meg, melynek formátuma ’2 0 obj’, ahol a 2-es szám az objektum referencia. Az így definiált objektum az ún. indirekt objektum, melynél az objektumhivatkozás az objektum száma alapján történik. Ezzel szemben vannak olyan objektumok, amelyek nem tartalmazzák az imént említett referencia prefixet, ezek az ún. direct objektumok, amelyek mindig másik objektumokon belül találhatók. Egy konténer objektumban hivatkozott másik objektum szintaxisa ’3 0 R’.

Mindössze 8 alacsony szintű vagy COS objektumtípus létezik.

Az első 5 típus skalár (egy értékű) típus:

  • 1. Integer – egész szám;
  • 2. Boolean – logikai típus;
  • 3. Real – valós szám;
  • 4. Name – szöveges név, szintaxisa ’/text’, írásjelet és szóközt nem tartalmazhat;
  • 5. String – szöveg, kétféle szintaxisa lehet: ’(… szöveg …)’ vagy ’<… hexadecimális karakter kódok …>’;

A következő 3 pedig konténer típus:

  • 6. Dictionary – könyvtár, szintaxisa ’<<… egyéb objektumok …>>’. A dictionary bejegyzések mindig párban vannak, egy Name objektum, melyet egy másik objektum követ;
  • 7. Array – tömb, szintaxisa ’[… egyéb objektumok …]’. Objektumok listája, ahol az egyes objektumokat szóköz választja el;
  • 8. Stream – szintaxisa ’5 0 obj <<… stream attributumok …>>stream … bináris adat … endstream’. Ez a legösszetettebb adattípus. A Stream típus mindig indirekt, így minden esetben egy objektumreferenciával kezdődik;

Navigálás egy PDF dokumentum belső struktúrájában

Az alábbi screenshot egy egyszerű „Hello World” pdf fájl tartalmát mutatja text editorral megnyitva. A fájl szemléltetés céljából készült, ezért le van csupaszítva és nem tartalmazza az XMP metadata stream-eket.

Hello world PDF fájl struktúa
Hello world – PDF fájl struktúra

Persze PDF fájlt text editorral nézni nem a legkényelmesebb de túl gyakran nincs is rá szükség, hiszen a piacon számos szoftver létezik, amelyek az emberi szem számára könnyebben értelmezhető grafikus formában is képesek megjeleníteni a dokumentum struktúráját. Megjegyzendő, hogy a PDF fájl struktúrája nem azonos az általa leírt PDF dokumentum struktúrájával. A fájl nagy része úgy tűnik, mintha egymástól független objektumdefiníciók sorozata lenne. Ahhoz, hogy mindez értelmet nyerjen más módon kell megvizsgálni.

A COS objektum hierarchia

A COS objektum fa a PDF struktúrájának valódi arca. Néhány biztonsági információ és az Info könyvtár kivételével (ezek egyike sem játszik szerepet a dokumentum megjelenítésében), minden, amit a dokumentumban látunk megtalálható a COS objektum fában.

A szemléltetés céljára a WindJack Solutions által fejlesztett PDF CanOpener Adobe pluginnel készült screenshotokat használjuk.

Minden PDF fájl gyökere a ’Document Catalog’, ami egy dictionary típusú objektum. Az itt található bejegyzések általában véve az egész dokumentumra vonatkoznak. Vannak köztük skaláris típusok, mint például a Type, PageMode, PageLayout, de a többségük a hierarchia további csomópontjait jelentik.

COS objektum hierarchia
COS objektum hierarchia

Elég sok objektum látható itt, de a legegyszerűbb PDF dokumentumhoz mindössze a dokumentum oldalait leíró Pages objektumra van szükség. A fenti listában látható objektumok a legtöbb PDF esetén tipikusnak mondhatóak, ezek részletes leírását megtaláljuk a PDF referenciában, kivéve az utolsó kettőt. Ezek egyedi objektumok, amelyek nem részei a PDF referenciának, de az Acrobat ezekkel nem fog törődni. Az Acrobat alapértelmezés szerint ugyanis átugrik minden bejegyzést, amit nem tud lekezelni, ami biztosítja, hogy a PDF fölfelé és lefelé is kompatibilis legyen. Ez a megoldás egyben azt is lehetővé teszi, hogy a PDF fájl képességeit, funkcióit bárki szabadon bővíthesse. Természetesen ha új objektumot vezetünk be, el kell hozzá készítenünk az alkalmazást is, ami kezelni képes azt.

Tovább vizsgálva a Pages könyvtárat, láthatjuk, hogy 3 elem van: Type, Count és Kids.

PDF oldalak a COS hierarchiában
PDF oldalak a COS hierarchiában

A Type elem általános a legtöbb magasabb szintű objektumnál, jelen esetben az értéke ’Pages’. A Count elem jelzi, hogy hány elem van az adott fában. A Kids elem a Pages vagy Page objektumok listáját tartalmazza. A Pages objetumok a közbenső szintjei a fának, a Page objektumok pedig a levelek. A fa mélysége függ attól, hogy hány oldal van a dokumentumban. A mintában szereplő dokumentumnak 3 oldala van, így a fa mindössze egyszintű. Ahogy nő az oldalak száma, úgy ad az Acrobat újabb Page objektumokat a fához, ügyelve arra, hogy a Kids tömbben lévő elemek száma lehetőleg 4 és 10 között legyen. Ezzel a megoldással biztosítható, hogy a keletkező fa kiegyensúlyozott legyen. Egy kiegyensúlyozott fában minden csomópontnak azonos számú al-csomópontja van és minden levél azonos mélységben található a fában.

A Page objektum tartalmaz minden elemet, ami egy oldal létrehozásához szükséges.

PDF oldalleíró
PDF oldalleíró

A Pages objektumhoz hasonlóan a Page objektumnak is van egy Type eleme. Az oldal tartalma a Contents elemben található. Ez a stream típusú objektum tartalmazza PDF jelölő operátorok listáját. Ezek az operátorok az első elemek, amelyek megjelennek az oldalon. Ezeket az Annots tömbben leírt megjegyzések követnek. Az oldal látható tartományát az ún. ’Rectangle’ objektumok definiálják. A Rectangle objektum egy 4 fix pontos számból álló tömb, melyek a tartomány négy szélét jelentik. A példabeli oldalnak két ilyen objektuma van a MediaBox és a CropBox. E kettő metszete adja az oldal látható tartományát. Ezenkívül még 3 másik típus létezik, a BleedBox, TrimBox és ArtBox. Ezeknek speciális nyomtatási funkció vannak és nincsenek hatással az oldal megjelenésére az Acrobat-ban.

Automatikus PDF elemzés és változáskövetés

A fenti leírás csak egy rövid ízelítőt adott a PDF fájl által nyújtott szolgáltatásokból, de talán ez is elegendő volt ahhoz, hogy rávilágítson, egy PDF fájl nem valami mítikus nehezen kezelhető fájltípus, hanem egy nagyon tiszta és világos struktúrával és szabályokkal rendelkező fájl formátum.

Ez pedig lehetőséget teremt rá, hogy bármely más szöveges állományhoz (text, xml, csv) hasonlóan szoftveresen feldolgozzuk a PDF állományt is.

Az Interneten számos információ csak PDF formátumban érhető el, viszont szükség lenne rá, hogy a további feldolgozást lehetővé tevő formátumra (pl. xml) konvertáljuk át. A PDF fájl szerkezetét feltérképezve lehetőség nyílik a PDF-ben bekövetkezett változások követésére, vagy akár tetszőleges adatok exportálására PDF-ből. Az így kinyert adatokat azután akár adatbázisba lehet is szervezni a további feldolgozás céljából.

Az automatikus PDF elemzés során a megadott internetes PDF adatforrásokat beolvassuk, majd azok tartalmát összevetjük a korábbi állapottal és változás esetén jelezzük a változás tényét és pontos helyét a dokumentumban, vagy akár automatikusan kiexportálhatjuk a megváltozott adatokat és frissíthetjük a másodlagos adatforrásokat (pl. egy relációs adatbázist).

Egy ilyen alkalmazás felhasználási területe igen változatos lehet:

  • Termék- és szolgáltatás árlisták változásainak nyomon követése;
  • Bankok biztosítók kondíciós listáinak nyomon követése;
  • Tőzsdei cégek negyedévről negyedévre kiadott beszámolóinak elemzése;

Teljes PDF referencia:
http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf