4.1.2 PtlEditTextの情報を取得

GetPtlEditTextInfo_Top

狙い・効果

PDFに含まれるエレメントテキストオブジェクトの情報を表示します。

処理の概要

PtlEditText、PtlEditTextItemを用いてPDFに含まれるテキストの情報(テキストオブジェクトが持つテキストの矩形の座標、テキスト内容、フォント情報、ペイントフラグ、ストロークカラー、塗りつぶしカラー)を取得します。

getStrokeColor()でテキストのストロークカラー、getFillColor()で塗りつぶしカラーを取得します。

getStrokeColor及びgetFillColorでは各色空間のベースクラスであるPtlColorクラスの形で色情報を得ます。なお、色情報の内容を読み取るためには適切な形にリキャストする必要があり、PtlColor.getCSType()で色空間の種類を取得します。色空間に関する詳細は「『PDF CookBook』(第1巻)2.1.3 文字の色指定」及び本書「10.4.1 Separation Colorの対応」を参照してください。

テキストのフォント情報はgetFontInfo()で取得できます。取得したPtlFontInfoから情報を読み取ってください。

サンプルプログラムでは、入力したPDFに含まれるすべてのテキストオブジェクトが持つこれらの情報を取得し、コンソール上に表示します。

『PDF Tool API』の主な機能

表4.4 PtlFontInfo.FONT_TYPEの種別
列挙型定数
フォントタイプ
FONT_CID_TRUETYPE
TrueType(CID)
FONT_CID_TYPE1
Type1(CID)
FONT_MMType1
MMType1
FONT_TRUETYPE
TrueType
FONT_TYPE1
Type1
FONT_TYPE3
Type3
FONT_UNKNOWN
未知のフォント
表4.5 PtlFontInfo.ENCODING_TYPEの種別
列挙型定数
フォントタイプ
ENCODING_BUILTIN
ビルトイン
ENCODING_CUSTOM
カスタム
ENCODING_NAME
エンコーディング名あり
ENCODING_UNKNOWN
未知のエンコーディング
表4.6 ペイントフラグの種別
列挙型定数
ペイントフラグ
PAINT_FILL
非ゼロ回転規則に基づいてパスを塗りつぶす
PAINT_INVISIBLE
ストロークも塗りつぶしも行わない
PAINT_STROKE
ストロークする

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class GetPtlEditTextInfo {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java GetPtlEditTextInfo in-pdf-file");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 1) {
            printUsage();
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlPDFDocument doc = new PtlPDFDocument()) {
            // PDFファイルをロードします。
            doc.load(inputFile);

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

                for(int i = 0;i < pages.getCount();i++) { // ページ数の取得
                    System.out.println("-----------------");
                    System.out.println(i+"ページ目の情報を表示します。");
                    try (PtlPage page = pages.get(i)) {
                        getEditTextInfo(page);
                    }
                    System.out.println("-----------------");
                }
            }
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }


    /**
     * 読み込まれたページに含まれるTEXTエレメントが持つ情報を表示する関数です。
     * @param page 読み込まれたページ
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getEditTextInfo(PtlPage page)
                        throws PtlException, Exception, Error {
        try(PtlContent content = page.getContent();// 挿入先ページコンテントの取得
            PtlEditElements elems = content.getEditElements(PtlContent.GET_TEXT)) {
            int numOfElements = elems.getCount();
            System.out.println("このページに含まれるTEXTエレメントの数は" + numOfElements + "です。");

            for(int i = 0; i < numOfElements; i++) {
                try(PtlEditElement element = elems.get(i)) {
                    System.out.println("---" + i + "番目のTEXTエレメントの情報を表示します。---");


                    //エレメントに共通の情報(BBox, ClippedBox)の情報を表示
                    getElementInfo(element);


                    //タイプがTEXTであることを確認
                    if(element.getType() == PtlEditElement.ELEMENT_TYPE.TYPE_TEXT) {
                        try(PtlEditText textElement = (PtlEditText)element;
                            PtlEditTextItems textItems = textElement.getTextItems()) {

                            System.out.println("TEXTエレメント固有の情報を表示します。");
                            System.out.println("テキストアイテムの情報を表示します。");
                            getTextItemsInfo(textItems);
                        }
                    }
                    else{
                        System.out.println("ERROR: このエレメントはTEXTではありません。");
                        System.out.println("Element Number: " + i);
                        System.out.println("Element Type: " + element.getType());
                    }
                }
            }
        }
    }


    /**
     * エレメントが共通して持つ情報を表示する関数です
     * @param element
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getElementInfo(PtlEditElement element)
                        throws PtlException, Exception, Error {
        System.out.println("エレメントのBBoxの情報を表示します。");
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・エレメントが共通して持つ情報を表示する関数】...
    }

    /**
     * Textアイテムが持つ情報を表示する関数です
     * @param textItems そのエレメントが持つTextItemsコンテナクラス
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getTextItemsInfo(PtlEditTextItems textItems)
                        throws PtlException, Exception, Error {
        int numOfTextItems = textItems.getCount();
        System.out.println("このテキストアイテムに含まれるアイテム数は" + numOfTextItems + "です。");
        for(int j = 0; j < numOfTextItems; j++) {
            System.out.println( j + "番目のアイテム情報:");
            System.out.println("---");

            try(PtlEditTextItem item = textItems.get(j);
                PtlRect textItemBBox =item.getBBox();
                PtlFontInfo fontInfo = item.getFontInfo()) {
                System.out.println("テキストアイテムのBBox情報:");
                getRectInfo(textItemBBox, "このテキストアイテムのBBox");

                System.out.println("-");
                System.out.println("テキストアイテムが含むテキスト:");
                System.out.println(item.getText());

                System.out.println("-");
                System.out.println("フォント情報:");
                System.out.println("フォント名:" + fontInfo.getFontName());
                System.out.println("フォントタイプ:" +  fontInfo.getFontType());
                System.out.println("エンコーディングタイプ:" + fontInfo.getEncodingType());
                if(fontInfo.getEncodingType()==PtlFontInfo.ENCODING_TYPE.ENCODING_NAME) {
                    System.out.println("エンコーディング名:" + fontInfo.getEncodingName());
                }
                if(fontInfo.isEmbedded()) {
                    System.out.println("フォント埋め込み:あり");
                }else {
                    System.out.println("フォント埋め込み:なし");
                }

                System.out.println("-");
                System.out.print("ペイントフラグ:");
                int paintFlag = item.getPaintFlags();
                switch(paintFlag) {
                    case PtlEditPath.PAINT_FILL: //パスを塗りつぶす
                        System.out.println("パスを塗りつぶす");
                        System.out.println("塗りつぶしカラー情報を取得します。");
                        getFillColorInfo(item); //塗りつぶしカラー情報を取得するための関数
                        break;

                    case PtlEditPath.PAINT_INVISIBLE: //ストロークも塗りつぶしも行いません。
                        System.out.println("ストロークも塗りつぶしも行わない");
                        break;

                    case PtlEditPath.PAINT_STROKE: //ストロークする
                        System.out.println("ストロークする");
                        System.out.println("ストロークカラー情報を取得します");
                        getStrokeColorInfo(item); //ストロークカラー情報を取得するための関数
                        break;

                    default:
                        System.out.println("不明なフラグが取得されました。");
                        System.out.println("paintFlag = " + paintFlag);
                        break;
                }
                System.out.println("---");
            }
        }
    }



    /**
     * ストロークカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param item PtlEditTextItem テキストアイテムを表現したクラス
     * @throws PtlException 
     * @throws Exception 
     * @throws Error  
     */
    private static void getStrokeColorInfo(PtlEditTextItem item)
                        throws PtlException, Exception, Error {
        System.out.println("-");
        System.out.println("ストロークカラー情報:");

        try(PtlColor strokeColor = item.getStrokeColor()) {
            switch(strokeColor.getType()) {
                case TYPE_DEVICE_CMYK:
                    try(PtlColorDeviceCMYK deviceCMYK = (PtlColorDeviceCMYK)item.getStrokeColor()) {
                        getCMYKInfo(deviceCMYK);
                    }
                    break;

                case TYPE_DEVICE_GRAY:
                    try(PtlColorDeviceGray deviceGray = (PtlColorDeviceGray)item.getStrokeColor()) {
                        getGrayInfo(deviceGray);
                    }
                    break;

                case TYPE_DEVICE_RGB:
                    try(PtlColorDeviceRGB deviceRGB = (PtlColorDeviceRGB)item.getStrokeColor()) {
                        getRGBInfo(deviceRGB);
                    }
                    break;

                default:
                    System.out.println("ストロークカラーは"
                                     + "読み取れるカラースペースタイプではありませんでした。");
                    System.out.println("カラースペースタイプ : " + strokeColor.getCSType());
                    break;
            }
        }
    }

    /**
     * 塗りつぶしカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param item PtlEditTextItem テキストアイテムを表現したクラス
     * @throws PtlException 
     * @throws Exception 
     * @throws Error  
     */
    private static void getFillColorInfo(PtlEditTextItem item)
                        throws PtlException, Exception, Error {
        System.out.println("-");
        System.out.println("塗りつぶしカラー情報:");

        try(PtlColor fillColor = item.getFillColor()) {
            switch(fillColor.getType()) {
                case TYPE_DEVICE_CMYK:
                    try(PtlColorDeviceCMYK deviceCMYK = (PtlColorDeviceCMYK)item.getFillColor()) {
                        getCMYKInfo(deviceCMYK);
                    }
                    break;

                case TYPE_DEVICE_GRAY:
                    try(PtlColorDeviceGray deviceGray = (PtlColorDeviceGray)item.getFillColor()) {
                        getGrayInfo(deviceGray);
                    }
                    break;

                case TYPE_DEVICE_RGB:
                    try(PtlColorDeviceRGB deviceRGB = (PtlColorDeviceRGB)item.getFillColor()) {
                        getRGBInfo(deviceRGB);
                    }
                    break;

                default:
                    System.out.println("塗りつぶしカラーは"
                                     + "読み取れるカラースペースタイプではありませんでした。");
                    System.out.println("カラースペースタイプ : " + fillColor.getCSType());
                    break;
            }
        }
    }

    /**
     * deviceCYMKの各要素の数値を表示する関数です
     * @param cmyk
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getCMYKInfo(PtlColorDeviceCMYK cmyk)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・deviceCYMKの各要素の数値を表示する関数】...
    }

    /**
     * deviceGrayの各要素の数値を表示する関数です
     * @param gray
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getGrayInfo(PtlColorDeviceGray gray)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・deviceGrayの各要素の数値を読み取って表示する関数】...
    }

    /**
     * deviceRGBの各要素の数値を表示する関数です
     * @param rgb
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getRGBInfo(PtlColorDeviceRGB rgb)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・deviceRGBの各要素の数値を読み取って表示する関数】...
    }

    /**
     * PtlRectの各情報を表示する関数です。
     * @param rect
     * @param rectName
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getRectInfo(PtlRect rect, String rectName)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・PtlRectの各要素の数値を読み取って表示する関数】...
    }

}

プログラムファイル名

GetPtlEditTextInfo.java

入出力操作の例

C:\samples>java cookbook.GetPtlEditTextInfo 
usage: java GetPtlEditTextInfo in-pdf-file

C:\samples>java cookbook.GetPtlEditTextInfo colorTextSample.pdf 
-----------------
0ページ目の情報を表示します。
このページに含まれるTEXTエレメントの数は12です。
---0番目のTEXTエレメントの情報を表示します。---
エレメントのBBoxの情報を表示します。
このエレメントのBBoxの[top, bottom, left, right]は、
[261.74854, 245.42415, 30.014334, 99.10241]です。
TEXTエレメント固有の情報を表示します。
テキストアイテムの情報を表示します。
このテキストアイテムに含まれるアイテム数は3です。
0番目のアイテム情報:
---
テキストアイテムのBBox情報:
このテキストアイテムのBBoxの[top, bottom, left, right]は、
[261.74854, 245.42415, 30.014334, 39.878002]です。
-
テキストアイテムが含むテキスト:
赤
-
フォント情報:
フォント名:KFSUJY+YuMincho-Regular
フォントタイプ:FONT_CID_TRUETYPE
エンコーディングタイプ:ENCODING_NAME
エンコーディング名:Identity-H
フォント埋め込み:あり
-
ペイントフラグ:パスを塗りつぶす
塗りつぶしカラー情報を取得します。
-
塗りつぶしカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[1.0, 0.0, 0.0]です。
---
1番目のアイテム情報:
---
テキストアイテムのBBox情報:
このテキストアイテムのBBoxの[top, bottom, left, right]は、
[261.74854, 245.42415, 39.878002, 69.469]です。
-
テキストアイテムが含むテキスト:
カラー
-
フォント情報:
フォント名:KFSUJY+YuMincho-Regular
フォントタイプ:FONT_CID_TRUETYPE
エンコーディングタイプ:ENCODING_NAME
エンコーディング名:Identity-H
フォント埋め込み:あり
-
ペイントフラグ:パスを塗りつぶす
塗りつぶしカラー情報を取得します。
-
塗りつぶしカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[1.0, 0.0, 0.0]です。
---
2番目のアイテム情報:
---
テキストアイテムのBBox情報:
このテキストアイテムのBBoxの[top, bottom, left, right]は、
[261.74854, 245.42415, 69.51141, 99.10241]です。
-
テキストアイテムが含むテキスト:
テスト
-
フォント情報:
フォント名:KFSUJY+YuMincho-Regular
フォントタイプ:FONT_CID_TRUETYPE
エンコーディングタイプ:ENCODING_NAME
エンコーディング名:Identity-H
フォント埋め込み:あり
-
ペイントフラグ:パスを塗りつぶす
塗りつぶしカラー情報を取得します。
-
塗りつぶしカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[1.0, 0.0, 0.0]です。
---
[...省略...]
-- 完了 --

この入力例では色付きのテキスト入りPDFから読み取ったPtlEditTextの情報を表示しています。

5-4-1-2_GetPtlEditTextInfo

図4.2 入力例の色付きのテキスト入りPDF