2.3.4 QRコード(PDF)を配置

images/AddPdfQRcodeOnAllPage-top.png

狙い・効果

PDF文書の指定位置に、予めPDF文書として用意したPDFのQRコード画像を貼り付けQRコードを貼り付けます。

処理の概要

QRコード画像をPDF文書(QRコードPDF文書)として用意します

他のPDF文書(貼り付け先PDF文書)の指定ページに、QRコード画像を貼り付ける矩形の大きさ(配置矩形)を指定します。

QRコードPDF文書を配置矩形の大きさに合うように拡大縮小して貼り付けます。こうして挿入されたQRコードは拡大・縮小でにじむことがありません。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

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


public class AddPdfQRcodeOnAllPage {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 3) {
            System.out.println("usage: java AddPdfQRcodeOnAllPage in-pdf-file out-pdf-file insert-QRcode-pdf");
            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 insertPdfURI = args[2];
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);

            try (PtlPages pages = doc.getPages();
                 PtlRect outputRect = new PtlRect()) {
                // ページコンテナが空かどうか
                if (pages.isEmpty()) {
                    System.err.println("入力PDFのページコンテナが空");
                    return;
                }
                setQROutputRect(br, outputRect); // 出力矩形の設定(setQROutputRect()を用いる)
                for(int i = 0; i < numPages; i++) {
                    try (PtlPage page = pages.get(i)) { // ページの取得
                        // フォームの描画処理
                        drawQRcode(page, insertPdfURI, outputRect);
                    }
                }
            }


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

    }

    public static void drawQRcode (PtlPage page, String insertPdfURI, PtlRect outputRect)
        throws PtlException, Exception, Error {
        try(PtlContent content = page.getContent();// 挿入先ページコンテントの取得
            PtlParamInput insertPdf = new PtlParamInput(insertPdfURI); // 挿入PDF指定に使うパラメータクラス
            PtlPDFDocument doc2 = new PtlPDFDocument()) { // 挿入PDFの実体
            doc2.load(insertPdf);
            try(PtlPages pages2 = doc2.getPages()) {
                // ページコンテナが空かどうか
                if (pages2.isEmpty()) {
                    System.out.println("挿入するPDFのページコンテナが空");
                    return;
                }
                try(PtlPage pageInsert = pages2.get(0)) { // 先頭ページの取得
                    // 指定ページの挿入()
                    content.drawForm(outputRect, PtlContent.ALIGN.ALIGN_TOP_LEFT, pageInsert);
                }
            }
        }
    }

    public static PtlRect setQROutputRect(BufferedReader br, PtlRect outputRect)
        throws IOException, PtlException, Exception, Error{
        float top, bottom, left, right;
        boolean isValueOkay = false;
        while(!isValueOkay) {
            System.out.println("QRコードの配置矩形の各数値を入力してください。");
            System.out.println("矩形の左上座標が配置の基準になり、");
            System.out.println("そこから右下座標までの範囲を超えない範囲でQRコードが描画されます。");
            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("right (mm) : ");
            right = Float.parseFloat(br.readLine());
            System.out.print("left (mm) : ");
            left = Float.parseFloat(br.readLine());
            if(right < left) { //不正矩形は再入力させる
                System.out.println("rightの値はleftよりも大きい値を指定して再度入力してください。");
                continue;
            }

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

プログラムファイル名

AddPdfQRcodeOnAllPage.java

入出力操作の例

C:\samples>java cookbook.AddPdfQRcodeOnAllPage tagged-pdf.pdf addPdfQROnAllPage.pdf QRcode.pdf 
ページ数:44
QRコードの配置矩形の各数値を入力してください。
矩形の左上座標が配置の基準になり、
そこから右下座標までの範囲を超えない範囲でQRコードが描画されます。
top (mm) : 255
bottom (mm) : 240
right (mm) : 35
left (mm) : 20
-- 完了 --

PDF形式で作成した文書の右上にPDF形式で作成したQRコードを追加した例を図に示しました。

images/AddPdfQRcodeOnAllPage-example.png

図2・22 拡大してもにじまないQRコードを文書PDFに追加