JavaでPDFから文章を抽出

プログラム上からPDFの文章を取り出したいと思うことがあったので、方法を調べてみた。
PDFBoxというツールを使うと結構いい感じに抽出できた。
以下に簡単なサンプルプログラムを示す。

import java.io.*;

import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class ExtractPDF {
  private static String extractText(String filePath)
      throws FileNotFoundException, IOException {
    FileInputStream pdfStream = new FileInputStream(filePath);
    PDFParser parser = new PDFParser(pdfStream);
    parser.parse();
    PDDocument pdf = parser.getPDDocument();
    PDFTextStripper stripper = new PDFTextStripper();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    stripper.writeText(pdf, new BufferedWriter(new OutputStreamWriter(out)));
    return out.toString();
  }
  public static void main(String[] args) throws Exception {
    String pdfFile = "test.pdf";
    String data = extractText(pdfFile);
    System.out.println(data);
  }
}

手元の適当な論文に対する出力結果

Online EM for Unsupervised Models
Percy Liang Dan Klein
Computer Science Division, EECS Department
University of California at Berkeley
Berkeley, CA 94720
fpliang,kleing@cs.berkeley.edu
Abstract
The (batch) EM algorithm plays an important
role in unsupervised induction, but it some-
(中略)
EM sEM‘ EM sEM‘
POS 56:2  1:36 58:8  0:73; 1:41  6:01  6:09
DOC 41:2  1:97 51:4  0:97; 2:82  7:93  7:88
SEG(en) 80:5  0:0 81:0  0:0; 0:42  4:1  4:1
SEG(ch) 78:2  0:0 77:2  0:0; 0:04  7:26  7:27
ALIGN 79:0  0:14 78:8  0:14; 0:25  5:04  5:11
Table 2: Mean and standard deviation over different ran-
dom seeds. For EM and sEM, the first number after  
(以下略)

参考

Luceneと併用して全文検索を行なうことも可能なよう

残念ながら日本語のPDFには対応してないようですが、パッチを当てれば読める場合もあるようです