OS X El Capitan での PDFtk

カテゴリ: Mac OS X

2015年12月20日追記: フォロー記事 (リンク) を書きました。El Capitan で使える PDFtk が公開されています。

PDFtk はコマンドラインから PDF ファイルを編集できるツール。
PDF Labs で公開されている。
このツールを使うと PDF の結合や分割などが簡単にできるので重宝している。

Mac OS X で使える PDFtk としては、公式には、PDFtk Server が配布されている。
公式には 10.6 (Snow Leopard) から 10.8 (Mountain Lion) までサポートとされているが、
少なくとも 10.10 (Yosemite) までは使うことができていた。

ところが先日公開された 10.11 El Capitan では、pdftk コマンドが使えなくなってしまった。
とりあえず私が確認した症状は、PDF ファイルの結合を実行しようとすると、
出力先に空のファイルを作ったまま応答がなくなってしまうものである。
Homebrew 経由で pdftk を入れるとしても、入るのは PDF Labs のバイナリであり、
全く同様の症状が起こる。

ソースコードから直接ビルドしようともしたが、El Capitan ではビルドできなかった。
ソースコードをコンパイルするためには、依存している Java ソフトウェア群から
gcjh (gjavah) で CNI 形式の C ヘッダファイルを得る必要があるが、
gcjh が El Capitan 上で動かなかった。
Oracle JDK の javah は動くが、これは CNI 形式を出力できず、ビルドが失敗する。

今後 PDFtk が公式にアップデートされるのかはよくわからない。

以下は試行錯誤の記録。

以下、本稿執筆時の情報で書いているため、バージョン番号等には注意してください。
必要に応じて最新の情報を検索・参照してください。

PDFtk のソースコードには、前述の PDFtk Server のページからアクセスできる。
zip ファイルのURL: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-src.zip

このソースをビルドするには gccgcj が必要というふうに
公式には説明されているが、なにぶん古い情報である。
gccgcj で試してみたが、全くビルドできなかった。
そもそも El Capitan で gcj が機能せず、
.java ファイルをコンパイルして .class ファイルにすることができなかった。
なお .jar ファイルをコンパイルして .o ファイルを作成することはできる様子。
また Java のコードが libgcj に依存しているので、インストールはしておく。
gccgcj は Homebrew 経由でインストールできて使えるので、それを使う。

$ brew install gcc --with-java

必要があれば --without-multilib など他のオプションもつける。
OS X 標準の gcc (=clang) との混同を避けるために、
実行ファイルは gcc-5 という名前でインストールされる。
gcc のビルドにはかなりの時間 (30分とか1時間とか) を要するので注意。

gcj は使えなかったわけだが、しかし Java のコンパイラは必要である。
ターミナルで

$ java

を実行した時に、No Java runtime present, requesting install. と言われて
ポップアップが出てしまうようなら、「詳しい情報」をクリックして Oracle のページに行き、
Java JDK を改めてインストールする。私は Java 8 にした。
El Capitan へアップグレードする以前 (Yosemite 以前) に Java をインストールしていた場合も、
改めて再度 Java JDK をインストールし直す必要がある様子。少なくとも私の環境ではそうだった。

余談だが El Capitan は Java 6 をサポートする最後の OS X になるそう。

Java が用意できたら、PDFtk のソースをダウンロード・展開する。

$ wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-src.zip
$ unzip pdftk-2.02-src.zip
$ cd pdftk-2.02-dist

pdftk/ 以下に環境ごとの Makefile が用意されているので、これを OS X 10.11 向けに書きなおす。
gcj を使うことになっている部分は全部 Oracle Java を使うように書きなおす。

$ cd pdftk
$ cp Makefile.OSX-10.{6,11}
$ vi Makefile.OSX-10.11

編集は次のような感じで。手で編集してもいいし、patch してもいい。

make したときのターゲット類は Makefile.Base にまとまっている。
依存関係の解決がうまくできておらず並列コンパイルができないので修正する。

$ cp Makefile.Base{,.bak}
$ vi Makefile.Base

編集は次のような感じで。手で編集してもいいし、patch してもいい。

実際に Java のビルドが走るのは ../java/ 以下で、ここの Makefile も書き直す。

$ cd ../java
$ cp Makefile{,.bak}
$ vi Makefile

編集は次のような感じで。手で編集してもいいし、patch してもいい。

いざビルド。エラーが出たら頑張って対応する。

$ cd ../pdftk
$ make -f Makefile.OSX-10.11

とりあえず Java のコンパイルまではできたが、PDFtk 本体のコンパイルに失敗する。
原因は、javah の出力する C ヘッダファイルが JNI 形式になっていて、
CNI で書いているソースコードと整合が取れないことのようである。
型定義が重複しているとか、変数が未定義とかいって怒られる。
javah では CNI 形式は出力できないし、CNI を書き出せる gcjh (gjavah) は El Capitan では動かない。

困った。もう PDFtk は諦めて別のツールを探したほうがいいのかな。

2015/10/06 (火)

コメント