1.2.3 ページ周囲の余白を断裁

images/TrimPages-top.png

狙い・効果

印刷版下として使うためのPDFでは仕上がり領域の外部に塗り足し(ブリード)やトンボなどが設定されています。そのようなPDF文書をそのまま印刷すると本文の外側の不要な領域まで印刷されてしまいます。こうしたページの余白を切り取り余白を切り取って紙の大きさを仕上がりサイズに設定します。

処理の概要

PDF文書のページの大きさを取得して、ページの上下左右の境界座標を設定し直します。

PDF文書を読んで、MediaBoxとTrimBoxが異なる場合、TrimBoxの値をMediaBoxに設定し直します。BleedBox、CropBoxも同じ値とします。

PDF Tool APIの主な機能

この例では次の機能を使っています。

プログラム例

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

入出力操作の例

images/TrimPages.png

処理の前後のPDFを比較すると図のようになります。CropBoxの値のみを設定したとき(図1・2 CropBoxの値をTrimBoxと同じ値に設定し直したPDF(右))と表示は同じです。

images/TrimPages-example.png

図1・3 MediaBox他の値をTrimBox と同じ値に設定し直したPDF(右)