2.2.5 最適化を行う画像の対象とするフィルターの指定

2-2-第5項最適化を行う画像の対象とするFilterを設定

狙い・効果

最適化の対象フィルター最適化を行う画像の対象とするフィルターを指定します。

処理の概要

PDFの内部で画像はフィルター処理された上で保管されています。最適化する画像の対象とするフィルターのそれぞれについて対象にする、しないを指定して2.2.1 カラー画像最適化オプションの取得・指定と同様にして最適化します。

PDF Tool APIの主な機能

PtlParamOptimizeImage.APIsetValidFilter(int validFilter): 最適化を行う画像の対象とするFilterを設定

validFilterは次表のint型定数の論理和で指定します。

表2・10 最適化対象フィルター
定数フィールド説明
PtlParamOptimizeImage.FILTER_NONEフィルターなし
PtlParamOptimizeImage.FILTER_ASCII85DecodeASCII85Decode
PtlParamOptimizeImage.FILTER_ASCIIHexDecodeASCIIHexDecode
PtlParamOptimizeImage.FILTER_CCITTFaxDecodeCCITTFaxDecode
PtlParamOptimizeImage.FILTER_DCTDecodeDCTDecode
PtlParamOptimizeImage.FILTER_FlateDecodeFlateDecode
PtlParamOptimizeImage.FILTER_JBIG2DecodeJBIG2Decode
PtlParamOptimizeImage.FILTER_JPXDecodeJPXDecode
PtlParamOptimizeImage.FILTER_LZWDecodeLZWDecode
PtlParamOptimizeImage.FILTER_RunLengthDecodeRunLengthDecode
PtlParamOptimizeImage.FILTER_ALL上記全フィルター

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class OptimizeImageSetValidFilter {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java OptimizeImageSetValidFilter in-pdf-file" +
                           " out-pdf-file");
        System.out.println("ASCII85Decode ASCIIHexDecode CCITTFaxDecode DCTDecode");
        System.out.println("FlateDecode JBIG2Decode JPXDecode LZWDecode RunLengthDecode");
        System.out.println("各フィルター 0と1でそれぞれの有効を切替え:");
        System.out.println("0:有効にしない 1:有効にする");
    }

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

        // コマンドライン引数の取得
        boolean[] validFilter = new boolean[9];
        try{
            for(int i = 0; i < 9; i++){
                validFilter[i] =
                    readBoolArgs(args[i + 2], "各フィルターの数値 は 0か1で指定してください。");
            }
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }

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

            // 画像の最適化を行います。
            optimizeDocSetValidFilter(doc, validFilter);

            // ファイルに保存します。
            doc.save(outputFile);
        }
        catch (PtlException pex) {
            System.out.println("PtlException : ErrorCode = " + pex.getErrorCode() +
                               "\n  " + pex.getErrorMessage());
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        catch (Error ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        finally {
            System.out.println("-- 完了 --");
        }
    }

    public static void optimizeDocSetValidFilter(PtlPDFDocument doc,
                                                 boolean[] validFilter)
        throws PtlException{
        try(PtlParamOptimize paramOptimize = new PtlParamOptimize();
            // 画像最適化パラメーターの取得
            // カラー画像最適化パラメーターの取得
            PtlParamOptimizeImage paramOptimizeImage =
            paramOptimize.getParamOptimizeImage();
            PtlParamOptimizeImageColor paramOptimizeImageColor =
            paramOptimizeImage.getParamOptimizeImageColor()) {

            // 最適化する画像の対象Filterを設定
            // それぞれの論理和でON・OFFを指定する。
            int filterFlag = PtlParamOptimizeImage.FILTER_NONE;

            if(validFilter[0]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_ASCII85Decode;
            }
            if(validFilter[1]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_ASCIIHexDecode;
            }
            if(validFilter[2]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_CCITTFaxDecode;
            }
            if(validFilter[3]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_DCTDecode;
            }
            if(validFilter[4]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_FlateDecode;
            }
            if(validFilter[5]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_JBIG2Decode;
            }
            if(validFilter[6]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_JPXDecode;
            }
            if(validFilter[7]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_LZWDecode;
            }
            if(validFilter[8]){
                filterFlag = filterFlag | PtlParamOptimizeImage.FILTER_RunLengthDecode;
            }
            paramOptimizeImage.setValidFilter(filterFlag);


            // 画像のダウンサンプリングを行う最低サンプル数を設定
            paramOptimizeImage.setMinSampleSize(110);

            // その他のダウンサンプリングの値を設定
            paramOptimizeImageColor.setSourcePPI(150);
            paramOptimizeImageColor.setTargetPPI(75);
            paramOptimizeImageColor.setDownSampling(PtlParamOptimizeImageDownSampling.DOWNSAMPLING_TYPE.DOWNSAMPLING_BICUBIC);
            paramOptimizeImageColor.setMinDownSamplingRate(0.65f);
            paramOptimizeImageColor.setCompress(PtlParamOptimizeImageColor.COMPRESS_TYPE.COMPRESS_AUTO);
                paramOptimizeImageColor.setQuality(PtlParamOptimizeImageColor.QUALITY_TYPE.QUALITY_MIDDLE);

            // 最適化の実行
            doc.optimize(paramOptimize);
        }
    }
    /**
     * 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 {

	...【ExtractTextSetRect.javaと同じ処理のため省略】...

    }
}

プログラムファイル名

OptimizeImageSetValidFilter.java

入出力操作の例

C:\sample>java cookbook.OptimizeImageSetValidFilter 
usage: java OptimizeImageSetValidFilter in-pdf-file out-pdf-file
ASCII85Decode ASCIIHexDecode CCITTFaxDecode DCTDecode
FlateDecode JBIG2Decode JPXDecode LZWDecode RunLengthDecode
各フィルター 0と1でそれぞれの有効を切替え:
0:有効にしない 1:有効にする

C:\sample>java cookbook.OptimizeImageSetValidFilter colorImg.pdf optimizeImageColor.pdf 0 0 0 0 0 1 1 0 1 
-- 完了 --

ここではJBIG2Decode、JPXDecode、RunLengthDecodeを有効にしています。