Vladimír Kraus: PDF
Predchozi (Obsah) Dalsi

4. Struktura souboru PDF

4.1. Verze PDF

Standard PDF prochází vývojem - první verze PDF 1.0 byla doplňována a vznikly verze PDF 1.1 a PDF 1.2. Poslední verzí je PDF 1.3.

4.1.1. PDF 1.0

V této verzi musela být všechna data uložena ve formátu 7-bit ASCII. To znamená, že binární data musela být zakódována v ASCII do sedmi bitů. Důvodem pro toto omezení byla snaha o korektní přenos dokumentů PDF. Řádky dokumentu musely být kratší než 255 znaků. Konec řádky je definován dvojicí znaků <0D0A>.

4.1.2. PDF 1.1

Postupně se ukázalo, že ani přísná omezení definovaná ve verzi 1.0 nezabránila změnám v souboru při jejich přenosu. Nežádoucí bylo také zvětšení dokumentu asi o 20 %. To způsobovalo kódování binárních dat do 7-bit ASCII. Proto se ve verzi 1.1 odstupuje od nutnosti použití 7-bit ASCII.

V této verzi mohou být binární data uložena přímo v objektech string, stream a v komentářích. V praxi se ukázalo, že soubory jsou méně poškozovány při přenosu, jestliže obsahují binární data. K tomu se používá malý trik: druhý řádek PDF souboru obsahuje komentář s alespoň čtyřmi znaky s ASCII hodnotou vyšší než 128. Tím je navozen dojem, že se jedná o binární soubor, a je s ním také tak zacházeno.

Struktura souboru PDF zůstala oproti verzi 1.0 nezměněná. Vzhledem k možnosti použití binárních dat se upustilo od požadavku na omezení délky jedné řádky. Řádky ve verzi 1.1 tedy mohou být libovolně dlouhé. Z důvodu kompatibility s nižší verzí je ale doporučeno neužívat mimo objekt stream řádky delší než 255 znaků.

4.2. Členění souboru

PDF se skládá ze čtyř základních částí: jednořádkové hlavičky - header, těla - body, tabulky křížových odkazů - cross-reference table a paty - trailer.

<PDF file>::=
<header>
<body>
<cross-reference table>
<trailer>

4.2.1. Hlavička - header

První řádek souboru oznamuje použitou verzi PDF. Dokumenty ve verzi formátu PDF 1.2 tedy budou mít první řádek následující:

%PDF-1.2

4.2.2. Tělo - body

Tělo PDF dokumentu se skládá z posloupnosti nepřímých objektů. Nepřímé objekty (fonty, stránky, obrázky, ...) kompletně popisují vzhled dokumentu.

Komentáře jsou uvozeny znakem % na začátku řádky a jsou zakončeny koncem řádky. Mohou se vyskytovat kdekoliv v těle dokumentu.

4.2.3. Tabulka křížových odkazů

Tabulka křížových odkazů - cross-reference table obsahuje informace, které umožňují rychlý přístupnepřímým objektům v souboru. Pro každý nepřímý objekt souboru obsahuje tabulka jeden řádek, v němž je popsáno umístění objektu.

Každý PDF dokument obsahuje jednu tabulku křížových odkazů. Tabulka se může skládat z více sekcí. Jestliže v souboru nebyly prováděny žádné modifikace, obsahuje dokument jen jednu sekci. S každou provedenou úpravou dokumentu se přidá nová sekce do tabulky křížových odkazů.

Sekce tabulky má přesně určený formát. Její definice začíná klíčovým slovem xref. Za ním je jedna nebo více podsekcí:

<cross-reference section>:==
xref
<cross-reference subsection>+

Organizace sekcí do podsekcí umožňuje jednoduchou tvorbu nové tabulky křížových odkazů po provedení úprav v dokumentu. Do nové sekce jsou vždy přidány odkazy pouze na objekty, které byly modifikovány nebo odstraněny.

Na začátku každé podsekce je hlavička obsahující dvě položky - číslo prvního objektu v podsekci a počet objektů, na které se v podsekci odkazuje. Za hlavičkou jsou umístěny jednotlivé odkazy, každý je právě na jedné řádce:

<cross-reference subsection>:==
<object number of first entry in subsection>
<number of entries in subsection>
<cross-reference entry>+

Každý záznam v podsekci zabírá přesně 20 znaků (včetně znaků pro ukončení řádky). Existují dva formáty záznamů: první označuje objekt, který je v dokumentu používán - in-use entry, druhý odkazuje na odstraněný objekt - free entry:

<cross-reference entry> ::=
<in-use entry> | <free entry>

U objektu, který je používán, obsahuje záznam informaci o pozici objektu v souboru - offset bytu (počet bytů v souboru před začátkem odkazovaného objektu), generační číslo a klíčové slovo n.

<in-use entry> ::=
<byte offset>
<generation number>
n

Offset bytu je desetimístné číslo (případně je nutno jej doplnit zleva nulami). V zápisu je od generačního čísla odděleno jednou mezerou. Generační číslo je pětimístné číslo (také zleva doplněno nulami). Za ním je mezera a identifikátor n. Na závěr následuje označení konce řádky. Je-li konec řádky označen jen jediním znakem, musí mu předcházet v zápisu mezera.

Odkaz na objekt, který byl smazán obsahuje číslo dalšího smazaného objektu v dokumentu, generační číslo a klíčové slovo f:

<free entry> ::=
<object number of next free object>
<generation number>
f

Zápis má shodný formát jako u používaného objektu: desetimístné číslo objektu, mezera, pětimístné generační číslo, mezera, identifikátor f a označení konce řádky.

Ze způsobu záznamu smazaných objektů je zřejmé, že všechny smazané objektu dokumentu tvoří spojený seznam. První záznam v tabulce křížových odkazů (objekt číslo 0) je vždy prázdný a má generační číslo 65535. Tento záznam je první položkou v seznamu smazaných objektů. Poslední záznam v seznamu používá číslo 0 jako odkaz na další smazaný objekt.

Jestliže je při editaci dokumentu vymazán nepřímý objekt, je v tabulce křížových odkazů označen odkaz na tento objekt jako na smazaný. Zároveň je generační číslo v záznamu zvětšeno o jedna. Pokud je objekt se stejným číslem znovu vytvořen, je mu přiřazeno toto zvětšené generační číslo. Maximální hodnota generačního čísla je 65535. Jakmile objekt dosáhne této maximální hodnoty, není jej možné v dokumentu nadále používat.

Příklad sekce tabulky křížových odkazů s jednoduchou podsekcí:

xref
0 6
0000000003 65535 f
0000000017 00000 n
0000000081 00000 n
0000000000 00007 f
0000000331 00000 n
0000000409 00000 n

V příkladu jsou odkazovány čtyři používané objekty a dva smazané (objekty číslo 0 a 3). Pokud bude v budoucnu vytvořen v dokumentu objekt s číslem 3, bude mu přiřazeno generační číslo 7.

Příklad sekce tabulky křížových odkazů se čtyřmi podsekcemi:

xref
0 1
0000000000 65535 f
3 1
0000025325 00000 n
23 2
0000025518 00002 n
0000025635 00000 n
30 1
0000025777 00000 n

V příkladu byl objekt číslo 23 (definován ve třetí podsekci) znovu použit po předchozím vymazání (jak je patrno z generačního čísla hodnoty 2).

4.2.4. Pata

Pata - trailer je poslední částí souboru PDF. Slouží k rychlému nalezení tabulky křížových odkazů a některých důležitých objektů v dokumentu.

Platí, že aplikace by měly číst PDF soubor od jeho konce. Poslední řádek PDF souboru obsahuje značku konce souboru: %%EOF. Dva předcházející řádky obsahují postupně klíčové slovo startxref a offset bytu od začátku souboru ke klíčovému slovu xref z poslední sekce tabulky křížových odkazů v dokumentu.

Před těmito řádky je umístěn trailer dictionary. Ten obsahuje klíčové slovo trailer následované dvojicemi klíč-hodnota:

<trailer> ::= trailer
<<
<trailer key-value pair>+
>>

4.2.5. Přehled hodnot v trailer-dictionary

  • Size (povinné)
    Celkový počet záznamů v tabulce křížových odkazů. Počet zahrnuje všechny záznamy v dokumentu - tedy ze všech sekcí tabulky.
  • Prev (jen u souboru s více sekcemi tabulky křížových odkazů)
    Offset bytu od začátku souboru k předešlé sekci tabulky.
  • Root (povinné, nepřímý odkaz)
    Odkaz na objekt katalog (viz dále).
  • Info (nepovinné, nepřímý odkaz)
    Odkaz na informace o dokumentu.
  • ID (povinné)
    Pole dvou objektů string. Touto dvojicí je určena verze dokumentu. První string je založen při vytvoření dokumentu, druhý je změněn při každé modifikaci dokumentu.
  • Encrypt (nepovinné)
    Pokud je dokument zašifrován, obsahuje informace pro jeho dešifrování.

Příklad jednoduchého objektu trailer:

trailer
<<
/Size 22
/Root 2 0 R
/Info 1 0 R
>>
startxref
18799
%%EOF

Je zřejmé, že dokument s touto patou nebyl dosud modifikován, neboű neobsahuje odkaz na předchozí sekci tabulky křížových odkazů (obsahuje jen jednu - původní).

4.3. Modifikace dokumentu

Obsah PDF dokumentu může být modifikován bez přepsání původního souboru. Veškeré záznamy o editaci jsou zapisovány na konec souboru jako příloha původní verze. Jestliže je PDF dokument modifikován, jsou do nové sekce tabulky křížových odkazů přidány odkazy na modifikované a vytvořené objekty. Do nové sekce je také přidán odkaz na objekt číslo 0. Zároveň je na konci souboru vytvořen nový trailer.

<Updated PDF file> ::=
<PDF file>
<update>*
<update> ::= <body>
<cross-reference section>
<trailer>

Při modifikaci objektů se může stát, že jejich jednotlivé verze jsou v dokumentu uloženy pod stejným ID (stejným číslem objektu a generačním číslem). To ale není na závadu, neboű údaje o objektech jsou vždy čteny od poslední sekce tabulky křížových odkazů. Údaje z dříve čtených sekcí nejsou přepisovány údaji z později čtených sekcích.

4.4. Šifrování dokumentu

Dokument PDF je možné zašifrovat a ochránit jej tak před neuatorizovaným přístupem. V dokumentu jsou šifrovány jen znaky v objektech string a stream. Ostatní data šifrována nejsou. To umožňuje zakrytí obsahové stránky dokumentu a zároveň ponechává přístup ke struktuře souboru.


Predchozi
Converted by Selathco 0.85 on 08.06.1999 11:18
Dalsi