Vladimír Kraus: PDF
Predchozi (Obsah) Dalsi

3. Struktura formátu PDF

Formát PDF se skládá ze čtyř částí:

  • popisu objektů dokumentu - až na několik výjimek jsou shodné s datovými objekty v PostScriptu,
  • popisu struktury souboru - zde je popsáno, jak jsou objekty v PDF souboru uloženy, jakým způsobem se k nim přistupuje a jak se aktualizují,
  • popisu struktury dokumentu - zde je popsán způsob, jakým se mají v dokumentu reprezentovat objekty (stránky, odkazy, fonty),
  • popisu stránky - je nezávislý na předchozích částech.

3.1. Souřadný systém

Souřadný systém formátu PDF definuje plochu, na níž jsou kresleny jednotlivé objekty. Určuje pozici, orientaci a velikost textu, grafiky i obrázků dokumentu.

PDF podporuje několik souřadných systémů. Většina je shodná se souřadnými systémy PostScriptu.

Každé zařízení, na kterém je dokument PDF zobrazován, má svůj vlastní souřadný systém. Tímto systémem je určena plocha zařízení - device space - na níž je dokument vykreslován.

Formát PDF má být nezávislý na použitém výstupním zařízení. Z toho plyne, že musí používat svůj vlastní souřadný systém - user space. Při zobrazování dokumentu se souřadnice a rozměry objektů konvertují z user space do device space. K tomu se používá transformační matice CTM (Current Transformation Matrix). Touto maticí jsou násobeny souřadnice všech zobrazovaných objektů.

Standardní nastavení user space používá rozlišení 72 jednotek (points) na palec. Kladný směr osy Y je orientován vzhůru a kladný směr osy X vpravo.

Oblast, kam je zobrazován text, se nazývá text space. Transformace souřadnic z text space do user space je prováděna pomocí matice text matrix.

Jednotlivé znaky fontu jsou definovány v oblasti character space. Transformace z character space do text space je určena maticí character matrix. Pro většinu fontů jsou prvky matice předdefinovány. Výjimkou je velikost zvětšení - ta se počítá se změnou velikosti písma.

Obrázky dokumentu jsou zobrazovány v oblasti image space. Transformace z image space do user space je předdefinována a nelze ji měnit. Obrázky jsou vždy interpretovány kompletně pixel po pixelu.

3.2. Transformace souřadnic

Transformační matice popisují zvětšení, rotaci a posunutí zobrazovaných objektů. Matice jsou v PDF (a rovněž v PostScriptu) popsány šesticí hodnot:

  • posunutí je popsáno maticí [1, 0, 0, 1, tx, ty], kde tx, ty jsou souřadnice udávající vektor posunutí.
  • zvětšení generuje matice [sx, 0, 0, sy, 0, 0]. Hodnoty sx a sy udávají novou velikost jednotek na osách x a y v měřítku původního nastavení.
  • rotace je definována maticí [cos(theta), sin(theta), -sin(theta), cos(theta), 0, 0] - odpovídá rotaci o úhel theta proti směru hodinových ručiček.
  • zešikmení se provádí maticí [1, tg(alpha), tg(beta), 1, 0, 0]. Tím se zešikmí osa x o úhel alpha a osa y o úhel beta.

Pokud je provedeno více transformací za sebou, je vždy nová transformace provedena v souřadném systému, který byl nastaven předchozí operací. Zde je vhodné podotknout, že při užití více transformací závisí výsledek na pořadí jejich provádění. Aby bylo dosaženo kýženého cíle, je doporučeno provádět typy transformací v tomto pořadí: posunutí, rotace, zvětšení, zešikmení.

3.3. Objekty

Objekty podporované formátem PDF jsou podobné objektům PostScriptu. Standard PDF rozlišuje sedm základních typů objektů: boolean, number, string, name, array, dictionary, stream a null (prázdný) objekt. Objekty je dovoleno pojmenovat - pak je možné se na ně odkazovat z jiných objektů. Pojmenovaný objekt se nazývá indirect object.

V názvech všech objektů v dokumentu PDF jsou rozlišována malá a velká písmena.

3.3.1. Boolean

Je reprezentován identifikátory true a false.

3.3.2. Number

PDF rozlišuje dva typy čísel - celé a desetinné číslo. Desetinné číslo je možné používat pouze ve formátu s desetinnou tečkou. Exponenciální tvar (např. 4.0E5) není dovolen.

3.3.3. String

String (řetězec) je sekvence znaků uzavřená v kulatých závorkách. Jestliže se string nevejde na jednu řádku, je možné jej rozdělit na více řádek pomocí zpětného lomítka ( \ ) na konci řádky.

Pokud se zpětné lomítko vyskytuje uprostřed řádky, je bezprostředně následující znak součástí stringu. Takto je možné do stringu začlenit uzavírací kulatou závorku, znak zpětného lomítka nebo jakýkoliv netisknutelný ASCII znak. Je možné použít i známé escape sekvence \n (konec řádky), \r (návrat na začátek řádky) či \t (tabulátor).

String je možné zapsat v hexadecimální podobě. To se provede zapsáním sekvence hexadecimální číslic uzavřených do závorek < >. Například <8ad1> je string o dvou znacích s ASCII hodnotami 8a a d1.

3.3.4. Name

Pomocí name (jméno) je možné pojmenovávat objekty. Stejně jako string se name skládá ze sekvence znaků. Name musí začínat lomítkem (/) a na rozdíl od stringu je zde omezen výběr znaků, které mohou být použity. Jsou to znaky mezi ASCII hodnotami <21> a <7e> (standardní tisknutelné znaky - malá a velká písmena, číslice, ...) s výjimkou znaků %, (, ), <, >, [, ], {, }, / a #.

Příklady možných objektů name:

  • /Name1
  • /Ukazka*name

Od verze PDF 1.2 mohou navíc objekty name obsahovat znak s libovolnou hexadecimální hodnotou (s výjimkou <00>). Takový znak je reprezentován pomocí prefixu #, následovaným vlastní hexadecimální hodnotou. Například /A#42 odpovídá vyjádření /AB.

3.3.5. Array

Array (pole) je sekvence PDF objektů. Jedno pole může obsahovat více objektů navzájem různých typů.

Definice pole začíná levou závorkou [, za kterou následuje výčet objektů pole. Definice pole je zakončena závorkou ].

Příklad pole:

[/Hokej 99 (Gretzky)]

3.3.6. Dictionary

Dictionary (slovník) obsahuje spárované dvojice objektů. První objekt každé dvojice je key (klíč) a druhý objekt value (hodnota). Na rozdíl od PostScriptu musí být key objekt typu name. Value může být jakýkoliv objekt - včetně objektu dictionary.

Definice slovníku začíná sekvencí znaků <<. Za ní jsou vypsány dvojice objektů key-value. Definice je ukončena dvojicí znaků >>.

Příklad slovníku:

<< /Key1 /Value1 /Key2 222 >>

Slovníky jsou základní jednotkou dokumentů PDF. Je jimi reprezentováno mnoho částí PDF souboru - např. stránky a fonty.

3.3.7. Stream

Obsahem streamu (proudu), je podobně jako u stringu, sekvence jednotlivých znaků. Rozdíl je v mechanismu přístupu k těmto objektům. Zatímco string je čten celý najednou, ze streamu je čtena pouze část. Z tohoto důvodu jsou objekty stream vhodné pro uložení velkého množství dat - např. obrázků. Data streamu mohou být komprimována.

Stream je složen z objektu dictionary, identifikátoru stream a vlastního výčtu znaků streamu. Definice je zakončena identifikátorem endstream.

Příklad objektu stream:

<stream>::=<dictionary>
stream
{<řádka znaků>}*
endstream

Streamy musí být pojmenované objekty (indirect object). Naproti tomu dictionary musí být nepojmenovaný (direct object).

Od verze PDF 1.2 mohou být data tvořící stream uložena v externím souboru. Pak jsou znaky mezi identifikátory stream a endstream ignorovány.

3.3.8. Slovník objektu stream

Při vytváření objektu stream je nutné v definici použít objekt dictionary. Ten musí mít tyto části:

  • Length (povinné)
    Označuje délku dat streamu - přesněji počet znaků od první řádky za identifikátorem stream k identifikátoru endstream.
  • Filter (nepovinné)
    Určuje, jaké filtry se mají aplikovat při čtení streamu. Např. data kódovaná pomocí filtrů LZW a následně ASCII base-85 musí být dekódovaná pomocí dvojice key-value: /Filter [/ASCII85Decode /LZWDecode].
  • DecodeParms (nepovinné)
    Pro každý použitý filtr se zde mohou určit parametry potřebné pro jeho užití. Jestliže je použito více filtrů, musí být parametry uloženy v poli - každému filtru pak odpovídá jedna položka pole. Dostupné parametry jsou určeny použitým filtrem.
  • F (nepovinné)
    Odkaz na soubor, který obsahuje data streamu. Je-li soubor použit, jsou znaky mezi stream a endstream ignorovány. Hodnota Length ale musí stále obsahovat počet těchto znaků (typicky není žádný).
  • FFilter (nepovinné)
    Určuje, jaký filtr se má použít pro dekódování znaků z externího souboru.
  • FDecodeParms (nepovinné)
    Definuje parametry pro filtry používané pro externí soubor.

3.3.9. Indirect objects

Každý objekt může být pojmenován - pak se nazývá nepřímý objekt - indirect object. Užitečnost těchto objektů ukazuje příklad, kdy při použití streamu není dopředu známa jeho velikost. Pak je možné hodnotu Length (určující délku streamu) zapsat až za objekt stream formou právě nepřímého objektu.

Zápis nepřímého objektu se skládá z identifikátoru objektu, přímého objektu a klíčového slova endobj. Identifikátor objektu se skládá z čísla objektu - object number, celočíselného generačního čísla - generation number a klíčového slova obj:

<indirect object>::=
<object ID>
<direct object>
endobj
<object ID>::=
<object number>
<generation number>
obj

Dvojice číslo objektu a generační číslo slouží k jednoznačné identifikaci nepřímého objektu v dokumentu. Vytvořený objekt si tato dvě čísla ponechává nezměněná i po provedení modifikací v těle objektu.

Každému nepřímému objektu je v dokumentu přiřazeno unikátní (jedinečné) číslo objektu. Čísla nepřímých objektů se většinou v dokumentu přiřazují sekvenčně od čísla 1. Generační čísla jsou standardně nastavena na hodnotu 0. Mění se pouze v případě, kdy byl objekt smazán. Pomocí tohoto čísla je prováděno navracení změn - undo.

3.3.10. Odkazy mezi objekty

Každý objekt, který je použit ve výčtu prvků pole nebo slovníku, může být definován buď přímo (přímý objekt) nebo zapsán jako nepřímý odkaz - indirect reference. Nepřímý odkaz se odvolává na nepřímý objekt. Skládá se z čísla objektu, generačního čísla a klíčového slova R:

<indirect reference>::=
<object number>
<generation number>
R

Jestliže je v odkazu uveden neexistující objekt, není to považováno za chybu, ale za odkaz na nulový (prázdný) objekt.


Predchozi
Converted by Selathco 0.85 on 08.06.1999 11:18
Dalsi