Categories: Java

【Java PDFBox】PDFからテキストを抽出する方法

この記事では、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がオススメ!同僚に差をつけよう!

issiki_wp