
PDFのページに割り付けたページに含まれるエレメントForm XObjectの情報を表示します。
複数ページを1ページに割り付けられたPDFの各小ページに含まれるエレメントの内容を読み取り、表示します。
これはForm XObjectの情報を読み取ることで実現します。具体的にはForm XObjectが持つコンテントストリームを取得し、そこからForm XObjectが保持している個々のエレメントが持つパスオブジェクトやテキストオブジェクトの情報を得ます。
サンプルプログラムでは、入力PDFに含まれるForm XObjectが持つパスオブジェクト・テキストオブジェクトの双方についての情報を表示します。このとき、Form XObject の中にさらにForm XObjectがある入れ子構造だった場合は回帰的に情報を取得して表示します。
package cookbook;
import jp.co.antenna.ptl.*;
public class GetPtlEditFormXObjectInfo {
    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java GetPtlEditFormXObjectInfo 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)) {
                        getFormXObjectInfoInPage(page);
                    }
                    System.out.println("-----------------");
                }
            }
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }
    private static void getFormXObjectInfoInPage(PtlPage page)
                        throws PtlException, Exception, Error {
        try(PtlContent content = page.getContent();// 挿入先ページコンテントの取得
            PtlEditElements elems = content.getEditElements()) {
            int numOfElements = elems.getCount();
            System.out.println("このページに含まれるエレメントの数は" + numOfElements + "です。");
            for(int i = 0; i < numOfElements; i++) {
                try(PtlEditElement element = elems.get(i)) {
                    if(element.getType() == PtlEditElement.ELEMENT_TYPE.TYPE_FORMXOBJECT) {
                        System.out.println("このページの" + i 
                                            + " 番目のエレメントがForm XObjectでした。内容を確認します。");
                        try(PtlEditFormXObject formXObject = (PtlEditFormXObject)element;
                            PtlContent contentInXObject = formXObject.getContent();// FormXObjectに含まれる
                            PtlEditElements elementsInXObject = contentInXObject.getEditElements()) {                        
                            getFormXObjectInfo(elementsInXObject);
                        }
                    }
                }
            }
        }
    }
    private static void getFormXObjectInfo(PtlEditElements elems)
                        throws PtlException, Exception, Error {
        int numOfElements = elems.getCount();
        System.out.println("このFormXObjectに含まれるエレメントの数は" + numOfElements + "です。");
        for(int i = 0; i < numOfElements; i++) {
            System.out.println("---このFormXObjectの" + i + "番目のエレメントの内容を確認します。---");
            try(PtlEditElement element = elems.get(i)) {
                //エレメントに共通の情報(BBox, ClippedBox)の情報を表示
                getElementInfo(element);
                switch(element.getType()) {
                    case TYPE_FORMXOBJECT:
                        System.out.println("このエレメントは入れ子になったForm XObjectでした。内容を確認します。");
                        try(PtlEditFormXObject formXObject = (PtlEditFormXObject)element;
                            PtlContent contentInXObject = formXObject.getContent();// FormXObjectに含まれるContentを取得
                            PtlEditElements elementsInXObject = contentInXObject.getEditElements()) {
                            System.out.println("--"); 
                            getFormXObjectInfo(elementsInXObject);
                        }
                        break;
                    case TYPE_TEXT:
                        getEditTextInfo(element);
                        break;
                    case TYPE_PATH:
                        getEditPathInfo(element);
                        break;
                    case TYPE_IMAGE:
                        getEditImageInfo(element);
                        break;
                }
            }
        }
    }
    private static void getElementInfo(PtlEditElement element)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・エレメントが共通して持つ情報を表示する関数】...
    }    
    private static void getEditPathInfo(PtlEditElement element)
                        throws PtlException, Exception, Error {
        try(PtlEditPath pathElement = (PtlEditPath)element;
            PtlEditPathItems pathItems = pathElement.getPathItems()) {
            System.out.println("PATHエレメント固有の情報を表示します。");
            System.out.println("このPATHエレメントのペイントフラグ情報を表示します。");
            System.out.println("-");
            System.out.print("ペイントフラグ:");
            int paintFlag = pathElement.getPaintFlags();
            switch(paintFlag) {
                case PtlEditPath.PAINT_EOFILL: //パスを塗りつぶします。奇偶規則。
                    System.out.println("奇偶規則に基づいてパスを塗りつぶす");
                    break;
                case PtlEditPath.PAINT_FILL: //パスを塗りつぶします。非ゼロ回転規則。
                    System.out.println("非ゼロ回転規則に基づいてパスを塗りつぶす");
                    break;
                case PtlEditPath.PAINT_INVISIBLE: //ストロークも塗りつぶしも行いません。
                    System.out.println("ストロークも塗りつぶしも行わない");
                    break;
                case PtlEditPath.PAINT_STROKE: //ストロークします。
                    System.out.println("ストロークする");
                    break;
                default:
                    System.out.println("不明なフラグが取得されました。");
                    System.out.println("paintFlag = " + paintFlag);
                    break;
            }
            //ストロークカラー情報の取得
            getStrokeColorInfo(pathElement);
            //塗りつぶしカラー情報の取得
            getFillColorInfo(pathElement);
            //パスアイテムの情報取得
            getPathItemsInfo(pathItems);                    
        }
    }
    private static void getPathItemsInfo(PtlEditPathItems pathItems)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・PtlEditPathItemsが持つ情報を表示する関数】...
    }
    private static void getPathCurveInfo(PtlEditPathCurve pathCurve)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・PtlEditPathCurveの各要素の数値を読み取って表示する関数】...
    }
    private static void getPathLineInfo(PtlEditPathLine pathLine)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・PtlEditPathLineの各要素の数値を読み取って表示する関数】...
    }
    /**
     * 読み込まれたページに含まれるTEXTエレメントが持つ情報を表示する関数です。
     * @param page 読み込まれたページ
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getEditTextInfo(PtlEditElement element)
                        throws PtlException, Exception, Error {
        try(PtlEditText textElement = (PtlEditText)element;
            PtlEditTextItems textItems = textElement.getTextItems()) {
            System.out.println("TEXTエレメント固有の情報を表示します。");
            System.out.println("テキストアイテムの情報を表示します。");
            getTextItemsInfo(textItems);
        }
    }
    /**
     * Textアイテムが持つ情報を表示する関数です
     * @param textItems そのエレメントが持つTextItemsコンテナクラス
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getTextItemsInfo(PtlEditTextItems textItems)
                        throws PtlException, Exception, Error {
	...【GetPtlEditTextInfo.javaと同じ処理のため省略
	   ・PtlEditTextItemsが持つ情報を表示する関数】...
    }
    public static void getEditImageInfo(PtlEditElement element)
        throws PtlException, Exception, Error {
        // ページコンテント・画像エレメントの取得
        // OUTPUT_FORMATはFORMAT_AUTOで設定。
        // 画像エレメントの取得
        try(PtlEditImage elemImage = (PtlEditImage)element) {
            System.out.println("画像の高さ:" + elemImage.getHeight());
            System.out.println("画像の幅 :" + elemImage.getWidth());
            System.out.println("画像のPPI :" + elemImage.getPPI());
        }
    }
    /**
     * ストロークカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param pathElement パスエレメントを表現したクラス
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getStrokeColorInfo(PtlEditPath pathElement)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・PtlEditPathが持つストロークカラー情報を表示する関数】...
    }
    /**
     * ストロークカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param item PtlEditTextItem テキストアイテムを表現したクラス
     * @throws PtlException 
     * @throws Exception 
     * @throws Error  
     */
    private static void getStrokeColorInfo(PtlEditTextItem item)
                        throws PtlException, Exception, Error {
	...【GetPtlEditTextInfo.javaと同じ処理のため省略
	   ・PtlEditTextItemが持つストロークカラー情報を表示する関数】...
    }
    /**
     * 塗りつぶしカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param pathElement パスエレメントを表現したクラス
     * @throws PtlException 
     * @throws Exception 
     * @throws Error  
     */
    private static void getFillColorInfo(PtlEditPath pathElement)
                        throws PtlException, Exception, Error {
	...【GetPtlEditPathInfo.javaと同じ処理のため省略
	   ・PtlEditPathが持つ塗りつぶしカラー情報を表示する関数】...
    }
    /**
     * 塗りつぶしカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param item PtlEditTextItem テキストアイテムを表現したクラス
     * @throws PtlException 
     * @throws Exception 
     * @throws Error  
     */
    private static void getFillColorInfo(PtlEditTextItem item)
                        throws PtlException, Exception, Error {
	...【GetPtlEditTextInfo.javaと同じ処理のため省略
	   ・PtlEditTextItemが持つ塗りつぶしカラー情報を表示する関数】...
    }    
    /**
     * 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の各要素の数値を読み取って表示する関数】...
    }
}
GetPtlEditFormXObjectInfo.java
C:\samples>java cookbook.GetPtlEditFormXObjectInfo Sample_allocatedPages.pdf ----------------- 0ページ目の情報を表示します。 このページに含まれるエレメントの数は4です。 このページの0 番目のエレメントがForm XObjectでした。内容を確認します。 このFormXObjectに含まれるエレメントの数は1です。 ---このFormXObjectの0番目のエレメントの内容を確認します。--- エレメントのBBoxの情報を表示します。 このエレメントのBBoxの[top, bottom, left, right]は、 [275.62698, 165.45729, 15.005866, 90.47946]です。 TEXTエレメント固有の情報を表示します。 テキストアイテムの情報を表示します。 このテキストアイテムに含まれるアイテム数は485です。 0番目のアイテム情報: --- テキストアイテムのBBox情報: このテキストアイテムのBBoxの[top, bottom, left, right]は、 [275.62698, 272.80075, 32.744152, 44.00398]です。 - テキストアイテムが含むテキスト: おおかみ - フォント情報: フォント名:LIDMEP+HGSMinchoE フォントタイプ:FONT_CID_TRUETYPE エンコーディングタイプ:ENCODING_NAME エンコーディング名:Identity-H フォント埋め込み:あり - ペイントフラグ:パスを塗りつぶす 塗りつぶしカラー情報を取得します。 - 塗りつぶしカラー情報: DeviceRGB色の[R, G, B]の要素の値は、 [0.0, 0.0, 0.0]です。 --- 1番目のアイテム情報: --- テキストアイテムのBBox情報: このテキストアイテムのBBoxの[top, bottom, left, right]は、 [275.62698, 272.80075, 44.02368, 52.468555]です。 - [...省略...] -- 完了 --