TeX Live 2024 には VPlayer.swf というファイルが入っています。483,412 バイト、更新日は 2018 年 1 月 19 日 の Flash ファイルです。LaTeX の media9 で \includemedia を使うと、これが PDF に丸ごと埋め込まれます——動画 1 本のために半メガバイト近い、そして もうどこでも動かない プレイヤーが。Flash は 2020 年 12 月 31 日にサポートを終了し、2021 年 1 月 12 日以降は Adobe 自身が再生をブロックしています。PDF は静的なページ以外に 添付ファイル・レイヤー・注釈・アニメーション・動画 を持てますが、それぞれ「実際にどのビューアで生き残るか」がまるで違います。このページはその現実を、pdfdetach と pdftotext で確かめながら整理します。
PDF にファイルを埋め込む——attachfile2 と embedfile の違い
違いは「PDF のどこに置くか」です。attachfile2 の \attachfile{data.csv} は、ページ上に /FileAttachment という注釈(クリップのアイコン)を置きます。embedfile の \embedfile{data.csv} は、ページには何も置かず、文書全体の /Names にある /EmbeddedFiles ツリーに登録します。実測でも役割はきれいに分かれていて、attachfile2 の出力には /FileAttachment が 2 件(\attachfile と \textattachfile の分)あるが /EmbeddedFiles はゼロ、embedfile の出力はその逆になります。ビューアの「添付ファイル」パネルが読むのは後者のツリーなので、\attachfile だけで作った PDF はパネルに何も出ず、ページのアイコンを見つけないと開けません。両方使うのがいちばん安全です。
\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}どちらを選ぶべきかは、パッケージ自身が答えています。attachfile2 は Scott Pakin の attachfile を Heiko Oberdiek が発展させたもので(TeX Live 2024 同梱版は v2.12、2024-01-18)、dvips 対応と、添付ファイルのメタ情報を自動で書き込む機能が加わっています。実際、attachfile2 で作った PDF の中には /Size 12(元ファイルのバイト数)と /CheckSum <178ba857…> が入っていましたが、旧 attachfile の出力に /CheckSum はありません。そしてその README 自身が 「この機能については、より新しい embedfile パッケージを参照」 と書いています。新規に書くなら、目に見えるアイコンが要るかどうかで選び、要らないなら embedfile が素直です。
添付が本当に入ったかは、poppler の pdfdetach で確かめられます。pdfdetach -list paper.pdf は埋め込まれたファイルを列挙し、pdfdetach -saveall -o out paper.pdf は取り出します——実測では取り出した data.csv が元と 1 バイトも違わずに戻ってきました。ここで気づいておきたいのが、同じファイルを 2 回添付すると 2 部入ることです。\attachfile と \textattachfile を並べただけで、pdfdetach -list は 2 embedded files と答えます。大きなデータセットを何箇所からもリンクしたくなったら、embedfile で 1 度だけ埋め込み、本文からは \ref で誘導するほうが賢明です。
$ 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
identicalレイヤー(OCG)——ocgx2 と、隠した中身が隠れていない話
PDF の OCG(Optional Content Groups) は、表示・非表示を切り替えられる層です。Alexander Grahn の ocgx2 は、内容を \begin{ocg}{名前}{id}{初期表示}…\end{ocg} で包み、切り替えのリンクとして \switchocg・\toggleocgs・\showocgs・\hideocgs を提供します。生成された PDF には確かに /OCProperties の辞書が入り、段階的な開示や、同じ図の別バージョンを重ねる用途に向いています。ただし 切り替えが実際に動くのは主に Acrobat で、他のビューアは初期状態を表示するだけのことがあります。
\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}そしてもっと大事な落とし穴があります。隠したレイヤーの文字は、隠れていません。 上の例をコンパイルして pdftotext にかけると、抽出されたテキストは Question: what is 2 + 2? The answer is 4. です——初期状態が非表示なのに、答えがそのまま出てきます。OCG は「描画するかどうか」の指定であって、暗号化でも削除でもないからです。演習問題の解答、査読者向けの伏せ字、価格表の別バージョンといった 見せたくない中身を OCG で隠すのは無意味 で、テキストをコピーするか抽出ツールを一度走らせれば誰にでも読めます。隠したいものは、そもそも PDF に入れないでください。
注釈とコメント——pdfcomment で付箋・ハイライト・ツールチップ
Josef Kleber の pdfcomment(TeX Live 2024 同梱版は v2.4a)は、PDF の注釈を LaTeX のソースから作ります。\pdfcomment{…} は付箋(/Subtype /Text)、\pdfmarkupcomment[markup=Highlight]{本文}{コメント} は本文を蛍光ペンで塗った上に注釈を紐づけ(/Subtype /Highlight)、\pdftooltip{文字}{説明} はマウスを載せると出るツールチップになります。author={Reviewer} は PDF 側の /T に入り、ビューアのコメント一覧に投稿者名として表示されます。査読の指摘を LaTeX ソースに書いておいて、配布用 PDF では注釈として見せる——という使い方ができます。
実務上の注意が 2 つあります。1 つは色の指定で、xcolor を読み込まずに color=yellow と書くと ! Package pdfcomment Error: This color specification is not supported で止まります。\usepackage{xcolor} を先に置けば通ります。もう 1 つはコンパイル回数で、ハイライト系の注釈は 1 回目には現れず、2 回目でようやく /Subtype /Highlight が入ります(ログにも Rerun to get outlines right or use package bookmark. と出ます)。なお pdfcomment は生き残りやすい部類です——poppler でページを画像に落として色を数えたところ、ハイライトの黄色(RGB 255,242,0)が確かに描画されていました。加えて注釈の本文は pdftotext の抽出結果には現れないので、コメントが本文に混ざる心配はありません。
\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}.アニメーション——animate は JavaScript で動く
Alexander Grahn の animate は、Flash に頼らない唯一の動く仕掛けです。\animategraphics[controls,autoplay]{12}{frame-}{0}{59} と書けば、frame-0.png から frame-59.png までを毎秒 12 コマで再生する図になります。TikZ や PSTricks で描いたコマを直接動かすなら animateinline 環境と \multiframe を使います。中身は PDF に埋め込まれた JavaScript で、実際に pdfinfo の JavaScript 欄が yes に変わります。JavaScript を実行するビューアであれば再生でき、埋め込み動画よりはるかに移植性が高い——ただしフレームを全部埋め込むので、コマ数と解像度がそのままファイルサイズに跳ね返ります。
\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}マルチメディア——media9 と Flash の遺産
media9 の \includemedia は動画・音声・3D を PDF に埋め込み、movie15 はその廃止された前身です。技術的には今も動きます——実測でも /Subtype /RichMedia の注釈と /Subtype /Video が生成されました。問題は再生する側です。\includemedia の第 2 引数に指定する VPlayer.swf は Flash 製で、TeX Live 2024 にも同梱されたままですが、Flash 自体が 2020 年末に終了しています。14 バイトのダミー動画で試したところ、出力 PDF は 493,989 バイトになりました——中身のほとんどが、二度と実行されないプレイヤーです。新規の文書では、外部の動画へリンクするか、コマ送りの動きなら animate を使ってください。media9 はレガシーとして扱うのが正解です。
どの機能が、どこまで生き残るか
結論を先に書くと、添付ファイルと注釈は安心して使えて、レイヤーと動画は使えません。 下の表は、TeX Live 2024 で作った PDF を poppler 系のツール(pdfinfo・pdfdetach・pdftotext・pdftoppm)で調べた結果です。ここで確かめられたのは「PDF の中に正しいオブジェクトが入っているか」と「poppler がそれをどう扱うか」までで、Adobe Acrobat での挙動は手元では検証していません。OCG の切り替えや \includemedia の再生など、Acrobat 依存が強いとされる機能については、配布先の環境で必ず自分で試してから採用してください。
| パッケージ | PDF に作られるもの | 手元で確認できたこと |
|---|---|---|
attachfile2 | ページ上の /FileAttachment 注釈 | pdfdetach -list が検出。/Size と /CheckSum も記録 |
embedfile | 文書の /Names の /EmbeddedFiles ツリー | pdfdetach -saveall で元と同一のバイト列を復元 |
ocgx2 | /OCProperties の辞書とレイヤー | 非表示のレイヤーの文字も pdftotext で抽出できてしまう |
pdfcomment | /Text・/Highlight 注釈と /T(著者名) | poppler の描画で蛍光色が実際に出る。2 回のコンパイルが必要 |
animate | 埋め込み JavaScript と全フレームの画像 | pdfinfo の JavaScript が yes になる |
media9 | /RichMedia 注釈と VPlayer.swf(Flash) | 出力は 14 バイトの動画で 493,989 バイトに膨らむ |