9.1.3 抽出した文字から置換文字をスペースに置き換える

ExtTextWithRplcReplacementCharacterToSpace_Top

狙い・効果

抽出する文字列に含まれた置換文字をスペースに置き換えます。

処理の概要

抽出する文字列の中から置換文字を削除し、スペースに置き換えます。置換文字は「�」の記号で表記される機種の相性などで表示できない文字を表すための特殊文字です。UnicodeではFFFDで表されます。

PtlParamExtractText.setUnicodeToSpace()を使います。
AHEXTRACTTEXT_UNI_REPLACEMENT_CHARACTERを対象に指定することで、文字抽出抽出した文字列に含まれた置換文字を普通のスペースに置き換えます。 置き換える文字種はint型で表したフラグで指定します。

サンプルプログラムでは、入力PDFの指定したページ全体から文字列を抜き出す際に、置換文字をスペースに置き換えるか、置き換えないかを切り替えてテキスト抽出します。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;

import jp.co.antenna.ptl.*;

public class ExtTextWithRplcReplacementCharacterToSpace {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java ExtTextWithRplcReplacementCharacterToSpace"
                         + " in-pdf-file out-text-file"
                         + " page-to-extract rplc-replacement-character");
        System.out.println("--以下の文字に対して、[0:スペースに置き換えない  1:置き換える]を選択--");
        System.out.println("rplc-replacement-character : 置換文字");
    }

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

        // コマンドライン引数の読み取り・判定
        // 出力PDFの名前はあとで渡すためにString型で保存する。
        String outputTextURI = args[1];
        int pageToExtract = Integer.parseInt(args[2]);
        boolean rplcReplacementCharacter;
        int unicodeCharFlag = 0;

        //各種削除フラグの読み取り判定
        //rplc-replacement-character
        try {
            rplcReplacementCharacter = readBoolArgs(args[3],
                                                   "rplc-replacement-characterは" +
                                                   "0か1で指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }

        //各フラグの論理和をunicodeCharFlagに設定
        if(rplcReplacementCharacter) {
            unicodeCharFlag = unicodeCharFlag | PtlParamExtractText.AHEXTRACTTEXT_UNI_REPLACEMENT_CHARACTER;
        }


        try(PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlPDFDocument doc = new PtlPDFDocument()) {
            // PDFファイルをロード
            doc.load(inputFile);
            try(PtlPages pages = doc.getPages()) {//ページコンテナの取得
                // ページコンテナが空かどうか
                if(pages.isEmpty()) {
                    System.out.println("ERROR : ページコンテナが空");
                    throw new Error("ERROR : ページコンテナが空");
                }
                //ページ数を取得
                int wholePageNum = doc.getPageCount();

                //pageToExtractが0ならすべてのページを処理する
                if(pageToExtract == 0) {
                    StringBuilder wholeTextFromPdf = new StringBuilder();
                    // ページの取得(パラメータindexは0が先頭のため1を引く)
                    for(int i = 0; i < wholePageNum; i++) {
                        try(PtlPage page = pages.get(i);
                            PtlContent content = page.getContent()) { // ページコンテントの取得
                            System.out.println((i+1)  + "ページ目のテキストを抽出します。");
                            wholeTextFromPdf.append(extractTextSetReplaceUnicodeFlag(unicodeCharFlag, content));
                        }
                    }
                    outputTextFile(outputTextURI, wholeTextFromPdf.toString());
                }else {
                    if(wholePageNum < pageToExtract) { //pageToExtractのエラー処理
	...【ExtTextWithRplcIdeographicSpaceToSpace.javaと同じ処理のため省略
	   ・総ページ数よりも大きいページ数を指定した場合のエラー処理】...
                    }
                    try(PtlPage page = pages.get(pageToExtract - 1); //指定したページを取得する
                        PtlContent content = page.getContent()) {
                         System.out.println(pageToExtract  + "ページ目のテキストを抽出します。");
                        outputTextFile(outputTextURI, extractTextSetReplaceUnicodeFlag(unicodeCharFlag, content));
                    }
                }
            }
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }


    private static String extractTextSetReplaceUnicodeFlag(int unicodeCharFlag, PtlContent content)
                        throws IOException, PtlException, Exception, Error {
        try(PtlParamExtractText paramExtractText = new PtlParamExtractText()) { // 文字抽出のパラメータクラス。
            //setUnicodeToRemoveをパラメータに設定
            paramExtractText.setUnicodeToSpace(unicodeCharFlag);
            // 文字列抽出
            String textFromPdf = content.extractText(paramExtractText);
            System.out.println(textFromPdf);

            // 抽出した文字列を返す
            return textFromPdf;
        }
    }

    /**
     * テキストファイルを出力するための関数。 
     * 出力エンコードはUTF-8を指定する。
     * 特に外部からの呼び出しを想定しないためprivateとする。
     * 
     * @param outputTextURI 出力ファイルのURI。
     * @param TextFromPdf 出力したいString型変数
     */
    private static void outputTextFile(String outputTextURI, String TextFromPdf){
	...【ExtractTextSetRect.javaと同じ処理のため省略
	   ・outputTextURIのパスにTextFromPDFの内容をUTF-8エンコーディングで出力する処理】...
    }


    /**
     * 0または1を入力されたargsにより、trueまたはfalseを返すメソッド。
     * 
     * @param args 与えられるコマンドライン引数。0または1でtrueまたはfalseを指定する。
     * @param errorMessage argsが0か1でなかった場合に出力されるエラーメッセージを指定する。
     * @return argsの数値を読み取った結果を戻す
     * @throws java.lang.IllegalArgumentException argsが0か1でなかった場合に発生。
     */
    public static boolean readBoolArgs(String args, String errorMessage)
        throws IllegalArgumentException {
	...【FixUpPDFASetSaveOption.javaと同じ処理のため省略
	   ・0または1を読み取り、boolean型のfalseまたはtrueを返す関数】...
    }
}

プログラムファイル名

ExtTextWithRplcReplacementCharacterToSpace.java

入出力操作の例

C:\samples>java cookbook.ExtTextWithRplcReplacementCharacterToSpace 
usage: java ExtTextWithRplcReplacementCharacterToSpace in-pdf-file out-text-file page-to-extract rplc-replacement-character
--以下の文字に対して、[0:スペースに置き換えない  1:置き換える]を選択--
rplc-replacement-character : 置換文字

C:\samples>java cookbook.ExtTextWithRplcReplacementCharacterToSpace Special_letter_sample_ReplacementCharacter.pdf Output_ExtTextWithRplcReplacementCharacterToSpace.txt 0 1 
1ページ目のテキストを抽出します。
特殊文字Replacement CharacterReplacement Character(UFFFD) ishere" "
Output text URI :Output_ExtTextWithRplcReplacementCharacterToSpace.txt
-- 完了 --

この操作例では置換文字が入ったPDF(下図)を使用しています。コマンドラインの注意事項は前項と同様です。

5-9-1-3_ExtTextWithRplcReplacementCharacterToSpace

図9.7 置換文字を挿入したPDF

図9.8、図9.9は、置換文字を半角スペースに置き換えた例とそのままにした例の比較です。

5-9-1-3_ExtTextWithRplcReplacementCharacterToSpace_01

図9.8 操作例の出力テキスト。置換文字を半角スペースに置き換えている

5-9-1-3_ExtTextWithRplcReplacementCharacterToSpace_02

図9.9 置換文字をそのまま残した例。置換文字はメモ帳で表示できないため、四角の記号(トーフ)になっている。