1.1.5 PDF文書の分割

PDFCookBookアートボード 3

狙い・効果

PDF文書PDF文書の分割を指定したページ位置で2つに分割します。

処理の概要

PDF文書とページ分割位置を入力します。

ページ分割位置は1~(総ページ数-1)とし、PDF文書の先頭から分割位置までをコピーして1つ目のPDF文書を作成し、分割位置から最後のページまでをコピーして2つ目のPDFを作成します。

元のPDF文書の文書情報(タイトル、サブタイトル、作成者、キーワード、プロデューサ、クリエータ、作成日、更新日)を複製して、分割後の文書情報として設定します。但し、タイトルに1/2、2/2を追記します。

『PDF Tool API』の主な機能

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

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class DividePdf {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 3)
        {
            System.out.println("usage: java DividePdf in-pdf-file out-folder end-page-of-the-first-half");
            return;
        }

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

            int endOfFirstHalf = Integer.parseInt(args[2]);
            if (endOfFirstHalf >= doc.getPageCount())
            {
                System.err.println("end-of-pages-of-the-first-half should not be bigger than end of pdf.");
                return;
            }

            try (PtlDocProperty docproperty = doc.getDocProperty();// 文書プロパティの取得
                 PtlDocInfo docinfo = docproperty.getDocInfo();    // 文書情報の取得
                 PtlPDFDocument doc_ext = new PtlPDFDocument();
                 PtlDocProperty docproperty_ext = doc_ext.getDocProperty(); // 文書プロパティの取得
                 PtlDocInfo docinfo_ext = docproperty_ext.getDocInfo();     // 文書情報の取得
                 PtlPages pages_ext = doc_ext.getPages())
            {
                String outputfile;
                int startPage = 1;
                int endPage = endOfFirstHalf;
                int pagesToPrint;
                // タイトルをコピーし、末尾に1/2をつける
                docinfo_ext.setTitle(docinfo.getTitle()+"1/2");
                //タイトルについては1/2,2/2を追加する必要あり。

                // 著者をコピー
                docinfo_ext.setAuthor(docinfo.getAuthor());

                // サブジェクトをコピー
                docinfo_ext.setSubject(docinfo.getSubject());

                // キーワードをコピー
                docinfo_ext.setKeywords(docinfo.getKeywords());

                // クリエータをコピー
                docinfo_ext.setCreator(docinfo.getCreator());

                // プロデューサをコピー
                docinfo_ext.setProducer(docinfo.getProducer());

                // 作成日付をコピー
                try (PtlDate dateCreate = docinfo.getCreationDate())
                {
                    docinfo_ext.setCreationDate(dateCreate);
                }

                // 更新日付をコピー
                try (PtlDate dateMod = docinfo.getModDate())
                {
                    docinfo_ext.setModDate(dateMod);
                }

                // ページ挿入オプション
                // OPTION_COPY_OUTLINES = 0x00000004 ページ挿入時にあわせてしおりをコピーします。
                // OPTION_COPY_ATTACHEDFILES    = 0x00000008ページ挿入時にあわせて添付ファイルをコピーします。
                int insertoption = PtlPages.OPTION_COPY_OUTLINES | PtlPages.OPTION_COPY_ATTACHEDFILES;


                // 追加ページ数の算出(startPageからendPageまで。)
                pagesToPrint = endPage - startPage + 1;
                // ページの追加
                // PtlPages.append() のパラメータfromNumは0スタートのため、startPageから1引いています。
                pages_ext.append(doc, startPage - 1, pagesToPrint, insertoption);
                // 出力ファイル名
                outputfile = (String)args[1] +  "\\" + "output_1.pdf";
                try (PtlParamOutput outputFile = new PtlParamOutput(outputfile))
                {
                    // ファイルに保存します。
                    doc_ext.save(outputFile);
                }
                //ページを一旦全消去
                pages_ext.removeAll();


                // タイトル末尾に2/2をつけたものに変更
                docinfo_ext.setTitle(docinfo.getTitle()+"2/2");

                // 後半の追加ページを再度指定
                startPage = endPage + 1;
                endPage = doc.getPageCount();  //ページ数を取得し終端ページを指定。

                // 追加ページ数の算出(startPageからendPageまで。)
                pagesToPrint = endPage - startPage + 1;

                // ページの追加
                // PtlPages.append() のパラメータfromNumは0スタートのため、startPageから1引いています。
                pages_ext.append(doc, startPage - 1, pagesToPrint, insertoption);

                // 出力ファイル名を指定
                outputfile = (String)args[1] +  "\\" + "output_2.pdf";
                try (PtlParamOutput outputFile = new PtlParamOutput(outputfile))
                {
                    // ファイルに保存します。
                    doc_ext.save(outputFile);
                }
            }
        }

        ...【GatPageCount.javaと同じ処理のため省略
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...

    }
}

サンプルファイル名

DividePdf.java

入出力操作の例

C:\samples>java cookbook.DividePdf 
usage: java DividePdf in-pdf-file out-folder end-page-of-the-first-half

C:\samples>java cookbook.DividePdf testPages_10.pdf out 6 
-- 完了 --