Apitore blog

Apitoreを運営していた元起業家のブログ

Java(PDFBox)でPDFファイルからテキストを抽出する

はじめに

Apitoreの次の商品の仕込みをしています。今回はJavaでPDFファイルからテキスト情報を取得します。ApacheからPDFBoxというOSSが出ていて、version 2.0から日本語にも対応したそうなのでこちらを使います。 amarec (20161203-095752)

ライブラリ

Mavenから以下のライブラリを取得します。pdfbox-toolspdfboxでよく使うケースをパッケージ化したものです。bcprov-jdk15onpdfboxで古い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-toolsExtractTextクラスに書かれています。抜粋して以下にサンプルプログラムを示します。

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が出て、一部文字化けしてしまいました。これについては、今回の目的ではそこまで細かい情報は必要ないので対策はしていません。