Apache PDFBox
Poppler の pdftotext は、「内容のコピーと抽出」という項目が許可しないになっていても、問題なくテキストを抽出してくれるので便利であったが、いくつかのPDFで厳密にテキストを抽出していないことに気がついた。問題の所在がはっきりしないのだが、ほとんどのPDFで厳密にテキストを抽出してくれている。しかし、一部のテキストしか抽出していない場合もあるようだ。そのようなPDFの特徴を特定できていない。
PDFBox は Poppler が失敗するPDFであっても、テキストを抽出しているようにみえるので、こちらを利用したい。しかしながら、PDFBox は「内容のコピーと抽出」という項目が許可しないになっていると、抽出してくれない。それでは困るので、「内容のコピーと抽出」という項目が許可しないの場合でも抽出してくれるように、修正する。
PDFBox はJavaで書かれており、ビルドには Java Cryptography Extension (JCE) と Maven 3 が必要とある。FreeBSD の pkg で、devel/maven と java/cryptix-jce を入れておく。devel/maven3 は 3.0.5、devel/maven33 は 3.3.9、devel/maven は 3.8.4。PDFBox のコンパイルには、3.1.0 以上が必要で、3.0.5 ではダメだった。
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
のように使う。