6.1.2 増分更新による保存

images/SaveByIncrementalUpdate-top.png

狙い・効果

PDFについて増分更新で保存します。

処理の概要

PDFドキュメントを変更したときの保存方法として増分更新のオプションがあります。増分更新では、PDFファイルの内容をそのままに維持して変更前のファイルの最後に変更した内容を追加し、新しいPDFファイルを作る方法です。増分更新をすることで大きなドキュメントに対する小さな変更を素早く保存できます。また、増分更新では、例えばオブジェクトが削除された場合も元データは残された上で削除されたことを示す記録が元データに追加されます。そのため、どのようなPDFの変更がなされたかを遡ることが可能です。電子署名を施したPDFデータを編集した際に、変更がなされた内容を記録する際に有効です。

本サンプルプログラムでは、入力PDFの1ページ目にテストメッセージのテキストを追加し、増分更新でPDFドキュメントとして出力します。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SaveByIncrementalUpdate {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.print("usage: java SaveByIncrementalUpdate in-pdf-file out-pdf-file");
     }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            printUsage();
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument()) {
            // PDFファイルをロードします。
            doc.load(inputFile);

            // リニアライズ
            doc.setSaveOption(PtlPDFDocument.SAVE_OPTION.SAVE_INCREMENTAL_UPDATE);
            try (PtlPages pages = doc.getPages()) //ページコンテナの取得
            {
                // ページコンテナが空かどうか
                if (pages.isEmpty())
                {
                    System.err.println("ページコンテナが空");
                    return;
                }

                try (PtlPage page = pages.get(0);// ページの取得(先頭ページを指定)
                     PtlContent content = page.getContent();// ページコンテントの取得
                     PtlRect outputRect = new PtlRect();// 出力矩形の設定
                     PtlParamFont font = new PtlParamFont();// フォント
                     // 文字描画のパラメータクラス。今回は何も設定しない。
                     PtlParamWriteString writeStringParam = new PtlParamWriteString()) {

                    setRect(outputRect, 130, 58, 200, 65);
                    content.writeString(outputRect, PtlContent.ALIGN.ALIGN_BOTTOM_LEFT,
                                        "this is test message",
                                        writeStringParam);
                }            
            }
            // ファイルに保存します。
            doc.save(outputFile);
        }
	...【AppendAnnotStampDefault.javaと同じ処理のため省略
	  ・エラーメッセージ処理と出力】...
    }

    public static PtlRect setRect(PtlRect outputRect, float left, float bottom,
                                  float right, float top)
        throws PtlException, Exception, Error {
        outputRect.setLeft(left);
        outputRect.setBottom(bottom);
        outputRect.setRight(right);
        outputRect.setTop(top);

        return outputRect;
    }
}

プログラムファイル名

SaveByIncrementalUpdate.java

入出力操作の例

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

C:\samples>java cookbook.SaveByIncrementalUpdate setopenmode.pdf save-incremental.pdf 
-- 完了 --