PDFlib Cookbook

cookbook

general/error_handling

Download Java Code      Switch to PHP Code     Show Output PDF

/* $Id: error_handling.java,v 1.7 2013/01/15 10:11:58 stm Exp $
 * Error handling:
 * Demonstrate different strategies with respect to exception handling.
 * 
 * Example 1: Set the "errorpolicy" parameter to "return". This means that a 
 * PDFlib function call will return with -1 (in PHP: 0) when an error condition
 * is detected. Try to load a font which is not available so that load_font()
 * will return with -1 (in PHP: 0). Check for that return value and load another
 * available font instead.
 * 
 * Example 2: Set the "errorpolicy" parameter to "exception". This means that
 * an exception will be thrown whenever a PDFlib function call fails. Change the
 * error policy to "return" every time you want to check the return value of a
 * particular PDFlib function call. Then, set the "errorpolicy" parameter to
 * "return" to check the return value of load_image(). If the image to be loaded
 * does not exist output a replacement text. 
 * 
 * Required software: PDFlib/PDFlib+PDI/PPS 9
 * Required data: none
 */
package com.pdflib.cookbook.pdflib.general;

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

public class error_handling
{
    public static void main (String argv[])
    {
    /* This is where the data files are. Adjust as necessary. */
    String searchpath = "../input";
    String outfile = "error_handling.pdf";
    String title = "Error Handling";

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

    try {
        p = new pdflib();

        p.set_option("searchpath={" + searchpath + "}");
                
        /* Use the "errorpolicy" parameter to define an appropriate error 
         * policy.
         * The default setting "errorpolicy=legacy" ensures compatibility to
         * earlier versions of PDFlib, where exceptions and error return values
         * are controlled by parameters and options such as fontwarning,
         * imagewarning, etc. This is only recommended for applications which
         * require source code compatibility with PDFlib 6.
         * 
         * With "errorpolicy=exception" an exception will be thrown when an
         * error condition is detected. However, the output document will be
         * unusable after an exception. This can be used for lazy programming
         * without any error conditionals at the expense of sacrificing the
         * output document even for problems which may be fixable by the
         * application.
         * 
         * With "errorpolicy=return" when an error condition is detected, the
         * respective function will return with a -1 (in PHP: 0) error value
         * regardless of any warning parameters or options. The application
         * developer must check the return value to identify problems, and must
         * react on the problem in whatever way is appropriate for the
         * application. This is the recommended approach since it allows a
         * unified approach to error handling.
         */
        
        /* ------------------------------------------------------------------
         * First example: 
         * Set the "errorpolicy" to "return" for all function calls.
         * This means we must check the return values of load_font() etc. for
         * -1 (in 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 + " $Revision: 1.7 $");

        /* Start page */
        p.begin_page_ext(842, 595, "");

        /*
         * Try to load a special font which might not be available.
         */
        font = p.load_font("MyFontName", "unicode", "");

        /* Check the return value of load_font() */
        if (font == -1) {
            /* font handle is invalid; find out what happened */
            String errmsg = p.get_errmsg();
            
            /* Try a different font */
            font = p.load_font("Helvetica", "unicode", "");

            /* font handle is also invalid; give up */
            if (font == -1) {
                throw new Exception("Error: " + p.get_errmsg());
            }
            
            /* Output the error message to the PDF. This is not pretty 
             * realistic but it is intended to show how you can proceed after
             * a failed function call without having damaged the PDF.
             */
            p.setfont(font, 20);
            p.fit_textline(errmsg, 50, 400, "");
        }

        
        /* -------------------------------------------------------------------
         * Second example: 
         * Set the "errorpolicy" to "exception". Change it to "return" only if
         * you want to check the return value of a particular function call.
         * -------------------------------------------------------------------
         */
        p.set_option("errorpolicy=exception");
        
        /* Output some descriptive text */
        p.setfont(font, 20);
        p.fit_textline("Error policy can be legal, exception, or return.",
            50, 500, "");
        
        /* Set the "errorpolicy" parameter  to "return" to check the return
         * value of load_image(). Then set the parameter back to "exception"
         * again. If the image to be loaded does not exist a replacement text
         * will be output. 
         * 
         * Alternatively, the "errorpolicy=return" option of load_image() can be
         * used which changes the error policy just for the respective function
         * call. Note that this option is correctly supported only by 
         * PDFlib 7.0.3 and above.
         */
        p.set_option("errorpolicy=return");
          
        /* Load the image */
        image = p.load_image("auto", imagefile, "");
        
        /* Set the "errorpolicy" parameter  to "exception" again */
        p.set_option("errorpolicy=exception");
        
        /* Output some replacement text if image is not available */
        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 {
            /* Place the image */
            p.fit_image(image, 20, 20, "scale=0.5");
        }
        
        p.end_page_ext("");

        p.end_document("");

        } catch (PDFlibException e) {
            System.err.print("PDFlib exception occurred:\n");
            System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() +
                ": " + e.get_errmsg() + "\n");
        } catch (Exception e) {
            System.err.println(e.getMessage());
        } finally {
            if (p != null) {
                p.delete();
            }
        }
    }
}