Hatena::ブログ(Diary)

アセトアミノフェンの気ままな日常

2015-07-16

BoundingBox がとにかくややこしい話(1)

PDF の ナントカBox を好き勝手にいじってみるという実験をしてみよう。例えば手元にある PDF を Emacs で開いてみると ナントカBox はどこに書かれているのか探し出すことができるし、仮に失敗したとしても QPDF を使えばテキストエディタで覗いてみることができる:例えば

 $ qpdf --qdf hoge.pdf hoge-out.qdf

を実行すればよく(q と p に注意!)、適宜いじって元の PDF に戻すには

 $ fix-qdf < hoge-out.qdf > hoge-out.pdf

のようにする。今回は5つの ナントカBox を明示的に指定した適当な PDF を作成*1した後、QPDF とエディタを駆使して勝手に ナントカBox を改変した。良い子はマネしないこと;)

これにより、test-1.pdf では「/MediaBox → /ArtBox → /BleedBox → /CropBox → /TrimBox」の順(この順は恣意的で、たまたま僕がエディタで開いたときに目についた Box から順に小さい値をつけただけ)に左下と右上の座標が小さくなるようにした*2。逆に test-2.pdf では完全な逆順になるようにした。作った PDF は全て GitHub に置いてある(説明もそちら)。

1. pdfinfo の仕様を確認する

pdfinfo は XpdfPoppler に付属しているツールで、説明書によると

-box
Prints the page box bounding boxes: MediaBox, CropBox, BleedBox, TrimBox, and ArtBox.

すなわち5つの ナントカBox を簡単に -box オプションで表示できるらしい。この機能を、今作った PDF で試してみることにしよう(これは test-1.pdf のように実行した結果の一部抜粋)。

 $ pdfinfo -box -f 1 -l 1 test-1.pdf
------------------------------------------------------------------------
Page    1 MediaBox:   100.00   100.00  1100.00  1100.00
Page    1 CropBox:    403.00   403.00  1100.00  1100.00
Page    1 BleedBox:   302.00   302.00  1100.00  1100.00
Page    1 TrimBox:    504.00   504.00  1100.00  1100.00
Page    1 ArtBox:     201.00   201.00  1100.00  1100.00
------------------------------------------------------------------------
 $ pdfinfo -box -f 1 -l 1 test-2.pdf
------------------------------------------------------------------------
Page    1 MediaBox:   504.00   504.00  1504.00  1504.00
Page    1 CropBox:    504.00   504.00  1201.00  1201.00
Page    1 BleedBox:   504.00   504.00  1302.00  1302.00
Page    1 TrimBox:    504.00   504.00  1100.00  1100.00
Page    1 ArtBox:     504.00   504.00  1403.00  1403.00
------------------------------------------------------------------------

これを見る限り、pdfinfo が返す ナントカBox の値は「該当する ナントカBox と MediaBox の共通範囲」であると結論づけることができる。…なんでそんな仕様になっているのかよくわからないが、PDF の仕様書をみるかぎり MediaBox は常に一番広いということが前提になっているように思える定められているので問題ないということだろう。

  • 追記:doraTeX さんから Xpdf のコードで MediaBox によって切り抜き処理が行われていることを教えていただいた。つまり、Xpdf は意図的に上記の仕様を採用したようである。
  • 追記:ZR さんから「MediaBox をほかの Box がはみ出した不正な場合は、実効的に MediaBox に合わせてクリップする」と仕様書に書かれていることを教えていただいた。つまり僕が今回捏造した PDF は“不正”だ!*3

2. extractbb の仕様を確認する

一方、extractbb の結果は ZR さんが説明しているとおり(仕様書どおり)で

CropBox → ArtBox → TrimBox → BleedBox → MediaBox の順で明示されている最初のものを使う。

ことになっている。実際に先ほど作った PDF を extractbb にかけてみると

 $ extractbb -O test-1.pdf
%%Title: test-1.pdf
%%Creator: extractbb 20150315
%%BoundingBox: 403 403 1403 1403
%%HiResBoundingBox: 403.000000 403.000000 1403.000000 1403.000000
%%PDFVersion: 1.3
%%Pages: 1
%%CreationDate: Thu Jul 16 13:22:36 2015
 $ extractbb -O test-2.pdf
%%Title: test-2.pdf
%%Creator: extractbb 20150315
%%BoundingBox: 201 201 1201 1201
%%HiResBoundingBox: 201.000000 201.000000 1201.000000 1201.000000
%%PDFVersion: 1.3
%%Pages: 1
%%CreationDate: Thu Jul 16 13:24:14 2015

上の pdfinfo の結果と異なり、extractbb は文字通り優先順位に従った ナントカBox の値を返す(今回は当然 CropBox である)。このとき、MediaBox と共通かどうかは無頓着であるという点が pdfinfo と異なる。この点には今日初めて気づいたが、注意を要する。ついでなので、ここで extractbb の優先順位も実際に確認しておこう。

Preview-02.pdf(=test-1.pdf と同一);5つ全て明示

%%BoundingBox: 403 403 1403 1403
%%HiResBoundingBox: 403.000000 403.000000 1403.000000 1403.000000

Illustrator-02.pdf:上から CropBox を削除

%%BoundingBox: 201 201 1201 1201
%%HiResBoundingBox: 201.000000 201.000000 1201.000000 1201.000000

Illustrator-03.pdf:さらに ArtBox を削除

%%BoundingBox: 504 504 1504 1504
%%HiResBoundingBox: 504.000000 504.000000 1504.000000 1504.000000

Illustrator-04.pdf:さらに TrimBox を削除

%%BoundingBox: 302 302 1302 1302
%%HiResBoundingBox: 302.000000 302.000000 1302.000000 1302.000000

Illustrator-05.pdf:さらに BleedBox を削除(つまり MediaBox だけ)

%%BoundingBox: 100 100 1100 1100
%%HiResBoundingBox: 100.000000 100.000000 1100.000000 1100.000000

以上で extractbb の追試は十分であろう。(続く

追記:今回の記事を総合すると

  • pdfinfo は PDF の仕様書に即した結果、「すべての Box を返すが、MediaBox をはみ出した Box を自動的にクリップする」という実装である
  • extractbb (dvipdfmx) は PDF の仕様書に従わず、「dvipdfmx 独自の選択律で選んだ Box をそのまま返し、それがたとえ MediaBox をはみ出していてもクリップしない」という二重に仕様書と齟齬を来す実装である

といえる。ユーザはこの違いを認識しておかなければいけないだろう。なにしろ、たとえ PDF 的に見て間違っていても dvipdfmx にとっての正義は extractbb だからである(昨日読んだ説明書に定められていたのだから、誰がどう言おうと「そうなっている」)。

*1:これは例えば Illustrator で保存した PDF を Preview.app でクロップして保存すれば簡単である:doraTeX さんの記事参照。

*2:つまり左下は /MediaBox が一番広い範囲・/TrimBox が一番狭い範囲であり、右上は /MediaBox が一番狭い範囲・/TrimBox が一番広い範囲であることになる。

*3:最初から「良い子はマネしないこと;)」と書いておいたのはこれを予期してのことである;)。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証