この記事では、Apache PDFBoxというライブラリを使ってPDFの内容をテキスト形式で抽出して、テキストファイルへ書き込む実装例を紹介します。
Apache PDFBoxライブラリを入手する
ライブラリは公式サイトから入手することができます。
以下のページから「pdfbox-app-2.0.20.jar」をダウンロードしましょう。
参考
Apache PDFBox | DownloadsApache PDFBox
サンプルPDF
今回使ったPDFは、IPAの試験要綱Ver.4.5です。以下のリンクからダウンロードできます。
参考
試験要綱Ver.4.5IPA 情報処理推進機構
サンプルコード
以下が処理の全容です。
MEMO
実行するには、先にダウンロードしたjarのビルドパスを通す必要があります。
Java
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class Pdf2Txt {
public static final void main(String[] args) throws IOException {
//PDFファイル名を指定する。(フルパス)
String pdf = "C:/workspace/youkou_ver4_5.pdf";
//PDFの内容をテキストに抽出する。
String result = new Pdf2Txt().ConvertPdf2Text(pdf);
//pdfファイル名と同名のtxtファイル名にする。
String txt = pdf.replace(".pdf", ".txt");
//テキストファイルへ書き出し。
new Pdf2Txt().ToTxt(result, txt);
}
/**
* PDFテキスト変換処理。
*
* 【処理概要】
* 引数に指定したPDFからテキストを抽出して返却する。
*
* @param input PDF名を指定。
* @return PDFから抽出したテキスト。
*/
private String ConvertPdf2Text(String input) {
//パスを取得。
Path p = Paths.get(input);
//PDFからテキストを抽出。
String result = "";
try(PDDocument doc = PDDocument.load(p.toFile())){
PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(doc.getNumberOfPages());
result = stripper.getText(doc);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* テキスト書き込み処理。
*
* 【処理概要】
* 第1引数に指定したテキスト内容を第2引数で指定したファイルへ書き込む。
*
* @param result 抽出したテキスト。
* @param output 書き込み先のテキストファイル名。
*
*/
private void ToTxt(String result, String output) throws IOException {
//パスを取得。
Path p = Paths.get(output);
//空ファイルの生成。
if(!Files.exists(p)){
Files.createFile(p);
}
//listへ変換。
List<String> list = Arrays.asList(result);
//ファイルに書き込み。
Files.write(p.toAbsolutePath(),
list,
StandardCharsets.UTF_8,
StandardOpenOption.TRUNCATE_EXISTING);
}
}
実行すると、以下のように、読み込んだPDFと同じフォルダに同名のテキストファイルとして出力されます。
実行結果
user01@DESKTOP-AQBVPOG MINGW64 /c/workspace
$ ls -l *.pdf *.txt
-rw-r--r-- 1 user01 197609 763713 8月 15 14:56 youkou_ver4_5.pdf
-rw-r--r-- 1 user01 197609 161756 8月 15 16:12 youkou_ver4_5.txt
解説:PDFテキスト変換処理
以下はサンプルコードからPDFテキスト変換処理メソッドを抜粋したものです。
実行結果
/**
* PDFテキスト変換処理。
*
* 【処理概要】
* 引数に指定したPDFからテキストを抽出して返却する。
*
* @param input PDF名を指定。
* @return PDFから抽出したテキスト。
*/
private String ConvertPdf2Text(String input) {
//パスを取得。
Path p = Paths.get(input);
//PDFからテキストを抽出。
String result = "";
try(PDDocument doc = PDDocument.load(p.toFile())){
PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(doc.getNumberOfPages());
result = stripper.getText(doc);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
解説
【17行目】:PDDocument.loadでPDFファイルを読み込みます。
PDDocumentは、一連の操作が終了した後にcloseメソッドを呼び出してクローズ処理をするひつようがあるのですが、
try-with-resource構文にすることにより、クローズ処理を自動化しています。
try-with-resource構文については以下の記事を参照してください。
解説
【19-20行目】:
PDFのどのページを読み込むのかの範囲指定を行っています。
「getNumberOfPages()」を使うと、PDFの総ページ数を取得できます。
今回は全ページ読み込みたいので、「setEndPage(doc.getNumberOfPages());」としています。
【21行目】:
実際にテキスト抽出しているのは「getText(doc);」の部分になります。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!