TeX Live 2024에는 VPlayer.swf라는 파일이 들어 있습니다. 483,412바이트짜리 Flash 파일이고, 수정 날짜는 2018년 1월 19일입니다. LaTeX의 media9에서 \includemedia를 쓰면 이 파일이 통째로 PDF에 임베드됩니다. 동영상 하나를 위해 반 메가바이트에 가까운, 그리고 이제 어디서도 돌아가지 않는 플레이어가 말입니다. 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가 둘(\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바이트도 다르지 않게 돌아왔습니다. 여기서 눈여겨볼 점은 같은 파일을 두 번 첨부하면 두 벌이 들어간다는 것입니다. \attachfile과 \textattachfile을 나란히 쓰기만 해도 pdfdetach -list는 2 embedded files라고 답합니다. 큰 데이터셋을 여러 곳에서 연결하고 싶다면 embedfile로 한 번만 넣고 본문에서 가리키는 편이 낫습니다.
$ 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}{name}{id}{initial visibility}…\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)는 LaTeX 소스에서 PDF 주석을 만듭니다. \pdfcomment{…}는 쪽지(/Subtype /Text)를, \pdfmarkupcomment[markup=Highlight]{본문}{코멘트}는 본문에 형광펜을 칠하고 주석을 연결(/Subtype /Highlight)하며, \pdftooltip{문자}{설명}은 마우스를 올리면 뜨는 툴팁이 됩니다. author={Reviewer} 키는 PDF의 /T로 들어가 뷰어의 코멘트 목록에 작성자 이름으로 표시됩니다. 심사 의견을 LaTeX 소스에 적어 두고 배포용 PDF에서는 주석으로 보이게 하는 활용이 가능합니다.
실무상 주의가 둘 있습니다. 하나는 색 지정으로, xcolor를 불러오지 않고 color=yellow라고 쓰면 ! Package pdfcomment Error: This color specification is not supported로 멈춥니다. \usepackage{xcolor}를 먼저 두면 통과합니다. 다른 하나는 컴파일 횟수로, 형광펜 계열 주석은 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의 둘째 인자에 지정하는 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 렌더링에서 형광색이 실제로 나옴. 두 번 컴파일 필요 |
animate | 임베드된 JavaScript와 전체 프레임 이미지 | pdfinfo의 JavaScript가 yes가 됨 |
media9 | /RichMedia 주석과 VPlayer.swf(Flash) | 14바이트 동영상으로 출력이 493,989바이트까지 부풂 |