2.2.1 ページ上に画像を描画

images/AddImage-top.png

狙い・効果

PDF文書の指定ページに画像を追加ページ上の指定した矩形内に画像を描画します。対応画像形式は、BMP/JPEG/PNG/GIF/TIFF/マルチTIFFです。

処理の概要

PDF文書のページ上の矩形内に、指定した画像を描画(追記)します。

配置矩形内での画像の配置を指定します。配置指定の方法は表2・1 配置の基準位置を参照してください。

追記する画像の大きさが配置矩形より大きい場合は配置矩形のサイズに縮小されます。

画像が配置矩形より小さい場合は縮小されずに、配置指定に従って位置を揃えます。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import java.io.*;
import jp.co.antenna.ptl.*;

public class AddImage {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 5)
        {
            System.out.println("usage: java AddImage in-pdf-file out-pdf-file insert-image-file page-num image-align");
            return;
        }

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

            //コマンドライン引数の取得
            String imageURI = args[2];
            int pageToAdd = Integer.parseInt(args[3]);
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);
            if((numPages < 0)||(numPages < pageToAdd))
            {
                System.err.println("挿入したいページは全ページ数よりも小さい正の値を指定してください。");
                return;
            }
            String imageAlign = args[4];


        ...【RemovePages.javaと同じ処理のため省略
             ・doc.getPages()メソッドを用いてPtlPages pagesにページコンテナを取得
             ・ページコンテナが空だった場合にエラーを出力して終了】...


                try (PtlPage page = pages.get(pageToAdd - 1);// ページの取得(パラメータindexは0が先頭のため1を引く)
                     PtlContent content = page.getContent();// ページコンテントの取得
                     PtlRect outputRect = setOutputRect(br);// 出力矩形の設定(setOutputRectを用いて初期化)
                     PtlParamDrawImage paramDrawImage = new PtlParamDrawImage(); //画像の描画に使うパラメータクラス
                     PtlParamInput insertImage = new PtlParamInput(imageURI)) //画像指定に使うパラメータクラス
                {
                    //入力画像ストリームの設定
                    paramDrawImage.setImageStream(insertImage);
                    //マルチTiffのページ番号の設定(マルチTiffファイルにのみ有効) 
                    //数値を設定しない場合は、-1が設定されたとみなします
                    //PtlParamImagePageに設定する場合に限り、-1を設定すると全ページを挿入します。
                    paramDrawImage.setImagePageNumber(0);

                    // 画像出力
                    content.drawImage(outputRect, PtlContent.ALIGN.valueOf(imageAlign), paramDrawImage);
                }
                catch (IllegalArgumentException ex){//PtlContent.ALIGNの指定が誤っていた場合のエラーメッセージ
                    System.out.println(ex.getMessage());
                    System.out.println("ERROR : alignにはPtlContent.ALIGNに含まれる名前を指定してください。");
                    ex.printStackTrace();
                }
            }


        ...【AppendPages.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...

    }

    public static PtlRect setOutputRect(BufferedReader br) throws IOException, PtlException, Exception, Error{
        float top, bottom, left, right;
        boolean isValueOkay = false;
        PtlRect outputRect = new PtlRect();
        while(!isValueOkay)
        {
            System.out.println("画像の配置矩形の各数値を入力してください。");
            System.out.print("top (mm) : ");
            top = Float.parseFloat(br.readLine());
            System.out.print("bottom (mm) : ");
            bottom = Float.parseFloat(br.readLine());
            if(top < bottom) //不正矩形は再入力させる
            {
                System.out.println("topの値はbottomよりも大きい値を指定して再度入力してください。");
                continue;
            }
            System.out.print("left (mm) : ");
            left = Float.parseFloat(br.readLine());
            System.out.print("right (mm) : ");
            right = Float.parseFloat(br.readLine());
            if(right < left) //不正矩形は再入力させる
            {
                System.out.println("rightの値はleftよりも大きい値を指定して再度入力してください。");
                continue;
            }

            //矩形を正しく指定できた場合の処理
            isValueOkay = true;
            outputRect.setLeft(left);
            outputRect.setBottom(bottom);
            outputRect.setRight(right);
            outputRect.setTop(top);
        }                   
            return outputRect;
    }
}

プログラムファイル名

AddImage.java

入出力操作の例

C:\samples>java cookbook.AddImage 
usage: java AddImage in-pdf-file out-pdf-file insert-image-file page-num image-align

C:\samples>java cookbook.AddImage blankPage.pdf addimage-top.pdf ahlogo.jpg 1 ALIGN_TOP 
ページ数:1
指定する矩形の各数値を入力してください。
top (mm) : 140
bottom (mm) : 50
left (mm) : 100
right (mm) : 240
-- 完了 --


C:\samples>java cookbook.AddImage blankPage.pdf addimage-bottom.pdf ahlogo.jpg 1 ALIGN_BOTTOM 
ページ数:1
指定する矩形の各数値を入力してください。
top (mm) : 140
bottom (mm) : 50
left (mm) : 100
right (mm) : 240
-- 完了 --

追加する画像(JpegImage.jpg)は、サイズが幅2038px×高さ2517pxで解像度が96dpiに設定されています。画像のサイズをmm単位に換算しますと幅539mm×高さ666mmとなります。配置矩形は幅140mm×高さ90mmです。そこで画像が高さ方向に約0.135倍に縮小して配置されます。幅方向には空きができますので、配置指定に従って、最初の例は左、次は右に配置されます。

images/AddImage-example.png

図2・9 画像の追加(配置矩形の上と下に配置)