PDFMove
Comment les images sont-elles stockées dans un PDF ? XObject, filtres et masques
Guide

Comment les images sont-elles stockées dans un PDF ? XObject, filtres et masques

9 min de lecture

La photo que vous voyez en ouvrant un PDF, comment est-elle présente à l'intérieur du fichier ? La réponse est plus complexe qu'il n'y paraît : les données d'image, l'information de couleur, le masque de transparence et l'information de placement sont stockés à des endroits distincts. Dans cet article, nous expliquons l'architecture de stockage des images du PDF et ce qu'elle implique pour l'extraction.

Image XObject : la structure de base

Dans un PDF, une image est stockée comme un objet nommé Image XObject. Cet objet se compose d'un dictionnaire et d'un flux de données :

<< /Type /XObject
   /Subtype /Image
   /Width 2400
   /Height 1800
   /ColorSpace /DeviceRGB
   /BitsPerComponent 8
   /Filter /DCTDecode
   /Length 458392
>>
stream
...(donnees JPEG)...
endstream

La signification des clés :

| Clé | Signification | |---|---| | /Width, /Height | Dimensions en pixels | | /ColorSpace | Espace colorimétrique (DeviceRGB, DeviceCMYK, DeviceGray, Indexed) | | /BitsPerComponent | Nombre de bits par canal (généralement 8) | | /Filter | Mode d'encodage des données | | /SMask | Le cas échéant, référence à l'objet masque de transparence | | /Decode | Si les valeurs de couleur doivent être inversées |

Point déterminant : ce dictionnaire n'indique pas où se trouve l'image sur la page. L'information de position et d'échelle réside dans le flux de contenu de la page :

q
400 0 0 300 100 500 cm     % matrice d'echelle et de position
/Im1 Do                    % dessiner l'image Im1
Q

Cette matrice signifie « dessine cette image sur 400 points de large et 300 de haut, à la position (100,500) ».

Cette séparation explique le comportement de l'extraction brute : l'extraction récupère l'objet image, pas son placement sur la page. Une image qui apparaît pivotée, rognée ou réduite sur la page ressort dans son état d'origine.

Les filtres : comment les données sont encodées

La clé /Filter indique avec quelle compression les données du flux sont encodées. Les plus courants :

/DCTDecode — compression JPEG. Les données du flux sont un véritable fichier JPEG. C'est un choix de conception astucieux du PDF : plutôt que de décoder et recompresser un JPEG à son insertion, il le stocke tel quel. Résultat : le fichier reste léger et aucune perte de qualité supplémentaire n'est introduite.

Lors d'une extraction brute, vous pouvez enregistrer ces données directement en .jpg — aucune conversion n'est nécessaire.

/FlateDecode — compression zlib/deflate sans perte. Une fois les données du flux décompressées, on obtient un tableau de pixels bruts. À l'extraction, il faut envelopper ces données dans un format utilisable (généralement le PNG) — car un tableau de pixels bruts n'est pas à lui seul un fichier image.

/JPXDecode — JPEG 2000. Rare mais employé dans certains systèmes de numérisation. Peut être extrait directement en .jp2, mais beaucoup de programmes ne savent pas ouvrir ce format.

/CCITTFaxDecode — compression fax, pour les documents scannés en noir et blanc. Très efficace ; le scan d'une page A4 peut ne peser que quelques dizaines de kilo-octets. À l'extraction, l'enveloppe TIFF est courante.

/JBIG2Decode — compression avancée pour le noir et blanc. Plus efficace que le CCITT mais moins largement prise en charge.

/LZWDecode — une ancienne compression sans perte, également employée en TIFF et en GIF.

Le format de sortie de l'outil d'extraction dépend de ce filtre. DCTDecode → JPEG, FlateDecode → PNG, CCITTFaxDecode → TIFF. C'est pourquoi un même PDF peut donner des fichiers dans différents formats.

Espaces colorimétriques et problèmes d'extraction

La clé /ColorSpace détermine l'interprétation colorimétrique de l'image :

/DeviceRGB — couleurs d'écran standard. Extraction sans problème.

/DeviceGray — niveaux de gris. Sans problème.

/DeviceCMYK — couleurs d'impression. C'est là que les problèmes commencent : beaucoup de visionneuses et de navigateurs ne savent pas ouvrir correctement les JPEG CMJN ou en affichent les couleurs inversées. De plus, certains JPEG CMJN suivent la convention d'encodage inversé d'Adobe et sont marqués par le tableau /Decode [1 0 1 0 1 0 1 0] — cette information réside dans l'objet image, pas dans le fichier JPEG extrait. Résultat : le fichier obtenu peut apparaître en négatif.

/Indexed — couleur par palette. Les données d'image contiennent des indices de palette et les couleurs réelles sont stockées dans un tableau de palette distinct. Si la palette n'est pas appliquée à l'extraction, l'image ressort dans des couleurs incohérentes.

/ICCBased — profil colorimétrique intégré. Pour des couleurs justes, le profil doit également être transféré.

C'est pourquoi les couleurs de certaines images peuvent paraître « fausses » après une extraction brute. Ce n'est pas un défaut ; c'est la conséquence du fait que l'information d'interprétation colorimétrique se trouve hors du fichier image.

La transparence : le mécanisme SMask

Dans un PDF, la transparence d'une image n'est pas incorporée à l'image. Elle est stockée dans un objet masque doux (soft mask) distinct :

/SMask 15 0 R

L'objet numéro 15 est une image en niveaux de gris de mêmes dimensions que l'image principale. La valeur de chaque pixel indique l'opacité à cet endroit : 0 pour totalement transparent, 255 pour totalement opaque.

Lors d'une extraction brute, ces deux objets sont trouvés séparément et ressortent dans des fichiers distincts. Résultat :

  • L'image principale arrive sans information de transparence, donc opaque. Un fond qui apparaissait transparent dans le PDF peut désormais apparaître noir ou blanc.
  • Le fichier de masque apparaît seul, comme une silhouette en noir et blanc. Ce n'est pas un fichier corrompu ; c'est le masque lui-même.

Pour retrouver la transparence, vous devez combiner les deux dans un éditeur d'images : ouvrez l'image principale, appliquez le masque comme canal alpha, enregistrez en PNG.

Il existe aussi une clé /Mask — utilisée pour un masque pochoir binaire (1 bit) ou un masquage par clé de couleur ; elle fonctionne différemment du SMask mais crée un problème de séparation analogue.

Pourquoi les images sont fragmentées

Situation fréquente à l'extraction brute : il y a une photo sur la page mais dix fichiers de bandes en ressortent.

La cause est la gestion mémoire du producteur de PDF. Plutôt que de traiter une très grande image d'un bloc, il la lit par bandes horizontales et l'écrit ainsi dans le fichier. Chaque bande devient un Image XObject distinct.

Elles paraissent unies sur la page parce que le flux de contenu place chaque bande à une position exactement contiguë :

q 612 80 0 0 0 712 cm /Im1 Do Q
q 612 80 0 0 0 632 cm /Im2 Do Q
q 612 80 0 0 0 552 cm /Im3 Do Q

Ce comportement s'observe surtout dans les logiciels de numérisation et dans les sorties PDF de certains programmes bureautiques.

Pour reconstituer l'image, il faut assembler les morceaux dans un éditeur. Vous pouvez deviner leur ordre d'après les numéros dans les noms de fichiers, mais sans garantie ; l'appariement visuel est plus fiable.

La notion de résolution effective

Dans un PDF, la « résolution » d'une image n'est pas une propriété fixe. Elle se calcule à partir du rapport de deux valeurs :

DPI effectif = largeur en pixels / largeur physique sur la page (en pouces)

Une image de 2400 pixels dessinée sur 8 pouces de large fait 300 DPI. Réduite à 4 pouces, elle fait 600 DPI.

Cela explique pourquoi l'extraction brute livre parfois des images d'une qualité surprenante : une photo qui paraît petite sur la page peut être en très haute résolution à l'origine. Lors de la production du PDF, l'image n'a pas été réduite, elle a seulement été placée sur une petite surface.

L'inverse est vrai aussi : si le PDF est passé par une compression, les images ont pu être réellement ramenées à une basse résolution, et l'extraction brute restituera cette basse résolution. Les pixels perdus ne reviennent pas.

Les images invisibles

L'extraction brute livre parfois des images que vous n'avez jamais vues sur la page. Les raisons :

  • Les zones situées hors d'un chemin de rognage. Seule une partie d'une image peut être affichée ; l'objet transporte l'ensemble.
  • Les images recouvertes. Un élément dessiné après a pu masquer celui du dessous.
  • Les éléments placés hors page. Le contenu situé hors de la MediaBox reste dans le fichier.
  • Les objets inutilisés. Après une modification, des images auxquelles plus aucune page ne fait référence peuvent subsister dans le fichier.

Ce dernier point est important pour la confidentialité : pour « supprimer » une image d'un PDF, il ne suffit pas de poser quelque chose par-dessus ; l'objet reste dans le fichier et l'extraction brute le trouvera.

Pourquoi les graphiques vectoriels ne peuvent pas être extraits

L'extraction brute ne trouve que les objets Image XObject. Les logos, schémas et graphiques d'un PDF sont généralement vectoriels — définis par des instructions de dessin dans le flux de contenu de la page, et non par un objet distinct.

Pour « extraire » un logo vectoriel, il faut une autre approche : convertir la page en SVG et y isoler le logo.

Un test simple pour trancher : zoomez fortement sur l'élément dans le PDF. S'il se pixellise, c'est du matriciel (extractible) ; s'il reste net, c'est du vectoriel (non extractible).

En résumé

Dans un PDF, chaque image est un objet Image XObject doté de son propre dictionnaire et de son propre flux de données, tandis que l'information de position et d'échelle réside dans le flux de contenu de la page. Cette séparation explique pourquoi l'extraction brute restitue l'image d'origine et non son aspect sur la page. Les données sont stockées, selon le filtre, comme un véritable JPEG (DCTDecode) ou comme des pixels bruts (FlateDecode) — le format d'extraction en dépend. La transparence résidant dans un objet SMask distinct, elle se perd à l'extraction et vous obtenez deux fichiers. Certains producteurs découpant les grandes images en bandes, une seule photo peut ressortir en de nombreux fichiers. Et les graphiques vectoriels échappent à ce mécanisme ; pour eux, il faut une conversion en SVG.

Questions fréquentes

Un JPEG contenu dans un PDF est-il réellement stocké en JPEG ?

Oui, les images encodées avec le filtre DCTDecode sont de véritables données JPEG et, une fois extraites du fichier, elles s'utilisent directement en .jpg. C'est un choix de conception astucieux du PDF : plutôt que de décoder et recompresser le JPEG, il le stocke tel quel, ce qui maintient le fichier léger sans perte de qualité supplémentaire. Les images stockées en FlateDecode sont en revanche des données de pixels brutes qu'il faut envelopper dans un format comme le PNG à l'extraction.

Comment la résolution d'une image est-elle déterminée dans un PDF ?

Elle se calcule à partir du rapport entre les dimensions en pixels de l'objet image (Width/Height) et la surface physique qu'il occupe sur la page. Si une image de 2400 pixels de large est dessinée sur 8 pouces de large, sa résolution effective est de 300 DPI. Réduite à 4 pouces, elle devient 600 DPI. Autrement dit, la « résolution » d'une image dans un PDF n'est pas une propriété fixe mais un résultat dépendant de l'échelle de placement.

Pourquoi certaines images sont-elles découpées en bandes horizontales ?

Généralement par souci d'efficacité mémoire. Les logiciels de numérisation et certains producteurs de PDF, plutôt que de charger en mémoire une très grande image entière, la traitent bande par bande et l'écrivent ainsi dans le fichier. Elles paraissent unies sur la page car les bandes sont placées à des positions exactement contiguës. L'extraction brute trouve chaque bande comme un objet distinct et la restitue dans un fichier séparé.

Qu'est-ce qu'un SMask et pourquoi ressort-il dans un fichier séparé ?

Le SMask (soft mask) est une image en niveaux de gris distincte qui porte l'information de transparence d'une image. Elle indique par une valeur de 0 à 255 le degré de transparence de chaque pixel. Comme la transparence n'est pas incorporée à l'image elle-même mais stockée dans cet objet séparé, l'extraction brute restitue les deux dans des fichiers distincts et la transparence est perdue. Pour la retrouver, il faut les combiner dans un éditeur.

Essayez dès maintenant avec PDF'ten Görsel Çıkar (Ham).

Essayer PDF'ten Görsel Çıkar (Ham)