Apache PDFBox

Poppler の pdftotext は、「内容のコピーと抽出」という項目が許可しないになっていても、問題なくテキストを抽出してくれるので便利であったが、いくつかのPDFで厳密にテキストを抽出していないことに気がついた。問題の所在がはっきりしないのだが、ほとんどのPDFで厳密にテキストを抽出してくれている。しかし、一部のテキストしか抽出していない場合もあるようだ。そのようなPDFの特徴を特定できていない。

pdfbox.apache.org

PDFBox は Poppler が失敗するPDFであっても、テキストを抽出しているようにみえるので、こちらを利用したい。しかしながら、PDFBox は「内容のコピーと抽出」という項目が許可しないになっていると、抽出してくれない。それでは困るので、「内容のコピーと抽出」という項目が許可しないの場合でも抽出してくれるように、修正する。

PDFBox はJavaで書かれており、ビルドには Java Cryptography Extension (JCE) と Maven 3 が必要とある。FreeBSD の pkg で、devel/mavenjava/cryptix-jce を入れておく。devel/maven3 は 3.0.5、devel/maven33 は 3.3.9、devel/maven は 3.8.4。PDFBox のコンパイルには、3.1.0 以上が必要で、3.0.5 ではダメだった。

github.com

Tag を 2.0.25 にして pdfbox-2.0.25 のソースを github からもらってくる。修正するファイルは以下の通り。チェックをするところだけコメントアウト

./pdfbox-2.0.25/tools/src/main/java/org/apache/pdfbox/tools/ExtractText.java

                AccessPermission ap = document.getCurrentAccessPermission();
//                if( ! ap.canExtractContent() )
//                {
//                    throw new IOException( "You do not have permission to extract text" );
//                }

最新のものだと、チェックするif文のブロックの中身が少し違うが、if( ! ap.canExtractContent() ) の場所を探せば問題ないだろう。

% mvn clean install

とすると、pdfbox-app-2.0.25.jar をビルドしてくれる。

使い方は、

% java -jar pdfbox-app-2.0.25.jar ExtractText input.pdf output.txt

のように使う。