TeX Live 2024 embarque un fichier nommé VPlayer.swf : 483 412 octets de Flash, modifié pour la dernière fois le 19 janvier 2018. Utilisez \includemedia du paquet media9 de LaTeX et ce fichier est intégré tel quel dans votre PDF — près d’un demi-méga-octet de lecteur, pour une seule vidéo, que plus rien ne peut exécuter. Flash a atteint sa fin de vie le 31 décembre 2020, et à partir du 12 janvier 2021 Adobe a lui-même bloqué la lecture des contenus Flash. Un PDF peut porter bien plus que des pages statiques — pièces jointes, calques, annotations, animation, vidéo — mais chacun de ces éléments se dégrade très différemment dans la nature. Cette page fait le tri, vérifications à l’appui avec pdfdetach et pdftotext.
Intégrer un fichier dans un PDF : attachfile2 face à embedfile
La différence tient à l’endroit du PDF où le fichier atterrit. Le \attachfile{data.csv} de attachfile2 pose sur la page une annotation /FileAttachment — l’icône de trombone. Le \embedfile{data.csv} de embedfile ne pose rien sur la page et inscrit le fichier dans l’arbre /EmbeddedFiles sous /Names, à l’échelle du document. La mesure sépare nettement les deux : la sortie de attachfile2 contient deux annotations /FileAttachment (une pour \attachfile, une pour \textattachfile) et aucun /EmbeddedFiles ; celle de embedfile fait exactement l’inverse. Le panneau « Pièces jointes » d’un lecteur lit cet arbre de noms : un PDF bâti uniquement avec \attachfile n’y affiche rien, et il faut repérer l’icône sur la page. Utiliser les deux est la réponse sûre.
\usepackage{attachfile2}
\usepackage{embedfile}
% visible on the page: a clickable paperclip, and custom link text
\attachfile[icon=Paperclip,author={Ada}]{data.csv}
\textattachfile{data.csv}{download the data}
% invisible, but listed in the viewer's Attachments panel
\embedfile[desc={Source data},mimetype=text/csv]{data.csv}Le choix, les paquets y répondent eux-mêmes. attachfile2 est le développement par Heiko Oberdiek du attachfile de Scott Pakin (TeX Live 2024 fournit la v2.12 du 18/01/2024), avec en plus la prise en charge de dvips et des métadonnées automatiques sur le fichier joint. De fait, un PDF construit avec attachfile2 portait /Size 12 — le nombre d’octets de l’original — et /CheckSum <178ba857…>, là où la sortie de l’ancien attachfile ne contient aucun /CheckSum. Et son propre README l’écrit noir sur blanc : « See the embedfile package for a newer package supporting this feature. » Pour un nouveau document, choisissez selon que vous voulez ou non une icône visible ; sinon, embedfile est la voie directe.
Que la pièce jointe soit réellement là se confirme avec le pdfdetach de poppler. pdfdetach -list paper.pdf énumère les fichiers intégrés et pdfdetach -saveall -o out paper.pdf les extrait — à la mesure, le data.csv récupéré est revenu octet pour octet identique à l’original. Un détail mérite attention : joindre deux fois le même fichier l’intègre deux fois. Il suffit de mettre \attachfile et \textattachfile côte à côte pour que pdfdetach -list réponde 2 embedded files. Pour renvoyer à un gros jeu de données depuis plusieurs endroits, mieux vaut l’intégrer une seule fois avec embedfile et le désigner depuis le texte.
$ pdfdetach -list paper.pdf
2 embedded files
1: data.csv
2: data.csv
$ pdfdetach -saveall -o out paper.pdf && diff out/data.csv data.csv && echo identical
identicalCalques (OCG) avec ocgx2 — et pourquoi le contenu caché ne l’est pas
Les OCG (Optional Content Groups) d’un PDF sont des calques que l’on peut afficher ou masquer. Le ocgx2 d’Alexander Grahn enveloppe le contenu dans \begin{ocg}{name}{id}{initial visibility}…\end{ocg} et fournit \switchocg, \toggleocgs, \showocgs et \hideocgs comme interrupteurs cliquables. Le PDF produit porte bien un dictionnaire /OCProperties, et la technique convient aux dévoilements progressifs ou à la superposition de variantes d’une même figure. Mais la bascule fonctionne surtout dans Acrobat ; d’autres lecteurs se contentent parfois d’afficher l’état initial.
\usepackage{ocgx2}
Question: what is $2+2$?
\begin{ocg}{Answer}{ans}{0} % 0 = hidden when the file opens
The answer is 4.
\end{ocg}
\switchocg{ans}{Show or hide the answer}Et il existe un piège bien plus grave : le texte d’un calque masqué n’est pas caché. Compilez l’exemple ci-dessus, passez-le à pdftotext, et le texte extrait donne Question: what is 2 + 2? The answer is 4. — la réponse ressort intégralement alors qu’elle démarre invisible. Un OCG dit si quelque chose est dessiné ; ce n’est ni un chiffrement ni une suppression. Masquer derrière un OCG ce qui ne doit pas être vu est donc vain : corrigés d’exercices, caviardage pour les relecteurs, autre grille tarifaire — il suffit de copier le texte ou de lancer un extracteur une fois pour tout lire. Ce qui ne doit pas être vu ne doit pas figurer dans le PDF.
Annotations et commentaires : pense-bêtes, surlignages et infobulles avec pdfcomment
Le pdfcomment de Josef Kleber (TeX Live 2024 fournit la v2.4a) fabrique des annotations PDF depuis la source LaTeX. \pdfcomment{…} donne un pense-bête (/Subtype /Text), \pdfmarkupcomment[markup=Highlight]{le texte}{le commentaire} surligne un passage et y attache une note (/Subtype /Highlight), et \pdftooltip{texte}{explication} produit une infobulle au survol. La clé author={Reviewer} devient /T dans le PDF et apparaît comme nom de l’auteur dans la liste des commentaires du lecteur. On peut ainsi garder les remarques de relecture dans la source LaTeX et les faire apparaître comme annotations dans le PDF diffusé.
Deux remarques pratiques. D’abord les couleurs : écrire color=yellow sans avoir chargé xcolor arrête la compilation sur ! Package pdfcomment Error: This color specification is not supported ; placez \usepackage{xcolor} avant et cela passe. Ensuite les passes : les annotations de surlignage n’apparaissent pas au premier tour, seul le second inscrit le /Subtype /Highlight (le journal indique même Rerun to get outlines right or use package bookmark.). pdfcomment fait pourtant partie des survivants : en rendant une page en image avec poppler et en comptant les couleurs, le jaune du surlignage (RVB 255,242,0) est bel et bien dessiné. Et le corps d’une annotation n’apparaît pas dans la sortie de pdftotext : les commentaires ne polluent jamais le texte extrait.
\usepackage{xcolor} % must come before pdfcomment for named colours
\usepackage{pdfcomment}
A sentence.\pdfcomment[author={Reviewer},icon=Note,color=yellow]{Check this reference.}
A \pdfmarkupcomment[markup=Highlight,color=yellow,author={Reviewer}]%
{highlighted phrase}{needs a citation}.
A \pdftooltip{term}{shown when the pointer rests on it}.Animation : animate fonctionne en JavaScript
Le animate d’Alexander Grahn est le seul mécanisme animé qui ne s’appuie pas sur Flash. Écrivez \animategraphics[controls,autoplay]{12}{frame-}{0}{59} et vous obtenez une figure qui joue frame-0.png à frame-59.png à douze images par seconde. Pour animer directement des images dessinées en TikZ ou PSTricks, l’environnement animateinline s’emploie avec \multiframe. Le moteur est du JavaScript intégré au PDF — le champ JavaScript de pdfinfo passe effectivement à yes. Tout lecteur qui exécute du JavaScript peut le lire, d’où une portabilité bien supérieure à celle de la vidéo intégrée. Le prix : toutes les images sont incorporées, si bien que le nombre d’images et la résolution se traduisent directement en taille de fichier.
\usepackage{animate}
% a numbered image series: frame-0.png ... frame-59.png at 12 fps
\animategraphics[controls,autoplay,width=6cm]{12}{frame-}{0}{59}
% or animate TikZ frames drawn on the fly
\begin{animateinline}[controls,loop]{6}
\multiframe{12}{i=0+30}{%
\begin{tikzpicture}\draw[->,thick] (0,0)--(\i:1.5);\end{tikzpicture}}
\end{animateinline}Multimédia : media9 et l’héritage de Flash
Le \includemedia de media9 intègre vidéo, audio et 3D dans un PDF ; movie15 en est le prédécesseur obsolète. Techniquement, cela fonctionne encore — la mesure a produit une annotation /Subtype /RichMedia et un objet /Subtype /Video. Le problème est du côté de la lecture. Le VPlayer.swf nommé dans le second argument de \includemedia est un fichier Flash, toujours livré avec TeX Live 2024, alors que Flash lui-même a été retiré fin 2020. Essayé avec une vidéo factice de 14 octets, le PDF de sortie atteignait 493 989 octets — presque entièrement un lecteur qui ne démarrera plus jamais. Pour un document neuf, renvoyez vers un média externe, ou utilisez animate pour un mouvement image par image. Considérer media9 comme un héritage est le bon réflexe.
Quelles fonctions survivent réellement, et jusqu’où
Réponse courte : les pièces jointes et les annotations s’emploient sans crainte ; les calques et la vidéo, non. Le tableau ci-dessous consigne l’aspect d’un PDF fabriqué sous TeX Live 2024 vu par les outils poppler (pdfinfo, pdfdetach, pdftotext, pdftoppm). Cela établit si les bons objets figurent dans le PDF et comment poppler les traite ; le comportement sous Adobe Acrobat n’a pas été vérifié ici. Pour les fonctions réputées très dépendantes d’Acrobat — bascule des OCG, lecture via \includemedia —, testez vous-même dans l’environnement que vos lecteurs utiliseront réellement.
| Paquet | Ce qu’il crée dans le PDF | Ce qui a été confirmé localement |
|---|---|---|
attachfile2 | une annotation /FileAttachment sur la page | détectée par pdfdetach -list ; enregistre aussi /Size et /CheckSum |
embedfile | une entrée dans l’arbre de noms /EmbeddedFiles du document | pdfdetach -saveall a restitué les octets à l’identique |
ocgx2 | un dictionnaire /OCProperties et les calques | le texte d’un calque masqué est tout de même extrait par pdftotext |
pdfcomment | annotations /Text et /Highlight, plus /T (l’auteur) | poppler dessine réellement la couleur de surlignage ; deux passes nécessaires |
animate | du JavaScript intégré et toutes les images de la séquence | pdfinfo annonce JavaScript: yes |
media9 | une annotation /RichMedia et VPlayer.swf (Flash) | une vidéo de 14 octets a donné un PDF de 493 989 octets |