PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

PDFlib サンプル集(クックブック)

本サンプルプログラムは、PDF 文書生成ライブラリーの実装である PDFlib の基本的な機能を実際のプログラムで紹介したものです。

本サイトでダウンロードした PDFlib は、一部機能の制限を除き、評価版として無償でお使いいただけます。

エラーハンドリング

PDFlibプログラミングでエラーをトラップするためのサンプルプログラムです。

例1:errorpolicy パラメータを return とした場合。これは、PDFlib 関数がエラーを感知した際に、-1 (PHP では 0)を返すことを意味します。利用できないフォントをロードする際、load_font 関数は -1 (PHP では 0) を返します。関数からの戻り位置をチェックして、代わりに他のフォントをロードします。

例2:errorpolicy パラメータを exception とした場合。これは、PDFlib 関数がエラーを感知するとすぐに例外を送出することを意味します。

エラーポリシーが return の場合には常に PDFlib 関数の戻り値をチェックする必要があります。errorpolicy が return にセットされている場合は、load_image の戻り値をチェックすることにより、存在しない場合にテキストを出力できます。

必要な製品:PDFlib または PDFlib+PDI または PDFlib PPS


/*
 * エラーハンドリング:
 * 例外処理に関して、さまざまな方法を実証します。
 * 
 * 例 1 :"errorpolicy "パラメータを "return "に設定する。
 * 利用できないフォントを読み込もうとすると、load_font() は -1(PHPでは0)を返し
 * ます。関数の戻り値を確認し、代わりに利用可能な別のフォントをロードします。
 * 
 * 例2:"errorpolicy"パラメータを"exception"に設定します。そうすると、PDFlib 関数が
 * 呼び出しが失敗したときに例外を発生させます。
 *
 * 特定の PDFlib 関数呼び出しの戻り値を調べたいときは、"errorpolicy"パラメータを 
 * "return"に変更してください。そして、load_image()の戻り値を調べて、読み込むべき
 * 画像が存在しない場合は、代替テキストを出力します。
 * 
 * 必要なソフトウェア: PDFlib または PDFlib+PDI または PPS 10
 * 必要なデータ: 無し
 */
package com.pdflib.cookbook.pdflib.general;

import com.pdflib.pdflib;
import com.pdflib.PDFlibException;

public class error_handling
{
    public static void main (String argv[])
    {
        /* 必要に応じてファイルの場所を指定する */
        String searchpath = "../input";
        String outfile = "error_handling.pdf";
        String title = "Error Handling";

        pdflib p = null;
        int exitcode = 0;
        String imagefile = "unavailable.jpg";
        int font, image;

        try {
            p = new pdflib();

            p.set_option("searchpath={" + searchpath + "}");
                    
            /*
             * errorpolicy "パラメータを使用して、適切なエラーポリシーを定義します。
             *
             * デフォルト設定"errorpolicy=legacy"は、 PDFlib の旧版との互換性を保証
             * するもので、この場合例外とエラー戻り値は fontwarning・imagewarning 等の
             * パラメータやオプションで制御されます。
             * これは、PDFlib 6 とのソースコード互換性を必要とするアプリケーション
             * のみに推奨します。
             *
             * errorpolicy=exception にして、エラー状態が検出されると、例外が発生しますが、
             * その時出力文書は使用できなくなります。
             * 
             * これは、エラー条件のない遅延プログラミングに使用することができます。
             * アプリケーションで修正可能な問題であっても、出力文書を犠牲にすることになります。
             * 
             * errorpolicy=return "では、エラー状態が検出されると、警告パラメータやオプションに
             * 関係なく、それぞれの関数が-1(PHPでは0)のエラー値で返されます。
             *
             * アプリケーションの開発者は、この返り値をチェックして問題を特定し、アプリケー
             * ションに適した方法で問題に対処しなければなりません。
             * これは、エラー処理を統一的に行うために推奨される方法です。
             */
            
            /* ------------------------------------------------------------------
             * 1 番目の例: 
             * すべての関数呼び出しに対して、"errorpolicy"を"return"に設定する。
             * つまり、load_font()などの戻り値をチェックする必要がある。
             * 戻り値:-1 (PHPでは0)。
             * ------------------------------------------------------------------
             */
            p.set_option("errorpolicy=return");

            if (p.begin_document(outfile, "") == -1)
                throw new Exception("Error: " + p.get_errmsg());

            p.set_info("Creator", "PDFlib Cookbook");
            p.set_info("Title", title);

            /* ページを始める */
            p.begin_page_ext(0, 0, "width=a4.height height=a4.width");

            /*
             * 利用できない可能性のある特殊なフォントを読み込む
             */
            font = p.load_font("MyFontName", "unicode", "");

            /* load_font() の戻り値をチェックする */
            if (font == -1) {
                /* フォントハンドルが無効。原因を調べる */
                String errmsg = p.get_errmsg();
                
                /* 別のフォントを試 */
                font = p.load_font("NotoSerif-Regular", "unicode", "");

                /* フォントハンドルも無効 */
                if (font == -1) {
                    throw new Exception("Error: " + p.get_errmsg());
                }
                
                /* エラーメッセージをPDFに出力する。
                 * これはあまり現実的ではないが、失敗した関数呼び出しの後、
                 * PDF を破損することなく、どのように進めるかを示すことを意図
                 * しています。
                 */
                p.setfont(font, 20);
                p.fit_textline(errmsg, 50, 400, "");
            }

            
            /* -------------------------------------------------------------------
             * 2番目の例: 
             * "errorpolicy"を "exception"に設定する。特定の関数呼び出しの戻り値を
             * チェックしたい場合のみ、"return "に変更する。
             * -------------------------------------------------------------------
             */
            p.set_option("errorpolicy=exception");
            
            /* 説明テキストを出力する */
            p.setfont(font, 20);
            p.fit_textline("Error policy can be exception or return.",
                50, 500, "");
            
            /* "errorpolicy" パラメータに "return" を設定し、load_image() の戻り値を
             * 確認する。
             * その後、再び "exception "に戻してください。読み込むべき画像が存在しない場合、
             * 代替テキストが出力される。
             * 
             * また、load_image()のオプションとして "errorpolicy=return "を使用することも
             * 可能である。このオプションは、各関数の呼び出しに対してのみエラーポリシー
             * を変更する。
             * 
             * なお、このオプションに正しく対応しているのは  PDFlib 7.0.3 以降のみ
             */ 
            p.set_option("errorpolicy=return");
              
            /* 画像をロードする */
            image = p.load_image("auto", imagefile, "");
            
            /* "errorpolicy"パラメーターを "exception"に設定し直す。 */
            p.set_option("errorpolicy=exception");
            
            /* 画像がない場合、代替テキストを出力する */
            if (image == -1) {
                p.setcolor("fillstroke", "rgb", 1, 0, 0, 0);
                int x=50, y=200, w=200, h=100;
                p.rect(x, y, w, h);
                p.stroke();
                p.setfont(font, 10);
                p.fit_textline("Replacement text for unavailable image", 
                    x + 5, y + 5, "boxsize={" + (w - 10) + " " + (h - 10) + "}");
            }
            else {
                /* 画像を配置する */
                p.fit_image(image, 20, 20, "scale=0.5");
            }
            
            p.end_page_ext("");

            p.end_document("");

        } catch (PDFlibException e) {
            System.err.println("PDFlib exception occurred:");
            System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() +
                ": " + e.get_errmsg());
            exitcode = 1;
        } catch (Exception e) {
            System.err.println(e);
            exitcode = 1;
        } finally {
            if (p != null) {
                p.delete();
            }
            System.exit(exitcode);
        }
    }
}
(Apr 3, 2007 - Feb 21, 2024)