
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
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形式のイラストでは文字や罫線はベクトルデータで表現されていますので、拡大・縮小により文字や線が滲むことがありません。
