PDF není formát dokumentu tak, jako je jím Word nebo RTF. Tyto formáty ukládají sekvenci obsahu, kterou renderer interpretuje v okamžiku zobrazení, takže výstup závisí na tom, jaké fonty a vykreslovací mechanismus se zrovna vyskytují. PDF ukládá výsledek tohoto procesu: přesné pokyny pro vykreslení, programy fontů, komprimované obrazové streamy a graf objektů, který je spojuje do samostatného popisu každé stránky. Soubor nese dost informací na to, aby identicky reprodukoval každou stránku na kterémkoli vyhovujícím rendereru, což je zároveň jeho hlavní návrhový cíl i zdroj většiny složitosti, na kterou narazíte, když se jej pokoušíte programově generovat, parsovat nebo upravovat
Objektový model
Každý PDF je sbírka číslovaných objektů. Objekt může být boolean, celé číslo, reálné číslo, název, řetězec, pole, slovník, stream nebo null. Téměř vše zajímavé je slovník, což je množina párů klíč–hodnota, kde klíče jsou názvy a hodnoty jsou jakýkoli jiný typ objektu, včetně odkazů na jiné objekty podle čísla a čísla generace. Stream je slovník následovaný sekvencí bajtů, typicky komprimovanou
Kořenem je slovník katalogu. Ten odkazuje na strom stránek, který uspořádá slovníky stránek do vyvážené stromové struktury místo plochého seznamu, takže přechod na stránku 5 000 z dokumentu o 10 000 stránkách nevyžaduje procházení každého předchozího deskriptoru stránky. Každý slovník stránky odkazuje na své toky obsahu (jednu nebo více sekvencí operátorů popisujících stránku), svůj slovník zdrojů (který zase odkazuje na deskriptory fontů, barevné prostory a obrázkové XObjekty) a svůj media box (souřadnicový prostor, ve kterém stránka žije). Počátek souřadnic je v levém dolním rohu, s kladným Y rostoucím nahoru, v jednotkách 1/72 palce
Na konci souboru sedí tabulka křížových odkazů, která mapuje každé číslo objektu na jeho pozici v bajtech v souboru. Právě to umožňuje náhodný přístup: prohlížeč nejprve přečte tabulku křížových odkazů a poté přejde přímo na objekty, které potřebuje. PDF 1.5 zavedlo toky křížových odkazů, které tabulku zkomprimují do stream objektu a související objekty zabalí do objektových toků, což citelně zmenšuje velikost souboru u dokumentů s mnoha malými objekty
Toky obsahu a grafický model
Vizuální obsah stránky žije v jednom nebo více tocích obsahu. Každý stream je sekvence operátorů PDF proložená jejich operandy. Textový operátor BT zahajuje textový objekt, Tf vybírá font a velikost ze slovníku zdrojů, Td umisťuje textový kurzor, Tj nebo TJ vykresluje řetězec a ET uzavírá textový objekt. Vektorová grafika se řídí podobným vzorem: m nastavuje počáteční bod cesty, l přidává úsečku, c přidává Bezierovu křivku a f nebo S vyplňuje nebo obtahuje cestu
Grafický stav řídí vše, co se děje mezi operátory: aktuální transformační matici, tloušťku čáry, barevný prostor, barvu výplně, barvu obrysu a ořezovou cestu. Operátory jako q a Q ukládají a obnovují grafický stav na zásobník, čímž PDF implementuje lokální souřadnicové transformace a dočasná přepsání stavu, aniž by ovlivnily okolní kontext. Formulářové XObjekty toto zobecňují: samostatný tok obsahu s vlastním slovníkem zdrojů, který lze na stránku vykreslit na libovolné pozici a v libovolném měřítku jediným operátorem Do
Vkládání fontů a extrakce textu
PDF může odkazovat na fonty podle názvu a spoléhat na to, že prohlížeč něco nahradí, ale v praxi musí každý dokument, který chcete sdílet, vkládat data fontu. Font Type 1 nebo TrueType/OpenType vložený do PDF nese slovník deskriptoru fontu odkazující na stream se souborem fontu. U fontů TrueType tento stream obsahuje binární program fontu; u Type 1 jsou to data PFB. Subsetting, který dělá každý seriózní generátor PDF, odstraní glyfy, na které dokument neodkazuje, čímž udrží velikost souboru zvládnutelnou i u velkých Unicode fontů
Extrakce textu je místo, kde se vkládání fontů vymstí. Vizuální podobu znaku určuje glyf ve vloženém programu fontu. Hodnotu Unicode tohoto znaku určuje stream ToUnicode CMap připojený ke slovníku fontu. Když stream ToUnicode CMap chybí nebo je nesprávný, prohlížeč PDF dokáže text vykreslit čitelně, ale nedokáže jej extrahovat jako smysluplný Unicode, a proto kopírování a vkládání z některých PDF souborů produkuje nesmysly. Označkované PDF (Tagged PDF, ISO 32000 §14.8) přidává druhou vrstvu: strom logické struktury, který mapuje obsah stránky na sémantické role dokumentu jako odstavce, nadpisy a buňky tabulky. Čtečky obrazovky a mechanismy pro znovutok používají strom struktury místo pořadí v surovém toku obsahu, což vysvětluje, proč vizuálně dobře rozvržené PDF může být stále nepřístupné, pokud označkování chybí nebo je chybné
Přírůstkové aktualizace a digitální podpisy
Když uložíte změny existujícího PDF, aniž byste jej přepisovali od základu, nové objekty se připojí za tělo původního souboru spolu s novou sekcí křížových odkazů a novým slovníkem trailer. Aktualizovaný trailer odkazuje na nová data křížových odkazů a nahrazené objekty zůstávají v souboru, ale nový řetězec křížových odkazů na ně jednoduše neodkazuje. Toto je přírůstková aktualizace a má dva významné důsledky
Zaprvé, soubor roste s každým cyklem ukládání. Dokument opakovaně upravovaný a ukládaný nahromadí vrstvy zastaralých objektů. Nástroje jako QPDF dokážou soubor linearizovat nebo zkomprimovat a přepsat, aby tento prostor uvolnily, ale výchozím chováním je hromadění. Zadruhé, digitální podpisy se pro svůj model integrity spoléhají právě na přírůstkové aktualizace. Podpis podle ISO 32000 pokrývá rozsah bajtů souboru, typicky vše kromě zástupného místa pro samotnou hodnotu podpisu. Jakékoli změny po podepsání, které se objeví jako další přírůstkové aktualizace, jsou pro ověřující čtečku viditelné jako úpravy provedené po podpisu, což je přesně ta stopa pro audit, kterou chcete. To ale také znamená, že určité úpravy, jako přidání schvalovacího podpisu nebo vyplnění polí formuláře, jsou standardem výslovně povoleny, aniž by zneplatnily původní podpis, pokud tyto změny odpovídají nastavení oprávnění dokumentu (ISO 32000-2 §12.7.6). Úprava, která spadá mimo tato oprávnění, je označena jako neautorizovaná. Na správném rozlišení záleží, když generujete dokumenty, které budou později spolupodepsány
Úrovně shody a vývoj normy ISO 32000
PDF začalo v roce 1993 jako proprietární formát Adobe, převzalo zobrazovací model PostScriptu a v průběhu patnácti verzí nahromadilo funkce: šifrování ve verzi 1.1, interaktivní formuláře ve verzi 1.2, digitální podpisy a logickou strukturu ve verzi 1.3, průhlednost ve verzi 1.4, objektové toky ve verzi 1.5, šifrování AES ve verzi 1.6. Adobe předalo PDF 1.7 organizaci ISO v roce 2007, výsledkem byla norma ISO 32000-1:2008. ISO 32000-2:2020 pokrývá PDF 2.0, které zpřesnilo několik nedostatečně specifikovaných oblastí, revidovalo odvození klíče AES-256 (revize 6 nahrazující revizi 5) a přidalo výslovnou podporu pro přidružené soubory a bohatá média
Podnormy vycházejí ze stejného základu. PDF/A (ISO 19005) vyměňuje funkce za archivní stabilitu: žádné šifrování, žádné závislosti na externím obsahu, všechny fonty vložené, barevné prostory nezávislé na zařízení, povinná metadata XMP. PDF/A-1 vychází z PDF 1.4, PDF/A-2 z PDF 1.7, PDF/A-3 dovoluje vložené soubory jakéhokoli formátu. PDF/X (ISO 15930) je podmnožina pro tiskovou produkci: výstupní záměry, spadávka a ořezové boxy, žádná průhlednost ve starších úrovních shody. PDF/UA (ISO 14289) vyžaduje označkovanou strukturu, mapování Unicode a jazyková metadata kvůli přístupnosti. Nejde o konkurenční formáty; jsou to sady dodatečných omezení nad jádrem PDF, a jediný soubor může vyhovovat více z nich současně, pokud si omezení neodporují
Pro každého, kdo píše kód generující nebo zpracovávající PDF, je praktickým základem norma ISO 32000-2 s pečlivou pozorností věnovanou oddílům pokrývajícím model křížových odkazů (§7.5), grafický stav (§8.4), operátory textového stavu (§9.3), deskriptory fontů a ToUnicode (§9.6 a §9.10), interaktivní formuláře (§12.7) a digitální podpisy (§12.8). Norma je dlouhá, ale většina programové práce s PDF se opakovaně dotýká jen úzkého výseku z ní. Pochopení objektového modelu a mechanismu křížových odkazů je vstupním bodem; vše ostatní je od té chvíle specializace