PDF文書の指定位置に、予めPDF文書として用意したPDFのQRコード画像を貼り付けQRコードを貼り付けます。
QRコード画像をPDF文書(QRコードPDF文書)として用意します
他のPDF文書(貼り付け先PDF文書)の指定ページに、QRコード画像を貼り付ける矩形の大きさ(配置矩形)を指定します。
QRコードPDF文書を配置矩形の大きさに合うように拡大縮小して貼り付けます。こうして挿入されたQRコードは拡大・縮小でにじむことがありません。
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コードを追加した例を図に示しました。