TeX Alchemist Online

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

Swift を使ってPDFのナントカBoxの情報を取得する

ここしばらく,PDFのナントカBoxをめぐって進歩が相次いでいます。

doratex.hatenablog.jp

acetaminophen.hatenablog.com

acetaminophen.hatenablog.com

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

最近の特に大きな技術進歩は,来年の TeX Live 2016 からは (x)dvipdfmx で \includegraphics の pagebox= オプションが使えるようになる という点です。

さて,今日は(TeX とは直接の関係はありませんが)それと関連して,Swift プログラミングの話題です。 前掲の「dvipdfmx で複数ページPDF/AIファイルを \includegraphics する」の記事で紹介した pdfinfo を使えば,PDFのナントカBoxの詳細な情報を取得することが可能です。 これと同じ機能を Swift で実装してみました。

実装法

CoreGraphics の CGPDFPageRef, CGPDFPageGetBoxRect に Swift からアクセスすることでナントカBoxの値を得る。

仕様

  • 引数に与えられたPDFの全ページの全ボックス値を表示する。
  • 他のボックスが MediaBox をはみ出している不正なPDFの場合,PDFの仕様では「MediaBox でクリップしたものをそのボックス値として採用すること」となっているが,CGPDFPageGetBoxRect はクリップする前の生のボックス値を返す仕様になっている。
  • そこで,MediaBox をはみ出したボックスについては,MediaBox によるクリップを行う前と行った後の両方のボックス値を表示するようにした。

制限

以前の記事 で述べたように,PDFの仕様では,ボックス値が非明示であった次のように規定されている。~~

  • MediaBox の値は必ず明示される。
  • CropBox の値が明示されていない場合は,MediaBox と同じと解釈される。
  • BleedBox,TrimBox,ArtBox の値が明示されていない場合は,CropBox と同じと解釈される。

そちらの記事では,各ボックスが明示・非明示のどちらであるかを表示する機能を持った拡張版 pdfinfo を開発した。それに対し,CoreGraphics の機能を用いたボックス値取得では,それが明示・非明示のいずれであるかを判定することはできない。よって,この Swift プログラムもその制限を継承しており,明示・非明示ボックスの区別できない。(よって dvipdfmx の挙動を追跡・模倣することはできない。)( 最新の dvipdfmx では仕様が変わりました。)

ソース

Gist に置いておきます。

コンパイル法

Swift のコマンドラインコンパイラである swiftc コマンドによって,次のようにコンパイルできます。

swiftc -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -o pageboxinfo pageboxinfo.swift

(SDKのパスは各自の環境に応じて変更してください。)

実行例

$ ./pageboxinfo hoge.pdf
---------------------------------------------------------
Page    1 MediaBox:     0.00     0.00   250.00   250.00
Page    1 CropBox:    -30.00   -30.00   220.00   100.00
 *clipped CropBox:      0.00     0.00   220.00   100.00
Page    1 BleedBox:    -5.00   -45.00   170.00   200.00
 *clipped BleedBox:     0.00     0.00   170.00   200.00
Page    1 TrimBox:     70.00    20.00   150.00   120.00
Page    1 ArtBox:      60.00    10.00   100.00   150.00
Page    1 Rotate: 0
---------------------------------------------------------
Page    2 MediaBox:     0.00     0.00   515.91   728.50
Page    2 CropBox:      9.00    25.00   515.91   728.50
Page    2 BleedBox:     0.00     0.00   515.91   728.50
Page    2 TrimBox:      0.00     0.00   515.91   728.50
Page    2 ArtBox:       0.00     0.00   515.91   728.50
Page    2 Rotate: 90
---------------------------------------------------------

感想

OS X の Quartz API による PDF 操作能力は強力ですね。また Swift のおかげで従来よりスクリプト的に気軽に使えるようになって,色々な可能性が考えられます。PDFの分割・統合なども簡単に書けます。他にも色々な応用が考えられそうです。