はじめに
Apitoreの次の商品の仕込みをしています。今回はJavaでPDFファイルからテキスト情報を取得します。ApacheからPDFBoxというOSSが出ていて、version 2.0から日本語にも対応したそうなのでこちらを使います。
ライブラリ
Mavenから以下のライブラリを取得します。pdfbox-tools
はpdfbox
でよく使うケースをパッケージ化したものです。bcprov-jdk15on
はpdfbox
で古いPDFファイルを入力したときにエラーが出たので追加しました。
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.55</version>
</dependency>
ケース1:PDFファイルをTEXTファイルにする
pdfbox-tools
を使うと簡単にできます。サンプルプログラムを以下に示します。
String pdfFile = "sample.pdf";
String textFile = "sample.txt";
textFile = textFile + "txt";
try
{
ExtractText.main(new String[]{pdfFile, textFile});
}
catch( Exception e )
{
System.err.println("Error processing " + pdfFile + e.getMessage() );
}
ケース2:PDFファイルのテキストをStringで取得する
pdfbox-tools
のExtractText
クラスに書かれています。抜粋して以下にサンプルプログラムを示します。
boolean sort = false;
boolean separateBeads = true;
String password = "";
int startPage = 1;
int endPage = 2147483647;
String pdfFile = "sample.pdf";
PDDocument document = null;
StringWriter output = null;
try
{
document = PDDocument.load(new File(pdfFile), password);
AccessPermission ap = document.getCurrentAccessPermission();
if (!(ap.canExtractContent())) {
throw new IOException("You do not have permission to extract text");
}
output = new StringWriter();
PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(sort);
stripper.setShouldSeparateByBeads(separateBeads);
stripper.setStartPage(startPage);
stripper.setEndPage(endPage);
stripper.writeText(document, output);
String content = output.toString();
System.out.println(content);
}
catch( Exception e )
{
System.err.println("Error processing " + pdfFile + e.getMessage() );
} finally {
IOUtils.closeQuietly(output);
IOUtils.closeQuietly(document);
}
おわりに
PDFBoxという便利なライブラリがOSSというのはありがたいです。なぜかネットではあまり情報が見つからなかったので、今回記事にしました。言語処理学会の論文からテキストを抽出してみましたが、古いPDFファイルは"No Unicode mapping for"というWarningが出て、一部文字化けしてしまいました。これについては、今回の目的ではそこまで細かい情報は必要ないので対策はしていません。