2.1.3 出力画像形式の指定

2-1-第3項出力画像形式の指定

狙い・効果

出力画像形式を指定します。出力形式は、自動、bitmap、 jpeg、 pngの四つから選択します。

処理の概要

出力形式を指定して2.1.2 指定した画像を抽出と同様にして指定した画像を出力します。出力形式を自動以外で指定をした場合は、コマンドライン引数や内部処理を用いて出力ファイルの拡張子を付与する必要があります。

『PDF Tool API』の主な機能

PtlEditImage.APIwriteFile(PtlParamOutput output, PtlEditImage.OUTPUT_FORMAT format):指定した形式でファイルを書き出す

出力形式は次表の列挙型定数で指定します。

表2・2 PtlEditImage.OUTPUT_FORMAT 出力フォーマットタイプ
列挙型定数説明
FORMAT_AUTO自動
FORMAT_BMPBMP
FORMAT_JPEGJPEG
FORMAT_PNGPNG

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class ExtractImageSetFormat {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java ExtractImageSetFormat in-pdf-file out-image-file" +
                           " page-to-extract 出力フォーマット");
        System.out.println("出力フォーマット\n0 : 自動  1 : BMP  2 : JPEG  3 : PNG");
    }

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

        // コマンドライン引数の取得
        int pageToExtract = Integer.parseInt(args[2]);
        int kind = Integer.parseInt(args[3]);
        switch (kind) {
        case 0:
        case 1:
        case 2:
        case 3:
            break;
        default:
            System.out.println("出力フォーマットは0から3の数値で指定してください。");
            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.out.println("ページコンテナが空");
                    return;
                }

                // それ以外であれば指定ページ番号を検索。
                int wholePageNum = doc.getPageCount();
                //pageToSearchのエラー処理
                if(wholePageNum < pageToExtract) {
                    System.out.println("ERROR: page-to-extractはPDFの総ページ数より"+
                                       "小さい値を指定してください。");
                    System.out.println("総ページ数:" + wholePageNum);
                    printUsage();
                    return;
                }
                // ページの取得(index番号は0が先頭のため1を引く)
                try (PtlPage page = pages.get(pageToExtract - 1)) {
                    // 画像抽出
                    extractImage(page, args[1], kind);
                }
            }
        }

	...【ExtractText.javaと同じ処理のため省略
	 ・エラーメッセージ処理と出力】...

    }

    public static void extractImage(PtlPage page, String imagefilename, int kind)
        throws PtlException, Exception, Error {
        int numImage = 0;
        // ページコンテント・画像エレメントの取得
        try (PtlContent content = page.getContent();
             PtlEditElements elems = content.getEditElements(PtlContent.GET_IMAGE)) {
            int numElems = elems.getCount();
            if (numElems == 0) return; // 画像エレメントが無い場合はreturnする

            PtlEditImage.OUTPUT_FORMAT format = PtlEditImage.OUTPUT_FORMAT.FORMAT_AUTO;
            switch (kind) {
            case 1:
                format = PtlEditImage.OUTPUT_FORMAT.FORMAT_BMP;
                break;
            case 2:
                format = PtlEditImage.OUTPUT_FORMAT.FORMAT_JPEG;
                break;
            case 3:
                format = PtlEditImage.OUTPUT_FORMAT.FORMAT_PNG;
                break;
            }

            for (int i = 0; i < numElems; ++i) {
                // 画像エレメントの取得
                try (PtlEditElement elem = elems.get(i)) {
                    PtlEditElement.ELEMENT_TYPE type = elem.getType();
                    switch (type) {
                    case TYPE_IMAGE: {
                        ++numImage;
                        PtlEditImage elemImage = (PtlEditImage)elem;
                        String pathImage = "";
                        switch (format) {
                        case FORMAT_AUTO:
                            pathImage = String.format("%s%d", imagefilename, numImage);
                            break;
                        case FORMAT_BMP:
                            pathImage = String.format("%s%d.bmp", imagefilename, numImage);
                            break;
                        case FORMAT_JPEG:
                            pathImage = String.format("%s%d.jpg", imagefilename, numImage);
                            break;
                        case FORMAT_PNG:
                            pathImage = String.format("%s%d.png", imagefilename, numImage);
                            break;
                        }
                        try (PtlParamOutput outputImage = new PtlParamOutput(pathImage)) {
                            // 画像出力
                            elemImage.writeFile(outputImage, format);
                        }
                    }
                    break;
                    default:
                        break;
                    }
                }
            }
        }
    }

}

プログラムファイル名

ExtractImageSetFormat.java

入出力操作の例

C:\samples>java cookbook.ExtractImageSetFormat 
usage: java ExtractImageSetFormat in-pdf-file out-image-file page-to-extract 出力フォーマット
出力フォーマット
0 : 自動  1 : BMP  2 : JPEG  3 : PNG

C:\samples>java cookbook.ExtractImageSetFormat colorImg.pdf outImgJpg 1 2 
-- 完了 --

colorImg.pdfの1ページ目の二つの画像を抽出し、二つのJPEG形式のファイルとして保存します。