TeX Live 2024 incluye un archivo llamado VPlayer.swf: 483.412 bytes de Flash, modificado por última vez el 19 de enero de 2018. Use \includemedia del paquete media9 de LaTeX y ese archivo se incrusta entero en su PDF: casi medio megabyte de reproductor, para un solo vídeo, que ya no puede ejecutar nada. Flash llegó al final de su vida el 31 de diciembre de 2020, y desde el 12 de enero de 2021 el propio Adobe empezó a bloquear la reproducción de contenido Flash. Un PDF puede llevar mucho más que páginas estáticas —archivos adjuntos, capas, anotaciones, animación, vídeo—, pero cada una de esas cosas se degrada de forma muy distinta en el mundo real. Esta página lo ordena, comprobándolo con pdfdetach y pdftotext.
Incrustar un archivo en un PDF: attachfile2 frente a embedfile
La diferencia está en dónde acaba el archivo dentro del PDF. El \attachfile{data.csv} de attachfile2 coloca en la página una anotación /FileAttachment, el icono del clip. El \embedfile{data.csv} de embedfile no pone nada en la página y registra el archivo en el árbol /EmbeddedFiles bajo /Names, a escala de documento. La medición los separa con nitidez: la salida de attachfile2 contiene dos anotaciones /FileAttachment (una por \attachfile y otra por \textattachfile) y ningún /EmbeddedFiles; la de embedfile hace justo lo contrario. El panel «Adjuntos» de un visor lee ese árbol de nombres, así que un PDF construido solo con \attachfile no muestra nada allí y hay que localizar el icono en la página. Usar los dos es la respuesta segura.
\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}Cuál elegir lo responden los propios paquetes. attachfile2 es el desarrollo por Heiko Oberdiek del attachfile de Scott Pakin (TeX Live 2024 trae la v2.12, de 2024-01-18), con soporte añadido para dvips y metadatos automáticos sobre el archivo adjunto. En efecto, un PDF construido con attachfile2 llevaba /Size 12 —el número de bytes del original— y /CheckSum <178ba857…>, mientras que la salida del viejo attachfile no contiene /CheckSum alguno. Y su propio README lo dice sin rodeos: «See the embedfile package for a newer package supporting this feature.» Para trabajo nuevo, elija según quiera o no un icono visible; si no lo quiere, embedfile es la vía directa.
Que el adjunto haya entrado de verdad se confirma con el pdfdetach de poppler. pdfdetach -list paper.pdf enumera los archivos incrustados y pdfdetach -saveall -o out paper.pdf los extrae: medido, el data.csv recuperado volvió byte a byte idéntico al original. Ahí conviene fijarse en algo: adjuntar dos veces el mismo archivo lo incrusta dos veces. Basta con poner \attachfile y \textattachfile uno junto a otro para que pdfdetach -list responda 2 embedded files. Si quiere enlazar a un conjunto de datos grande desde varios sitios, es más sensato incrustarlo una sola vez con embedfile y señalarlo desde el texto.
$ 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
identicalCapas (OCG) con ocgx2: y por qué el contenido oculto no está oculto
Los OCG (Optional Content Groups) de un PDF son capas que se pueden mostrar u ocultar. El ocgx2 de Alexander Grahn envuelve el contenido en \begin{ocg}{name}{id}{initial visibility}…\end{ocg} y aporta \switchocg, \toggleocgs, \showocgs y \hideocgs como interruptores clicables. El PDF generado lleva efectivamente un diccionario /OCProperties, y la técnica sirve para revelados progresivos o para superponer versiones alternativas de una misma figura. Pero la conmutación funciona sobre todo en Acrobat; otros visores pueden limitarse a mostrar el estado inicial.
\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}Y hay una trampa mucho más importante: el texto de una capa oculta no está oculto. Compile el ejemplo anterior, páselo por pdftotext y el texto extraído dice Question: what is 2 + 2? The answer is 4.: la respuesta sale entera pese a empezar invisible. Un OCG indica si algo se dibuja; no es cifrado ni borrado. Por eso ocultar tras un OCG lo que no quiere que se vea es inútil: soluciones de ejercicios, tachaduras para los revisores, otra lista de precios… cualquiera que copie el texto o ejecute un extractor una vez lo leerá todo. Lo que no debe verse, no debe entrar en el PDF.
Anotaciones y comentarios: notas, resaltados y descripciones con pdfcomment
El pdfcomment de Josef Kleber (TeX Live 2024 trae la v2.4a) construye anotaciones PDF desde el fuente LaTeX. \pdfcomment{…} produce una nota adhesiva (/Subtype /Text), \pdfmarkupcomment[markup=Highlight]{el texto}{el comentario} resalta un pasaje y le adjunta una nota (/Subtype /Highlight), y \pdftooltip{texto}{explicación} genera una descripción emergente al pasar el ratón. La clave author={Reviewer} se convierte en /T dentro del PDF y aparece como nombre del comentarista en la lista de comentarios del visor. Permite mantener las observaciones de revisión en el fuente LaTeX y mostrarlas como anotaciones en el PDF distribuido.
Dos avisos prácticos. Primero, los colores: escribir color=yellow sin cargar xcolor detiene la compilación con ! Package pdfcomment Error: This color specification is not supported; ponga \usepackage{xcolor} antes y pasa. Segundo, las pasadas: las anotaciones de marcado no aparecen en la primera ejecución, y solo la segunda incorpora el /Subtype /Highlight (el registro llega a decir Rerun to get outlines right or use package bookmark.). pdfcomment está, eso sí, entre los supervivientes: al renderizar una página como imagen con poppler y contar los colores, el amarillo del resaltado (RGB 255,242,0) aparece realmente dibujado. Y el cuerpo de una anotación no figura en la salida de pdftotext, así que los comentarios nunca contaminan el texto extraído.
\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}.Animación: animate funciona con JavaScript
El animate de Alexander Grahn es el único mecanismo animado que no depende de Flash. Escriba \animategraphics[controls,autoplay]{12}{frame-}{0}{59} y obtendrá una figura que reproduce frame-0.png hasta frame-59.png a doce fotogramas por segundo. Para animar directamente fotogramas dibujados en TikZ o PSTricks, use el entorno animateinline con \multiframe. El motor es JavaScript incrustado en el PDF: el campo JavaScript de pdfinfo pasa efectivamente a yes. Cualquier visor que ejecute JavaScript puede reproducirlo, lo que lo hace mucho más portable que el vídeo incrustado. El precio es que todos los fotogramas se incrustan, así que su número y su resolución se traducen directamente en tamaño de archivo.
\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}Multimedia: media9 y el legado de Flash
El \includemedia de media9 incrusta vídeo, audio y 3D en un PDF; movie15 es su predecesor obsoleto. Técnicamente todavía funciona: la medición produjo una anotación /Subtype /RichMedia y un objeto /Subtype /Video. El problema está en la reproducción. El VPlayer.swf que se nombra en el segundo argumento de \includemedia es un archivo Flash, todavía distribuido con TeX Live 2024, mientras que Flash mismo se retiró a finales de 2020. Probado con un vídeo falso de 14 bytes, el PDF de salida llegó a 493.989 bytes, casi todo él un reproductor que ya nunca arrancará. Para documentos nuevos, enlace a medios externos o use animate para movimiento por fotogramas. Tratar media9 como legado es lo acertado.
Qué funciones sobreviven de verdad, y hasta dónde
Respuesta corta: los adjuntos y las anotaciones se pueden usar con tranquilidad; las capas y el vídeo, no. La tabla siguiente recoge el aspecto de un PDF construido con TeX Live 2024 ante las herramientas de poppler (pdfinfo, pdfdetach, pdftotext, pdftoppm). Eso establece si dentro del PDF están los objetos correctos y cómo los trata poppler; el comportamiento en Adobe Acrobat no se verificó aquí. Para las funciones con fama de depender mucho de Acrobat —conmutación de OCG, reproducción con \includemedia—, pruébelas usted mismo en el entorno que sus lectores vayan a usar de verdad.
| Paquete | Qué crea en el PDF | Qué se confirmó localmente |
|---|---|---|
attachfile2 | una anotación /FileAttachment en la página | detectada por pdfdetach -list; registra además /Size y /CheckSum |
embedfile | una entrada en el árbol de nombres /EmbeddedFiles del documento | pdfdetach -saveall recuperó los bytes sin cambios |
ocgx2 | un diccionario /OCProperties y las capas | el texto de una capa oculta lo extrae igualmente pdftotext |
pdfcomment | anotaciones /Text y /Highlight y /T (el autor) | poppler dibuja realmente el color del resaltado; hacen falta dos pasadas |
animate | JavaScript incrustado y todos los fotogramas como imágenes | pdfinfo informa JavaScript: yes |
media9 | una anotación /RichMedia y VPlayer.swf (Flash) | un vídeo de 14 bytes produjo un PDF de 493.989 bytes |