TeX Alchemist Online

TeX のこと,フォントのこと,Mac のこと

macOS の Preview.app での編集結果をTeX文書に反映させる(CUI編)

macOS 標準の Preview.app はとても強力です。「プレビュー」の名に反して,PDFを色々と編集できます。

  • ページの追加・削除・順序交換・回転
  • 他のPDFファイルの差し込み
  • ページのトリミング
  • テキストの書き込み
  • テキストをハイライト(蛍光ペンで塗る),下線や取り消し線の追加
  • 長方形や円といった図形の追加
  • フリーハンドで線を描画
  • 「墨消し」機能(⬅︎最近追加された,PDF内の秘匿すべき情報を復元不可能な形で黒塗りして潰す機能)
  • PNG や JPEG といったビットマップ画像としての書き出し

など,様々な編集機能を持ちます。

ただし,既存PDFに Preview.app で編集を加えたものを TeX 文書に \includegraphics で貼り込むと,編集結果が反映されない という経験をしたことがある人も多いのではないでしょうか。

実験

まず,元となる次のようなPDFファイル test1.pdf があるとしましょう。

これを Preview.app で開き,「マークアップツールバー」を表示して,

  • 赤文字で新しいテキスト New Text を書き込み
  • 赤い円を追加

という編集を施してみます。

これを test2.pdf として保存します。

そしてこれを LaTeX 文書へ \includegraphics で読み込んでみましょう。

%#!lualatex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\fboxsep=0pt
\fbox{\includegraphics{test2.pdf}}
\end{document}

これをコンパイルして得られるPDFは次のようになります。

Preview.app で書き加えた赤文字や円が表示されておらず,編集結果が反映されていないことが分かります。

ここでは LuaTeX で試しましたが,pdfTeX や dvipdfmx でも同様の結果になります。

原因の調査

この原因を調べるため,test2.pdf のPDF構造がどうなっているのか,callas pdfToolbox を使って内部構造を見てみましょう。

赤線部に注目すると,New Text といった文字や円(Circle)が,/Annots で指定されるアノテーション(注釈)として書き加えられていることが分かります。LuaTeX や pdfTeX, dvipdfmxのエンジンが,埋め込まれるPDFのアノテーションを保持しないため,「編集結果が反映されない」という見え方をしていたということでしょう。

Ghostscript による解決策

やや強引ですが,Ghostscript を使って PDF→PostScript→PDF と変換すると,アノテーションを通常のコンテンツに変換できる というテクニックがあります。

次のコマンドで,test2.pdftemp.pstest3.pdf と変換します(PDFのバージョンは 1.4 で指定)。PDF→PS の変換時に -dUseCropBox を付けておくことによって,Preview.app によるページのトリミング(これは CropBox の付与に相当)を考慮し,それを PostScript ファイルのバウンディングボックスとして採用させるために付けてあります。-r20016 は,Type 1 Font が低解像度でビットマップ化されてしまうのを防ぐ措置です。

$ gs -q -dBATCH -dNOPAUSE -sDEVICE=ps2write -sOutputFile=temp.ps -dCompatibilityLevel=1.4 -dAutoRotatePages=/None -dUseCropBox -r20016 test2.pdf
$ gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=test3.pdf -dCompatibilityLevel=1.4 -dAutoRotatePages=/None temp.ps

こうして生成された test3.pdf\includegraphics で読み込んでみましょう。

%#!lualatex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\fboxsep=0pt
\fbox{\includegraphics{test3.pdf}}
\end{document}

きちんと反映されました!

変換後のPDFの構造

Ghostscript によって変換して得られた test3.pdf の構造も,callas pdfToolbox を使って確認してみましょう。

アノテーションがなくなり,内容がメインのコンテンツの方に移ったことが分かります。

検証ファイル

今回実験に用いた検証ファイル一式を Overleaf に置いておきます。ご自分で検証してみたい方はどうぞご利用ください。

www.overleaf.com

PDFの“フラット化”をGUIでやるには

この「PDFの“フラット化”処理」は,GUIでお手軽に行うこともできます。その方法は次記事にて。

doratex.hatenablog.jp