例1:errorpolicy パラメータを return とした場合。これは、PDFlib 関数がエラーを感知した際に、-1 (PHP では 0)を返すことを意味します。利用できないフォントをロードする際、load_font 関数は -1 (PHP では 0) を返します。関数からの戻り位置をチェックして、代わりに他のフォントをロードします。
エラーポリシーが return の場合には常に PDFlib 関数の戻り値をチェックする必要があります。errorpolicy が return にセットされている場合は、load_image の戻り値をチェックすることにより、存在しない場合にテキストを出力できます。
/*
* エラーハンドリング:
* 例外処理に関して、さまざまな方法を実証します。
*
* 例 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);
}
}
}