PDF (Portable Document Format)

C'est le format qui est en passe de suplanter le PostScript.
Les principales différences entre les formats PDF et PostScript sont les suivantes :
- le PDF est plus simple, c'est un langage de description de page et pas un vrai langage de programmation ;
- un fichier PDF n'est pas nécessairement linéaire : il y a des pointeurs dans tous les sens, les informations dont on ne dispose pas tout de suite peuvent être mentionnées plus tard.
Il y a quelques autres différences anecdotiques :
- il est possible de mettre à jour un fichier PDF en rajoutant simplement des choses à la fin ;
- il est possible de compresser certains morceaux du fichier (images, ou même texte), voire même de les crypter (RSA) ;
- il y a plein d'« édulcorants interactifs » (on peut mettre des boutons, des formulaires, des animations, du son, des hyperliens, faire apparaitre des fenêtres, etc.) ;
- Il n'est pas nécessaire d'inclure les fontes « normales » (textuelles), si elles ne sont pas présentes, Acroread va tenter de les émuler à l'aide de fontes MultiMaster.

QUELQUES TYPES D'OBJETS EN PDF

DICTIONNAIRES

(Dans d'autres langages, on parlerait de table de hachage ou de tableau associatif.)
  <<
    /Key1 123
    /Key2 (abc)
    /Key3 /foobar
    /Key4 << /a 1 /b 17 /z (xyz) >>
  >>
La plupart des dictionnaires que l'on rencontre en PDF on une clef /Type (et parfois aussi /Subtype).

FLUX (STREAMS, en anglais)

  << 
    /Length 528
    /Filter [ /ASCII85Decode /LZWDecode ]
  >>
  stream
    ... % unreadable data
  endstream

OBJETS INDIRECTS ET REFERENCES
  7 0 obj % Définition de la version 0 de l'objet 7
  <<
    /Length 
    8 0 R % Référence à la version 0 de l'objet 8
  >>
  stream
    ...
  endstream
  endobj % Fin de l'objet 7
  8 0 obj % Définition de la version 0 de l'objet 8
    64
  endobj

STRUCTURE D'UN FICHIER PDF

EN-TETE

  %PDF-1.1

CORPS DU FICHIER

Plein d'objets indirects, décrivant les fontes, les pages, les images.

TABLE DES REFERENCES, TRAILER ET FIN DU FICHIER

Pour savoir où se trouve la définition d'un objet dont on n'a que le numéro, on utilise la table des références, qui nous dit à quelle position dans le fichier se trouvent les divers objets. Je n'ai pas vraiment cherché à comprendre la syntaxe exacte.
  xref 0 6
  00000003 65535 f
  00000017 00000 n
  00000081 00000 n
  00000000 00007 f
  00000331 00000 n
  00000409 00000 n

  trailer
  <<
    /Size 22     % Nombre d'éntrées dans la table de références
    /Root 2 0 R  % catalogue du document
  >>

  % Position de la table de références dans le fichier
  startxref 18700 
  %%EOF

CATALOGUE
C'est le dictionnaire décrivant la structure du fichier (on peut aussi préciser s'il faut une barre de menus, etc.)
  1 0 obj 
  <<
    /Type /Catalog
    /Pages 2 0 R % Référence vers l'arbre des pages (par exemple, un arbre balancé...)
    /Outlines 3 0 R
    /PageMode /UseOutlines
  >>
  endobj

NOEUD DE L'ARBRE DES PAGES
  2 0 obj
  <<
    /Type /Pages
    /Kids [ 4 0 R  10 0 R  24 0 R ]
    /Count 3
  >>
  endobj

PAGE
  3 0 obj
  <<
    /Type /Page
    /parent 4 0 R
    /MediaBox [0 0 612 792]
    /Ressources <<
      /Font << /F3 7 0 R  /F5 9 0 R  /F7 11 0 R >>
      /ProcSet [/PDF]
    >>
    /Thumb 12 0 R
    /Contents 14 0 R
    /Annotes [23 0 R  24 0 R]
  >>

FORMULAIRE

BOUTONS

SONS

FONTES
Il peut s'agir, par exemple, de fontes PostScript de type 1 ou 3, de morceaux de fontes PostScript de type 1 (le nom de la fonte est alors du genre « EOODIA+Poetica »), de fontes True Type ou de fontes Multi Master.
  <<
    /Type /Font
    /Subtype /Type1 
    /FontDescriptor <<
      /Type /FontDescriptor
      ...
      /FontFile STREAM
    >>
  >>

IMAGES
  5 0 obj
  <<
    /Type /XObject
    /Subtype /Image
    ...
  >>
  stream
    ...
  endstream
  endobj

POSTSCRIPT
Ce n'est pas portable, mais on peut inclure des commandes PostScript arbitraires.
  <<
    /Type /XObject 
    /Subtype /PS
    ...
  >>

LINEARISATION
Un fichier PDF « linéarisé » est un fichier PDF « optimisé ».

Vincent Zoonekynd
<zoonek@math.jussieu.fr>
latest modification on lun mai 7 13:10:56 CEST 2001