easy-pdf-merge で java.io.IOException: Missing root object specification in trailer エラー

easy-pdf-merge という npm で java.io.IOException: Missing root object specification in trailer エラーが発生したら内部で利用している Java ライブラリ Apache PDFBox のバージョンが古い可能性があります。

npm

突然発生した IOException

Error: Command failed: java -jar "/path/to/myapp/node_modules/easy-pdf-merge/jar/pdfbox.jar" PDFMerger "/tmp/a.pdf" "/tmp/b.pdf"
 
Exception in thread "main" java.io.IOException: Missing root object specification in trailer.
    org.apache.pdfbox.pdfparser.COSParser.parseTrailerValuesDynamically(COSParser.java:2156)
    org.apache.pdfbox.pdfparser.PDFParser.initialParse(PDFParser.java:222)
    org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:271)
    org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:987)
    org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:943)
    org.apache.pdfbox.debugger.PDFDebugger.parseDocument(PDFDebugger.java:1369)
    org.apache.pdfbox.debugger.PDFDebugger.readPDFFile(PDFDebugger.java:1283)
    org.apache.pdfbox.debugger.PDFDebugger.readPDFFile(PDFDebugger.java:1266)
    org.apache.pdfbox.debugger.PDFDebugger.main(PDFDebugger.java:254)
    org.apache.pdfbox.tools.PDFBox.main(PDFBox.java:85)

Google 検索してみると [PDFBOX-3717] java.io.IOException: Missing root object specification in trailer – ASF JIRA の issue を見つけました。どうやら PDFBox のバグを踏んだようです。

Fix Version/s: 2.0.6 と書かれているので、修正されているバージョン 2.0.6 以上に上げることを検討します。

easy-pdf-merge アップデート

普通だったら easy-pdf-merge をアップデートすれば解決するはずなのですが、easy-pdf-merge 本家 repository はメンテナンスされてないので、

  • 自分で fork する
  • fork されている中からアップデートされている repository を探す

のどちらかで対応することを検討しました。

今回は fork されている repository に使えるものがあったのでそれを利用することにしました。調査の過程について、詳しく説明していきます。

easy-pdf-merge 本家は PDFBox v2.0.1

package.json を以下のようにして npm install したとき、

"easy-pdf-merge": "0.1.3",

インストールされる PDFBox を確認してみると、バージョンは 2.0.1 でした。

java -jar node_modules/easy-pdf-merge/jar/pdfbox.jar -version
PDFBox version: "2.0.1"

easy-pdf-merge fork 版は PDFBox v2.0.8

fork している repository の中から最終更新日が直近な f2fgroup/easy-pdf-merge を使ってみます。

easy-pdf-merge/network

直近の commit log を確認してみると PDFBox version 2.0.8 を利用しているみたいです。

rebuild 2.0.8 · f2fgroup/easy-pdf-merge@2931462

実際に、package.json を以下のようにして npm install すると、

"easy-pdf-merge": "git://github.com/f2fgroup/easy-pdf-merge.git#ed345e23f2aef9a9dab62fcae5a85a1b15af3189",

インストールされる PDFBox はちゃんと version 2.0.8 なことを確認できました。

java -jar node_modules/easy-pdf-merge/jar/pdfbox.jar -version
PDFBox version: "2.0.8"

以上、PDFBox のバグを踏んで easy-pdf-merge をアップデートした現場からお送りしました。