4.1.1 PtlEditPathの情報を取得

GetPtlEditPathInfo_Top

狙い・効果

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

処理の概要

PtlEditPathでパスオブジェクトが保持しているペイントフラグ、ストロークカラー、塗りつぶしカラー、各パスアイテムの情報(アイテム種別・開始位置・終了位置・ベジェ曲線の場合は制御点の座標)を取得することができます。

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

この2つは色空間のベースクラスPtlColorクラスの形で色情報を得るため、色情報の内容を読み取るためには適切な形にリキャストする必要があります。

そこで、getStrokeColorSpace()及びgetFillColorSpace()で色空間の種類を取得します。色空間に関する詳細は「『PDF CookBook』(第1巻)2.1.3 文字の色指定」及び本書「10.4.1 Separation Colorの対応」を参照してください。

パスで描画されるベジェ曲線・直線・矩形の各座標を表すパスアイテムはPtlEditPathItemの形で取得します。これはPtlEditPathCurve、PtlEditPathLine、PtlEditPathRectのベースクラスであり、内容を読み取るためにはPtlEditPathItemのタイプを取得して適切にリキャストする必要があります。

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

『PDF Tool API』の主な機能

表4.1 PtlColorSpace.COLOR_SPACE_TYPEの種別
列挙型定数
色空間のタイプ
TYPE_CALGRAY
CalGray
TYPE_CALRGB
CalRGB
TYPE_DEVICECMYK
DeviceCMYK
TYPE_DEVICEGRAY
DeviceGray
TYPE_DEVICEN
DeviceN
TYPE_DEVICERGB
DeviceRGB
TYPE_ICCBASED
ICCBased
TYPE_LAB
Lab
TYPE_NONE
カラースペースがない
TYPE_PATTERN
Pattern
TYPE_SEPARATION
Separation
TYPE_UNKNOWN
未対応のカラースペース
TYPE_PATH_RECT
矩形
表4.2 ペイントフラグの種別
列挙型定数
ペイントフラグ
PAINT_EOFILL
奇偶規則に基づいてパスを塗りつぶす
PAINT_FILL
非ゼロ回転規則に基づいてパスを塗りつぶす
PAINT_INVISIBLE
ストロークも塗りつぶしも行わない
PAINT_STROKE
ストロークする
表4.3 PtlEditPathItem.PATH_ITEM_TYPEの種別
列挙型定数
Pathアイテムのタイプ
TYPE_PATH_CURVE
3次ベジェ曲線
TYPE_PATH_LINE 
線分
TYPE_PATH_RECT
矩形

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;


public class GetPtlEditPathInfo {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java GetPtlEditPathInfo 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)){
                        getPathInfo(page);
                    }
                    System.out.println("-----------------");
                }
            }
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }

    private static void getPathInfo(PtlPage page)
                        throws PtlException, Exception, Error {
        try(PtlContent content = page.getContent();// 挿入先ページコンテントの取得
            PtlEditElements elems = content.getEditElements(PtlContent.GET_PATH)) {

            int numOfElements = elems.getCount();
            System.out.println("このページに含まれるPATHエレメントの数は" + numOfElements + "です。");

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

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

                    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);
                }
            }
        }
    }


    /**
     * エレメントが共通して持つ情報を表示する関数です
     * @param element
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getElementInfo(PtlEditElement element)
                        throws PtlException, Exception, Error {
        System.out.println("エレメントのBBoxの情報を表示します。");
        //BBoxの情報を印字
        try(PtlRect bBox = element.getBBox()) {
            getRectInfo(bBox, "このエレメントのBBox");
        }

        //ClippedBoxの情報を印字
        if(element.hasClip()){
            try(PtlRect clippedBox = element.getClippedBBox()) {
                System.out.println("このエレメントにはクリッピングがあります。");
                getRectInfo(clippedBox, "このエレメントのClippedBox");
            }
        }
    }

    /**
     * ストロークカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param pathElement パスエレメントを表現したクラス
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getStrokeColorInfo(PtlEditPath pathElement)
                        throws PtlException, Exception, Error {
        System.out.println("-");
        System.out.println("ストロークカラー情報:");
        try(PtlColorSpace strokeColorSpace = pathElement.getStrokeColorSpace();
            PtlColor strokeColor = pathElement.getStrokeColor()){

            PtlColorSpace.COLOR_SPACE_TYPE colorSpaceType =strokeColorSpace.getType();
            switch(colorSpaceType){
            case TYPE_DEVICECMYK:
                try(PtlColorDeviceCMYK deviceCMYK = (PtlColorDeviceCMYK)strokeColor) {
                    getCMYKInfo(deviceCMYK);
                }
                break;

            case TYPE_DEVICEGRAY:
                try(PtlColorDeviceGray deviceGray = (PtlColorDeviceGray)strokeColor) {
                    getGrayInfo(deviceGray);
                }
                break;

            case TYPE_DEVICERGB:
                try(PtlColorDeviceRGB deviceRGB = (PtlColorDeviceRGB)strokeColor) {
                    getRGBInfo(deviceRGB);
                }
                break;

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

    }

    /**
     * 塗りつぶしカラー情報を取得するための関数。
     * デバイスカラー情報に応じて色情報を取り出すための関数を呼び出す
     * @param pathElement パスエレメントを表現したクラス
     * @throws PtlException 
     * @throws Exception 
     * @throws Error  
     */
    private static void getFillColorInfo(PtlEditPath pathElement)
                        throws PtlException, Exception, Error {
        System.out.println("-");
        System.out.println("塗りつぶしカラー情報:");
        try(PtlColorSpace fillColorSpace = pathElement.getStrokeColorSpace();
            PtlColor fillColor = pathElement.getStrokeColor()){

            PtlColorSpace.COLOR_SPACE_TYPE colorSpaceType =fillColorSpace.getType();
            switch(colorSpaceType) {
            case TYPE_DEVICECMYK:
                try(PtlColorDeviceCMYK deviceCMYK = (PtlColorDeviceCMYK)fillColor) {
                    getCMYKInfo(deviceCMYK);
                }
                break;

            case TYPE_DEVICEGRAY:
                try(PtlColorDeviceGray deviceGray = (PtlColorDeviceGray)fillColor) {
                    getGrayInfo(deviceGray);
                }
                break;

            case TYPE_DEVICERGB:
                try(PtlColorDeviceRGB deviceRGB = (PtlColorDeviceRGB)fillColor) {
                    getRGBInfo(deviceRGB);
                }
                break;

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

    }

    /**
     * deviceCYMKの各要素の数値を表示する関数です
     * @param cmyk
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getCMYKInfo(PtlColorDeviceCMYK cmyk)
                        throws PtlException, Exception, Error {
        float paramC = cmyk.getC();
        float paramM = cmyk.getM();
        float paramY = cmyk.getY();
        float paramK = cmyk.getK();

        System.out.println("DeviceCMYK色の要素[C, M, Y, K]の値は、");
        System.out.println("[" + paramC + ", " + paramM + ", " +
                                 paramY + ", " + paramK + "]です。");
    }

    /**
     * deviceGrayの各要素の数値を表示する関数です
     * @param gray
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getGrayInfo(PtlColorDeviceGray gray)
                        throws PtlException, Exception, Error {
        float paramGray = gray.getGray();

        System.out.println("DeviceGray色のGray要素の値は、");
        System.out.println("[" + paramGray + "]です。");
    }

    /**
     * deviceRGBの各要素の数値を表示する関数です
     * @param rgb
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getRGBInfo(PtlColorDeviceRGB rgb)
                        throws PtlException, Exception, Error {
        float paramR = rgb.getR();
        float paramG = rgb.getG();
        float paramB = rgb.getB();

        System.out.println("DeviceRGB色の[R, G, B]の要素の値は、");
        System.out.println("[" + paramR + ", " + paramG +", " + 
                                 paramB + "]です。");
    }

    private static void getPathItemsInfo(PtlEditPathItems pathItems)
                        throws PtlException, Exception, Error {
        System.out.println("-");
        System.out.println("パスアイテムの情報を表示します。");
        for(int j = 0; j < pathItems.getCount(); j++) {
            try(PtlEditPathItem item = pathItems.get(j)) {
                PtlEditPathItem.PATH_ITEM_TYPE itemType = item.getType();

                System.out.println( j + "番目のアイテム情報:");
                System.out.println("---");
                switch(itemType) {
                    case TYPE_PATH_CURVE:
                        System.out.println("アイテム種別:ベジェ曲線");
                        try(PtlEditPathCurve pathCurve = (PtlEditPathCurve)item) {
                            getPathCurveInfo(pathCurve);
                        }
                        break;

                    case TYPE_PATH_LINE:
                        System.out.println("アイテム種別:直線");
                        try(PtlEditPathLine pathLine = (PtlEditPathLine)item) {
                            getPathLineInfo(pathLine);
                        }
                        break;

                    case TYPE_PATH_RECT:
                        System.out.println("アイテム種別:矩形");
                        try(PtlEditPathRect pathRect = (PtlEditPathRect)item;
                            PtlRect rectOfPath = pathRect.getRect()) {
                            getRectInfo(rectOfPath, "このパスアイテムの矩形");
                        }
                        break;
                }
                System.out.println("---");
            }
        }
    }

    private static void getPathCurveInfo(PtlEditPathCurve pathCurve)
                        throws PtlException, Exception, Error {
        try(PtlPoint startPoint    = pathCurve.getStartPoint();
            PtlPoint endPoint      = pathCurve.getEndPoint();
            PtlPoint controlPoint1 = pathCurve.getControlPoint1();
            PtlPoint controlPoint2 = pathCurve.getControlPoint2()) {
            System.out.print("開始位置[x, y]: ");
            System.out.println("[" + startPoint.getX() + ", " + startPoint.getY() + "]");
            System.out.print("終了位置[x, y]: ");
            System.out.println("[" + endPoint.getX() + ", " + endPoint.getY() + "]");
            System.out.print("第一の制御点[x, y]: ");
            System.out.println("[" + controlPoint1.getX() + ", " + controlPoint1.getY() + "]");
            System.out.print("第二の制御点[x, y]: ");
            System.out.println("[" + controlPoint2.getX() + ", " + controlPoint2.getY() + "]");
        }
    }

    private static void getPathLineInfo(PtlEditPathLine pathLine)
                        throws PtlException, Exception, Error {
        try(PtlPoint startPoint = pathLine.getStartPoint();
            PtlPoint endPoint   = pathLine.getEndPoint()) {
            System.out.print("開始位置[x, y]: ");
            System.out.println("[" + startPoint.getX() + ", " + startPoint.getY() + "]");
            System.out.print("終了位置[x, y]: ");
            System.out.println("[" + endPoint.getX() + ", " + endPoint.getY() + "]");
        }
    }

    /**
     * PtlRectの各情報を表示する関数です。
     * @param rect
     * @param rectName
     * @throws PtlException
     * @throws Exception
     * @throws Error 
     */
    private static void getRectInfo(PtlRect rect, String rectName)
                        throws PtlException, Exception, Error {
        float top = rect.getTop();
        float bottom = rect.getBottom();
        float left = rect.getLeft();
        float right = rect.getRight();
        System.out.println(rectName + "の[top, bottom, left, right]は、");
        System.out.println("[" + top +", " + bottom +", " + left +", " + right +"]です。"); 
    }

}

プログラムファイル名

GetPtlEditPathInfo.java

入出力操作の例

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

C:\samples>java cookbook.GetPtlEditPathInfo overlapElements.pdf 
-----------------
0ページ目の情報を表示します。
このページに含まれるPATHエレメントの数は4です。
---0番目のPATHエレメントの情報を表示します。---
エレメントのBBoxの情報を表示します。
このエレメントのBBoxの[top, bottom, left, right]は、
[223.28717, 137.97617, 51.974747, 115.537]です。
PATHエレメント固有の情報を表示します。
このPATHエレメントのペイントフラグ情報を表示します。
-
ペイントフラグ:不明なフラグが取得されました。
paintFlag = 3
-
ストロークカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[1.0, 0.0, 0.0]です。
-
塗りつぶしカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[1.0, 0.0, 0.0]です。
-
パスアイテムの情報を表示します。
0番目のアイテム情報:
---
アイテム種別:矩形
このパスアイテムの矩形の[top, bottom, left, right]は、
[222.758, 138.50533, 52.503918, 115.00784]です。
---
---1番目のPATHエレメントの情報を表示します。---
エレメントのBBoxの情報を表示します。
このエレメントのBBoxの[top, bottom, left, right]は、
[158.99971, 105.79774, 105.06894, 157.44879]です。
このエレメントにはクリッピングがあります。
このエレメントのClippedBoxの[top, bottom, left, right]は、
[158.59793, 105.90885, 105.06894, 157.44879]です。
PATHエレメント固有の情報を表示します。
このPATHエレメントのペイントフラグ情報を表示します。
-
ペイントフラグ:ストロークする
-
ストロークカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[0.0, 0.4392157, 0.7529412]です。
-
塗りつぶしカラー情報:
DeviceRGB色の[R, G, B]の要素の値は、
[0.0, 0.4392157, 0.7529412]です。
-
パスアイテムの情報を表示します。
0番目のアイテム情報:
---
アイテム種別:ベジェ曲線
開始位置[x, y]: [106.11879, 149.56952]
終了位置[x, y]: [114.499306, 157.94986]
第一の制御点[x, y]: [106.11879, 154.19852]
第二の制御点[x, y]: [109.870865, 157.94986]
---
1番目のアイテム情報:
---
アイテム種別:直線
開始位置[x, y]: [114.499306, 157.94986]
終了位置[x, y]: [148.02045, 157.94986]
---
2番目のアイテム情報:
---
アイテム種別:ベジェ曲線
開始位置[x, y]: [148.02045, 157.94986]
終了位置[x, y]: [156.40079, 149.56952]
第一の制御点[x, y]: [152.64944, 157.94986]
第二の制御点[x, y]: [156.40079, 154.19852]
---

[...省略...]
-----------------
-- 完了 --

操作例ではパスが描かれたPDFから読み取れるPtlEditPathの情報を取得しています。

5-4-1-1_GetPtlEditPathInfo

図4.1 入力例のパスが含まれたPDF