2.3.1 PDFのページを貼り付け

images/AddPdfOnPage-top.png

狙い・効果

PDFのページを他のPDFのページに貼り付けPDF文書のページを他のPDF文書のページの上に貼り付けます。

処理の概要

貼り付ける先のPDF文書のページを指定し、そのページのどの範囲に貼り付けるかを配置矩形として指定します。貼り付けるPDF文書のページを、配置矩形の中のどこに沿わせて配置するのか指定(配置指定)します。配置指定の方法は表2・1 配置の基準位置を参照してください。

なお、貼り付けるPDF文書の1ページは配置矩形に入るように縮小されます。貼り付けるPDF文書のページが配置矩形よりも小さいときは元のサイズのままとなります。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

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


public class AddPdfOnPage {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 5)
        {
            System.out.println("usage: java AddForm in-pdf-file out-pdf-file page-num insert-pdf-file insert-page-num 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);

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


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

                // フォームの描画処理()
                try (PtlPage page = pages.get(pageToAdd - 1))// ページの取得(パラメータindexは0が先頭のため1を引く)
                {
                    drawForm(page, insertPdfURI, insertPageNum, align, br);
                }
            }


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

    }

    public static void drawForm(PtlPage page, String insertPdfURI, int insertPageNum, String align, BufferedReader br) throws PtlException, Exception, Error{
        try(PtlContent content = page.getContent();// 挿入先ページコンテントの取得
            PtlParamInput insertPdf = new PtlParamInput(insertPdfURI); // 挿入PDF指定に使うパラメータクラス
            PtlPDFDocument doc2 = new PtlPDFDocument(); // 挿入PDFの実体
            PtlRect outputRect = new PtlRect(setOutputRect(br))) // 出力矩形の設定(setOutputRectを用いて初期化)
        {
            doc2.load(insertPdf);
            int numPages = doc2.getPageCount();
            if((numPages < 0)||(numPages < insertPageNum))
            {
                System.err.println("insert-page-numは挿入するPDFの全ページ数よりも小さい正の値を指定してください。");
                System.out.println("挿入PDFページ数:" + numPages);
                return;
            }
            try(PtlPages pages2 = doc2.getPages())
            {
                // ページコンテナが空かどうか
                if (pages2.isEmpty())
                {
                    System.out.println("挿入するPDFのページコンテナが空");
                    return;
                }
                try(PtlPage pageInsert = pages2.get(insertPageNum - 1)) // ページの取得(パラメータindexは0が先頭のため1を引く)
                {
                    // 指定ページの挿入
                    content.drawForm(outputRect, PtlContent.ALIGN.valueOf(align), pageInsert);
                }
                catch (IllegalArgumentException ex){//PtlContent.ALIGNの指定が誤っていた場合のエラーメッセージ
                    System.out.println(ex.getMessage());
                    System.out.println("ERROR : alignにはPtlContent.ALIGNに含まれる名前を指定してください。");
                    ex.printStackTrace();
                }
            }
        }
    }

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

プログラムファイル名

AddPdfOnPage.java

入出力操作の例

C:\samples>java cookbook.AddPdfOnPage 
usage: java AddForm in-pdf-file out-pdf-filepage-num insert-pdf-file insert-page-num align

C:\samples>java cookbook.AddPdfOnPage xsl-fo-base.pdf xsl-fo-combined.pdf 1 xsl-fo-tree-trimmed.pdf 1 ALIGN_CENTER 
ページ数:1
配置矩形の各数値を入力してください。
top (mm) : 180
bottom (mm) : 120
left (mm) : 0
right (mm) : 188
-- 完了 --

イラストファイル(xsl-fo-tree-trimmed.pdf)はPowerPointで作成してPDF形式とし上下をトリムして余白を取り去って作成しました。これをPDF形式のまま図として配置矩形内に貼り込んでいます。PDF形式のイラストでは文字や罫線はベクトルデータで表現されていますので、拡大・縮小により文字や線が滲むことがありません。

images/AddPdfOnPage-example.png

図2・19 2つのPDF文書を合成した例