PDFのトリミングとベクター画像抽出
上のタイトルからは想像できないかもしれないが、今回は前回(ついさっき)予告した通り TeX2img に関する記事である。
ああ、またか… しかし、ここでこのページから離れるのはまだ早い。TeX に関する(たぶん)全く新しい見方をここで導入する。TeX を全く使ったことがない方も、この記事を読めば少しは興味を持っていただけるかもしれない。
なぜ僕は TeX を使うのか:新しい見方
TeX は何も組版の専門家や TeXnician, 数学・物理系だけのものではない。僕も TeX を使ってはいるが、これには大きな理由がある。
もちろん、TeX は一般に言われているように、数式の取り扱いが得意である。それだけでも TeX を使うメリットがあるといえるので、数式を PowerPoint や Keynote といった別のツールに挿入するための TeX2img をはじめとするツールが開発されている。また、数式番号や相互参照、目次や索引といった対応付けをもコマンドで指定するだけで自動的に調節してくれるという点も、TeX の優れた機能だと思う。
しかし、僕に言わせれば、TeX のメリットはそれだけではない。僕の知る範囲では
「TeX は、PDF をより大きな文書に安全に取り込むことを可能にする、おそらく唯一のプログラムである」
もちろん、「ある PDF ファイルの何ページ目と何ページ目の間に1ページだけ他の PDF ファイルを挟みたい」とか、「この PDF ファイルの末尾に別の PDF ファイルを結合したい」とかいう場合には、GUI ツールとしてフリーウェアの pdf_as (Windows), PDF Split and Merge basic (Win, Mac, ...), シェアウェアの PDForsell (Windows), 商用では Adobe Acrobat などがあり、CUI ツールとして PDFtk (Win, Mac, ...) が存在するので、そちらの方が便利である(Mac標準のプレビューも使える)。しかし、これらは同じページの中に PDF ファイルをそのまま埋め込むことはできない。
LaTeX ではそれを graphicx パッケージを用いることによって \includegraphics だけで実現してくれる。たとえ PDF で使われているフォントがシステムにインストールされていなくても、あるいはそもそも PDF にフォントが埋め込まれていなくてもこれは成り立つ。そして、この優れた TeX の機能を損ねることなく活用してくれるアプリこそが、TeX2img なのである。
なぜ TeX2img か
TeX2img 配布サイト(寺田さんによるオリジナル)にもある通り、TeX2img は「数式画像の生成」に特化せず、日本語など地の文を含めて TeX 文書全体を画像化することを想定して作られている。つまり、数式出力に特化した Mac 用のスタンドアロンアプリである LaTeXiT や、Web アプリである TeXclip(日本語非対応)やTeXCrop(日本語対応)では不可能なことも実現できる。
たとえば、Web アプリはプリアンブルを設定できないため、独自のスタイルファイルを使いたくてもあきらめざるを得ない。LaTeXiT はプリアンブル設定ウィンドウが存在するが、そもそも Windows では使えないし、上の Web アプリ2つと同じように「数式の画像化」を目的としているため数式以外は入力できない。この手の画像化ツールの中で(僕の知る範囲で)唯一、何でもできるのが TeX2img なのだ。
TeX2img 配布サイトの Tips にも書かれている通り、TeX2img の応用範囲は広い。EPS を他の形式に変換するツールとして用いるという使い方だけでなく、記事のタイトルのように PDF のベクター画像を抽出して、それを PowerPoint などの別のツールに貼り付けるための過程で用いることができる。
Windows でベクター画像を抽出できるというだけでも非常に有用だ。というのも、Mac は標準の「プレビュー」の長方形選択ツールがすでにベクター画像抽出に対応しており、PowerPoint for Mac 2011 はドラッグアンドドロップで PDF 画像を貼り付けられるなど、OS レベルで PDF に対応しているが、Windows の場合はこのような PDF の取り扱いができない。
TeX2img の解説*1
PDF →[gs (eps(2)write)]→ EPS →[gs (pdfwrite/epstopdf)]→ PDF
というプロセスを含んでいる。わざわざいったん dvipdfmx で生成した PDF を EPS ファイルに変換し、再び PDF に変換するという作業を行っている。そんなことせずに pdfcrop を使えばいいではないか、と不思議に思うかもしれないが、そうはいかない。
理由の一つは pdfcrop というプログラムの仕様にある。Windows で用いる pdfcrop.exe は Perl 依存であるため、W32TeX ユーザにとっては手動で何らかの Perl インタプリタを別途インストールする必要が生じてしまう*2。このため安全策として、TeX2img では Ghostscript の epswrite (gs9.14以前) あるいは eps2write (gs9.15以降) を使うことにしている。
ただ、そもそも Mac の場合は Perl が内蔵されているため pdfcrop を用いた処理で問題ないはずであるし、Perl なしでも同じ結果を得られる別法は存在する(例えばこちら)ので、一つ目の理由では不十分である。
もっと大きな理由が、ここで用いている epswrite/eps2write の仕様にある。それは
epswrite/eps2write の解像度を示す -rオプションを高解像度とすると文字のアウトラインをとれるようになる
というポイントである。これを利用し、フォント情報を失わせる代わりに(したがってテキストとしての再利用はできない)、確実に見た目が元と同じベクター画像 EPS を生成させている。TeX2img は出力形式を PDF に指定すると再び変換が行われ、結果として「元の PDF ファイルの文字のアウトラインをとったベクター画像 PDF」が得られることになる。しかも、余白部分が取り除かれているので結果的に「トリミング」に成功している*3。
さらに、この PDF ファイルを商用の Illustrator やフリーの Inkscape といったベクター画像編集ソフトウェアで開き、自由に不要な図形を取り除いて上書き保存すれば、「PDF のページ内から任意のベクター画像を抽出」できたことになる。
結局、TeX2img で PDF からベクター画像抽出するには
以上から、フリーウェアのみでの「PDF トリミング」や「PDF のベクター画像抽出」の手順をまとめると
(1) TeX2img で graphicx パッケージを用いて \includegraphics で PDF ファイルを取り込み、出力形式に PDF または EPS を選択し、「画像ファイル生成」
(2) 生成した PDF または EPS ファイルを Inkscape で開き、不要なアウトライン化文字や図形を取り除く。ページサイズを完成図に合わせ、上書き保存
となる。
もう少し詳しく書くと、(1)ではプリアンブル設定ウィンドウで
\usepackage[dvipdfmx]{graphicx} \graphicspath{{c:/Users/ユーザ名/Desktop/}}
のように記述し、デスクトップに元となる PDF ファイルを置いて本文中に \includegraphics コマンドを使えば良い。また、(2)では Inkscape で PDF ファイルを開いたらメニューから「オブジェクト」→「グループ解除」ですべての画像要素をバラバラにし、好きなように編集すればよい。PowerPoint などで図を利用する際には、 Inkscape が PDF や EPS, WMF, EMF といったベクター画像形式の保存に対応していることを利用する。
とりあえず \includegraphics ではないが前回の記事に書いた数式を EPS 形式で出力し、直接 Inkscape で開いてみるとこんな感じ。
で、メニューから「オブジェクト」→「グループ解除」するとこんな感じ。
パーツごとに選択できるようになっているので、適当に動かしたり削除したり、簡単。
他のツールはどうか
Windowsで使えるフリーの PDF トリミングツールとして Java ベースの PDF Scissors や PDF Slim などがあるが、これらはあくまで「PDFの表示領域を狭くする」だけであり、現に PDF ファイルサイズはほぼ変化しない。つまり、見えていない部分にテキストや図形が残ってしまっていて、ある種のソフトウェアを使えばこのあたりを復元できてしまう。また、商用の Adobe Acrobat を用いた場合もただトリミングしただけではこれらと状況は変わらず、非表示情報の削除まで実行して初めて完全に不要なデータを消去したことになる。
しかし、TeX2img のようにいったんアウトライン化し、Inkscape で不要な部分を取り除くとこれを完全に消滅させることができ、したがってファイルサイズが元より小さくなっているのが確認できる(ただし、アウトラインが複雑であればもしかすると解像度によってファイルサイズが大きくなるかもしれない?)。
また、PDFのベクター画像抽出という点でもいったんアウトライン化することによる恩恵を受けられる。商用の Illustrator もフリーの Inkscape も、TeX でよく用いられる Type 1 フォントを表示するには何らかの工夫が必要である。この点に関しては TeX Wiki に詳しい。しかし、TeX2img のように epswrite/eps2write を通すことによってアウトライン化すれば、この問題も回避できる。
唯一の問題としてテキスト情報が保持されないことがあるが、これは後から必要であれば Inkscape でテキストを自分で書き足せるので問題ない。
Mac のプレビューの長方形選択ツールは一見優れているが、僕の経験上、Mac で PowerPoint に貼り付けた後に Windows にファイルを移動するとなぜかフォントが変わってしまっていたことがあるので、安全ではない気がする*4。
TeX2img の限界
TeX2img は platex -> dvipdfmx を通すので、例えば dvips 依存の PSTricks はたぶん通らない*5。しかし、PSTricksを使うくらいなら一回 platex + dvips を通して PostScript 形式を出力し、それを TeX2img で \includegraphics すれば支障はない。
TeX2img を使わない、もしくは使えない場合でも、この TeX2img の仕組みをまねてコマンドラインから操作すれば目的の結果が得られるわけだし、その手本として TeX2img というツールが存在するという点でも意義は大きい。コマンドラインからの操作で TeX2img と同様の「アウトライン化」を行う方法については、先ほど挙げた TeX Wiki のページの他に
なども参考になる。
以上長くなったが、TeX2img の応用はとてつもなく広そうだ。
最後に、もう一度。
- Windows 版配布サイト:作ったもの,書いたもの,他(あべのりさんによる最新版)
- Mac 版配布サイト:TeX2img 配布サイト
*1:TeX2img が大幅にアップデートされたため修正:2014-10-18
*2:TeX Live には Perl が内蔵されているため、TeX Live ユーザは問題なく使える。
*3:Perl 依存の pdfcrop ではなく gs の epswrite/eps2write を使う方式が採用されたことの副次的な効果であるアウトライン化を、ひそかに僕は喜んでいるというわけだ。
*4:僕の場合だけだろうか…?
*5:ZRさんによると
にある通り、 bxdpx-pstricks.sty というパッケージを使えばなぜか dvipdfmx で PSTricks できるらしいが、今のところ他のサイトでこの方法を用いている例がなく、現時点で正攻法とはいえないだろう。この件について上の記事のコメント欄で dvipdfmx の一種のバグである可能性を指摘している方もいらっしゃるのだが、僕の記事公開後に別の方(角籐さん?)がコメントを追加され、バグ説を否定している。この件については僕の理解を超えているのでパス:2014-09-17 21:28変更