1.1.1 ページから全テキスト抽出

1-1-第1項ページから全テキスト抽出

狙い・効果

指定ページ中のテキストを全部抽出し、テキストファイルに保存します。

処理の概要

指定したページの Content 内のテキストを全て抽出し、指定した名前のテキストファイルとして出力します。テキストファイルは出力したいURIまで指定してください。

PDF Tool APIの主な機能

PtlParamExtractText: テキスト抽出時のパラメータ
何も指定しない場合は以下のデフォルト値が指定されたものとされます。

PtlContent.APIextractText(PtlParamExtractText): テキストを抽出

プログラム例

package cookbook;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.Charset;

import jp.co.antenna.ptl.*;

public class ExtractText {
    // そのクラスのusageを表示する関数
    private static void printUsage(){
        System.out.println("usage: java ExtractText in-pdf-file out-text-file" + 
                           " page-to-extract");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 3)
        {
            printUsage(); // usageメッセージの表示
            return;
        }

        // コマンドライン引数の読み取り・判定
        // 出力PDFの名前はあとで渡すためにString型で保存する。
        String outputTextURI = args[1];
        int pageToExtract = Integer.parseInt(args[2]);
        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            // PDFファイルをロード
            doc.load(inputFile);
            //ページ数を取得
            int wholePageNum = doc.getPageCount();
            //pageToExtractのエラー処理
            if(wholePageNum < pageToExtract)
            {
                System.out.println("ERROR: page-to-extractはPDFの総ページ数より"+
                                   "小さい値を指定してください。");
                System.out.println("総ページ数:" + wholePageNum);
                printUsage();
                return;
            }

            try (PtlPages pages = doc.getPages()) //ページコンテナの取得
            {
                // ページコンテナが空かどうか
                if (pages.isEmpty())
                {
                    System.out.println("ERROR : ページコンテナが空");
                    return;
                }

                     // ページの取得(パラメータindexは0が先頭のため1を引く)
                try (PtlPage page = pages.get(pageToExtract - 1);
                     // ページコンテントの取得
                     PtlContent content = page.getContent();
                     // 文字抽出のパラメータクラス。今回は何も指定しない。
                     PtlParamExtractText plainParam = new PtlParamExtractText())
                {
                    // 文字列抽出
                    String TextFromPdf = content.extractText(plainParam);

                    // 文字列の出力
                    outputTextFile(outputTextURI, TextFromPdf);
                    System.out.println(TextFromPdf);
                }
            }            
        }
        catch (PtlException pex) {
             System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() +
                                "\n  " + pex.getErrorMessage());
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        catch (Error ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        finally {
            System.out.println("-- 完了 --");
        }
    }

    /**
     * テキストファイルを出力するための関数。 
     * 出力エンコードはシステムのデフォルト値を利用する。
     * 特に外部からの呼び出しを想定しないためprivateとする。
     * 
     * @param outputTextURI 出力ファイルのURI。
     * @param TextFromPdf 出力したいString型変数
     */
    private static void outputTextFile(String outputTextURI, String TextFromPdf){
        System.out.println("Output text URI :" + outputTextURI);
        try(BufferedWriter bw = Files.newBufferedWriter(Paths.get(outputTextURI),
                                                        Charset.defaultCharset());
            PrintWriter pw = new PrintWriter(bw, false))
        {	
            pw.print(TextFromPdf);
        }
        catch(IOException e){
            System.out.println("IOException occured!!");
            e.printStackTrace();
        }
    }
}

プログラムファイル名

ExtractText.java

入出力操作の例

C:\samples>java cookbook.ExtractText 
usage: java ExtractText in-pdf-file out-text-file page-to-extract

C:\samples>java cookbook.ExtractText novelText.pdf outputText.txt 1 

Output text URI :outputText.txt
The Strange Case of Dr. Jekyll and Mr. Hyde ROBERT LOUIS STEVENSON MR.
UTTERSON the lawyer was a man of a rugged countenance, that was never 
  (略)
but even resisted the calls of business, that they might enjoy them
uninterrupted.    
-- 完了 --

novelText.pdfファイルの内容全文を抽出してoutputText.txtファイルに保存します。