1.2.2 ページ境界値の設定

images/SetBoundary-top.png

狙い・効果

PDF文書のページ境界を設定し直します。

処理の概要

  1. 変更したい境界値の種類を指定します。
  2. 境界値を変更したいページを指定します。
  3. 境界値の設定値を指定します。

『PDF Tool API』の主な機能

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

プログラム例

package cookbook;

import java.io.*;
import jp.co.antenna.ptl.*;

public class SetBoundary {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2)
        {
            System.out.println("usage: java SetBoundary in-pdf-file out-pdf-file");
            return;
        }



        ...【AppendPages.javaと同じ処理のため省略
             ・PtlParamInputを用いてPtlPDFDocument docに入力PDFをロード
             ・PtlParamOutputを用いて出力PDF名を指定】...


            // ページ数の取得
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);

            try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))
            {
                int boxType = setBoxType(br);  //Boxの種類を数値で指定するメソッド
                int changingPage = setChangingPage(br);//境界値を変更したいページを指定するメソッド

                if((changingPage < 0)||(numPages < changingPage))
                {
                    System.err.println("変更したいページは正の、全ページ数より少ない値を指定してください。");
                    return ;
                }

        ...【RemovePages.javaと同じ処理のため省略
             ・doc.getPages()メソッドを用いてPtlPages pagesにページコンテナを取得
             ・ページコンテナが空だった場合にエラーを出力して終了】...

                    // 変更したいページの取得
                    // PtlPages.get() のパラメータindexは0が先頭のため、changingPageから1引いています。
                    try (PtlPage page = pages.get(changingPage -1))
                    {
                        float top, bottom, left,right;
                        System.out.println("変更したい境界値の数値を入力してください。");
                        System.out.print("top (mm) : ");
                        top = Float.parseFloat(br.readLine());
                        System.out.print("bottom (mm) : ");
                        bottom = Float.parseFloat(br.readLine());
                        System.out.print("left (mm) : ");
                        left = Float.parseFloat(br.readLine());
                        System.out.print("right (mm) : ");
                        right = Float.parseFloat(br.readLine());

                        switch(boxType)
                        {
                        case 1://MediaBox
                            try(PtlRect mediaBox = new PtlRect(left, bottom, right, top))
                            {
                                System.out.println(changingPage +"ページ目 MediaBox の[top, bottom, left, right]を、");
                                System.out.println("[" + top +", " + bottom +", " + left +", " + right +"]に変更します。"); 
                                page.setMediaBox(mediaBox);
                            }
                            break;

                        case 2:  //CropBox
                            try(PtlRect cropBox = new PtlRect(left, bottom, right, top))
                            {
                                System.out.println(changingPage +"ページ目 CropBox の[top, bottom, left, right]を、");
                                System.out.println("[" + top +", " + bottom +", " + left +", " + right +"]に変更します。"); 
                                page.setCropBox(cropBox);
                            }
                            break;

                        case 3:  //BleedBox
                            try(PtlRect bleedBox = new PtlRect(left, bottom, right, top))
                            {
                                System.out.println(changingPage +"ページ目 BleedBox の[top, bottom, left, right]を、");
                                System.out.println("[" + top +", " + bottom +", " + left +", " + right +"]に変更します。"); 
                                page.setBleedBox(bleedBox);
                            }

                            break;

                        case 4:  //TrimBox
                            try(PtlRect trimBox = new PtlRect(left, bottom, right, top))
                            {
                                System.out.println(changingPage +"ページ目 TrimBox の[top, bottom, left, right]を、");
                                System.out.println("[" + top +", " + bottom +", " + left +", " + right +"]に変更します。"); 
                                page.setTrimBox(trimBox);
                            }
                            break;

                        case 5:  //ArtBox
                            try(PtlRect artBox = new PtlRect(left, bottom, right, top))
                            {
                                System.out.println(changingPage +"ページ目 ArtBox の[top, bottom, left, right]を、");
                                System.out.println("[" + top +", " + bottom +", " + left +", " + right +"]に変更します。"); 
                                page.setArtBox(artBox);
                            }
                            break;
                        }

                    }

        ...【AppendPages.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...


    }

	public static int setBoxType(BufferedReader br) throws IOException{
		int boxType = 0;

		System.out.println("変更したい境界値の種類を数値で指定してください。");
		System.out.println("1: MediaBox, 2: CropBox, 3: BleedBox, 4: TrimBox, 5:ArtBox");
		while((boxType < 1)||(5 < boxType))
		{
			boxType = Integer.parseInt(br.readLine());
			if((boxType < 1) || (5 < boxType))
			{
				System.out.println("数値は1~5の範囲で指定してください。");
			}
		}

		return boxType;
	}

	public static int setChangingPage(BufferedReader br) throws IOException{
		int changingPage = 0;

		System.out.println("変更したいページを数値で指定してください。");
		while(changingPage < 1)
		{
			changingPage = Integer.parseInt(br.readLine());
			if(changingPage < 1)
			{
				System.out.println("数値は正の数を指定してください。");
			}
		}
		return changingPage;
	}
}

サンプルファイル名

SetBoundary.java

入出力操作の例

C:\samples>java cookbook.SetBoundary 
usage: java SetBoundary in-pdf-file out-pdf-file

C:\samples>java cookbook.SetBoundary CSS-Print-v4.pdf CSS-Print-v4-change.pdf 
ページ数:140
変更したい境界値の種類を数値で指定してください。
1: MediaBox, 2: CropBox, 3: BleedBox, 4: TrimBox, 5:ArtBox
2
変更したいページを数値で指定してください。
1
変更したい境界値の数値を入力してください。
top (mm) : 271
bottom (mm) : 14
left (mm) : 14
right (mm) : 196
1ページ目 CropBox の[top, bottom, left, right]を、
[271.0, 14.0, 14.0, 196.0]に変更します。
-- 完了 --

元のPDF文書:CSS-Print-v4.pdfのMediaBoxとCropBoxは1.2.1 ページ境界値の取得の例で示したように同じ値が設定されています。CropBoxの境界値をTrimBoxと同じ値に設定することにより、仕上がりサイズで表示(印刷)されるようになります。

本例では1ページ目だけに対してCropBoxの値を変更しています。

images/SetBoundary-example.png

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