印刷版下として使うためのPDFでは仕上がり領域の外部に塗り足し(ブリード)やトンボなどが設定されています。そのようなPDF文書をそのまま印刷すると本文の外側の不要な領域まで印刷されてしまいます。こうしたページの余白を切り取り余白を切り取って紙の大きさを仕上がりサイズに設定します。
PDF文書のページの大きさを取得して、ページの上下左右の境界座標を設定し直します。
PDF文書を読んで、MediaBoxとTrimBoxが異なる場合、TrimBoxの値をMediaBoxに設定し直します。BleedBox、CropBoxも同じ値とします。
この例では次の機能を使っています。
package cookbook; import java.util.*; import jp.co.antenna.ptl.*; public class TrimPages { /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 2) { System.out.println("usage: java TrimPages in-pdf-file out-pdf-file"); return; } ...【AppendPages.javaと同じ処理のため省略 ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード ・PtlParamOutputを用いて出力PDF名を指定】... // ページ数の取得 int numPages = doc.getPageCount(); System.out.println("ページ数:" + numPages); if(numPages > 10) { System.out.println("ページ数が10ページを超えています。"); System.out.println("先頭10ページまでのページ境界変更のログを出力します。"); System.out.println("残りのページ境界はログを出力せずに変更されます。\n"); } ...【RemovePages.javaと同じ処理のため省略 ・doc.getPages()メソッドを用いてPtlPages pagesにページコンテナを取得 ・ページコンテナが空だった場合にエラーを出力して終了】... // 全ページのページ境界座標を再設定 // PtlPages.get() のパラメータindexは0が先頭のため、changingPageから1引いています。 for(int i = 0; i < numPages; i++) { try (PtlPage page = pages.get(i); PtlRect trimBox = page.getTrimBox(); PtlRect mediaBox = page.getMediaBox()) { float[] trimBoxValue = new float[4]; //trimBoxの各座標を格納する配列 float[] mediaBoxValue = new float[4]; //trimBoxの各座標を格納する配列 trimBoxValue[0] = trimBox.getLeft(); trimBoxValue[1] = trimBox.getBottom(); trimBoxValue[2] = trimBox.getRight(); trimBoxValue[3] = trimBox.getTop(); mediaBoxValue[0] = mediaBox.getLeft(); mediaBoxValue[1] = mediaBox.getBottom(); mediaBoxValue[2] = mediaBox.getRight(); mediaBoxValue[3] = mediaBox.getTop(); //trimBoxとmediaBoxが異なる場合に、mediaBoxを変更して設定する。 if(!Arrays.equals(trimBoxValue, mediaBoxValue)) { // mediaBoxの値の変更 mediaBox.setLeft(trimBoxValue[0]); mediaBox.setBottom(trimBoxValue[1]); mediaBox.setRight(trimBoxValue[2]); mediaBox.setTop(trimBoxValue[3]); page.setMediaBox(mediaBox); //変更の反映 page.setCropBox(mediaBox); //CropBox,BleedBoxも同じ値を設定する。 page.setBleedBox(mediaBox); if(i < 10) // メッセージ出力 { System.out.println((i+1) + "ページ目 MediaBox の[top, bottom, left, right]を、"); System.out.println("[" + trimBoxValue[3] +", " + trimBoxValue[1] +", " + trimBoxValue[0] +", " + trimBoxValue[2] +"]に変更します。"); } } } } ...【AppendPages.javaと同じ処理のため省略 ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力 ・PtlException, Exception, Error を catchするエラー処理 ・finally文で"--完了--"と表示する処理】... } }
TrimPages.java
C:\samples>java cookbook.TrimPages usage: java TrimPages in-pdf-file out-pdf-file C:\samples>java cookbook.TrimPages CSS-Print-v4.pdf CSS-Print-v4-trimpages.pdf ページ数:140 ページ数が10ページを超えています。 先頭10ページまでのページ境界変更のログを出力します。 残りのページ境界はログを出力せずに変更されます。 1ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 2ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 3ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 4ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 5ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 6ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 7ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 8ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 9ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 10ページ目 MediaBox の[top, bottom, left, right]を、 [271.0, 14.0, 14.0, 196.0]に変更します。 -- 完了 --
処理の前後のPDFを比較すると図のようになります。CropBoxの値のみを設定したとき(図1・2 CropBoxの値をTrimBoxと同じ値に設定し直したPDF(右))とビューワ上の表示は同じです。