Structure et construction d'un fichier PDF
Généralités
Le format PDF ( portable document format ) est une invention d'Adobe. C'est le format d'origine des produits de la famille Acrobat ( reader, writer, … ). Le but de cette famille de produit est de pouvoir permettre aux utilisateurs de travailler, de visionner et d'échanger des fichiers de façon simple, efficace et indépendamment de l'environnement dans lesquels ils sont produits. Dans ce document nous allons nous intéresser à quelques propriétés des fichiers PDF. Actuellement la dernière version du PDF est la 1.7.
Propriétés du PDF
Dans un PDF, il est possible de gèrer des objets en 3 dimensions. On peut placer des éléments interactifs, tel des annotiations qui n'apparaisent pas à l'impression. Il existe un certain nombre de composants qui facilitent l'accessibilité en permettant de structurer les pages en champs, corps de page, entête, pied de page,… La navigation est aisée. On peut faire plusieurs versions d'un document à l'intérieur d'un PDF. Il est possible de sécuriser un document PDF en le cryptant ou en le signant. Evidement, le format est lisible sur une multitude de plateformes, il consomme peu de place sur le disque ainsi qu'en mémoire et il transite facilement à travers un réseau.
Pour mieux comprendre ces propriétés, prenons un exemple. Ci-dessous le code source d'un PDF. L'aperçu de ce fichier donne un “Hello World” bleu positionné en haut à gauche.
%PDF-1. 4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [ 0 0 612 792 ] /Contents 5 0 R /Resources << /ProcSet 6 0 R /Font << /F1 7 0 R >> >> >> endobj 5 0 obj << /Length 84 >> stream BT /F1 24 Tf 1.0 0 0 0 k 100 600 Td ( Hello World ) Tj ET endstream endobj 6 0 obj [ /PDF /Text ] endobj 7 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /MacRomanEncoding >> endobj xref 0 8 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000179 00000 n 0000000364 00000 n 0000000466 00000 n 0000000507 00000 n trailer << /Size 8 /Root 1 0 R >> startxref 636 %%EOF
Pour comprendre comment un PDF permet de faire tant de choses, il faut l'ausculter sous 4 points de vus différents: du point de vue de ses objets, du point de vue de sa structure de fichier, du point de vue de sa structure de document et du point de vue de son contenu. Dans un PDF, les objets sont des unités qui permettent de stocker une partie de l'information. La structure spéciale d'un fichier PDF permet de stocker et d'atteindre ces objets. La structure d'un document permet d'associer à un type de base sa fonction ( soit il contient du contenu, soit c'est une police de caractère, … ). Le contenu est finalement une série d'instructions qui permettent de décrire et d'afficher la page.
Les objets
Dans un PDF la définition d'un objet est balisée. La balise ouvrante est de la forme “xx yy obj”, avec xx un entier et yy un entier jusqu'à 65535. La balise fermante est “endobj”. Dans notre exemple, il y a 7 objets numérotés de 1 à 7. Le premier chiffre d'un objet est son indentifiant. Le second chiffre est son générateur. Ces objets stockés dans le fichier peuvent être appelés en mémoire et consultés ou éxécutés. A l'intérieur d'un fichier PDF les objets peuvent se référencer les un les autres. Il est possible de catégoriser les objets en 8 types de base: les objets booleen, les numériques, les chaînes, les noms, les tableaux, les dictionnaires, les flux et l'objet null. Ces quelques notions sont expliquées dans la suite du document.
Structure d'un fichier PDF
Un fichier PDF est une suite d'octet. Il peut être complètement encodé en ASCII pour des besoins de portabilité, mais ce n'est pas forcé. Un fichier PDF se compose d'un entête, d'un corps, d'une table des références croisées ( xref ) et d'un “trailer”.
#########
entête
#########
corps
#########
xref
#########
trailer
#########
Dans notre exemple, l'entête du document est ”%PDF-1.4”, ce qui signife que le document est du PDF 1.4. Les objets sont stockés dans le corps du document. La table des références croisées commence avec la balise “xref”. Toujours dans l'exemple, la seconde ligne de la table indique que les objets commencent à 0 et que la longueur est de 8. La ligne suivante précise que l'objet 0 est libre (f pour free). Ensuite l'objet 1 est occupé et se trouve au 9ème octet dans le fichier, l'objet 2 est occupé et se trouve au 74ème octet dans le fichier, … Cette table permet un accès rapide aux objets, si elle n'est pas correcte, le fichier PDF ne fonctionne pas. Tout à la fin, le “trailer” dispose d'informations comme le premier objet à lire, … En général, il convient de commencer à lire un PDF par la fin. Un fichier PDF avec plusieurs version est un PDF qui possède des corps, des tables de références croisées et des trailers mis les uns derrière les autres.
#########
entête
#########
corps1
#########
xref1
#########
trailer1
#########
corps2
#########
xref2
#########
trailer2
#########
La structure du document
Le PDF permet de donner une structure aux documents. Pour ce faire il utilise les objets. Par exemple, lors de la définition d'un catalogue pour un document, comme ci-dessous (extrait du premier exemple) :
1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
Le bout de code ci-dessus représente l'objet 1. Cet objet est de type dictionnaire. Il comprend une série de paires clés valeurs comprises entre les signes ”«” et ”»”. La première clée est “Type” et la valeur est un objet de type nom qui contient la valeur “Catalog”. La seconde clée est “Outlines” et elle a comme valeur un objet indirect noté “2 0 R” qui indentifie l'objet 2 générateur 0 comme le conteneur de la valeur de cette entrée “Outlines”. L'entrée “Pages” est aussi une référence à un objet indirect. Ces trois entrées sont capitales pour un PDF. Cependant elle ne contiennent pas d'informations de contenu, mais des informations de structure. Par exemple l'entrée “Pages” qui est explicitée dans l'objet “3 0” ci-dessous :
3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj
Cet objet informe que le document contient un total “Count” de une page référencé dans le tableau d'objet indirect ”[4 0 R]”. Si on suit la filliation, pour aller voir dans l'objet “4 0” :
4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [ 0 0 612 792 ] /Contents 5 0 R /Resources << /ProcSet 6 0 R /Font << /F1 7 0 R >> >> >> endobj
Dans cet objet, on s'approche de plus en plus du contenu. D'ailleurs il est clairement identifié comme étant décrit dans l'objet “5 0” ( voir l'entrée “Contents” ). De plus il y a des définitions supplèmentaires comme la police nommée F1 ( entrée “Font” ). Le PDF encapsule les diverses définitions et le contenu dans la structure d'un document. Ceci permet un plus grand degré de liberté sur le contenu: la clé pour lire un document est identique, même si le contenu est crypté, compressé, …
Le contenu du document
Le contenu d'un document PDF peut être de beaucoup de types: image, texte, vidéo, … Pour permettre cette intégration, il est important de pouvoir coder, décoder, compresser et décompresser différents types de données binaires. Ainsi le PDF permet plusieurs méthode de filtrage. Ce document ne traite pas ces méthodes d'encapsulation du contenu dans un PDF. Dans l'exemple ci-dessus, l'objet “5 0” est le contenu du document PDF.
5 0 obj << /Length 84 >> stream BT /F1 24 Tf 1.0 0 0 0 k 100 600 Td ( Hello World ) Tj ET endstream endobj
Cet objet est un flux. Il est composé d'un dictionnaire suivit de données. Les données sont comprises entre les balises “stream” et “endstream”. Dans ce cas, les données sont un texte clair qui correspond à la description de la page en langage postscript. Un vrai fichier PDF aurait entre ces balises un contenu compressé ou encodé.
Conclusion
Grâce à un structure de fichier spéciale ainsi qu'a l'utilisation d'objets et ainsi qu'à l'encapsulation du contenu dans la structure du document le PDF réussit à être un format de travail efficace.
Références
Liens
Source
