PDFのページを他のPDFのページに貼り付けPDF文書のページを他のPDF文書のページの上に貼り付けます。
貼り付ける先のPDF文書のページを指定し、そのページのどの範囲に貼り付けるかを配置矩形として指定します。貼り付けるPDF文書のページを、配置矩形の中でどのように配置するかを指定(配置指定)します。配置指定の方法は表2・1 配置の基準位置を参照してください。
貼り付けるPDF文書の1ページは配置矩形に入るように縮小されます。貼り付けるPDF文書のページが配置矩形よりも小さいときはそのままのサイズになります。
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
イラストファイル(xsl-fo-tree-trimmed.pdf)はPowerPointで作成してPDF形式とし上下をトリムして余白を取り去って作成しました。これをPDF形式のまま図として配置矩形内に貼り込んでいます。PDF形式のイラストでは文字や罫線はベクトルデータで表現されていますので、拡大・縮小により文字や線が滲むことがありません。