PDFlib

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

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

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

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

PDFlib ブロックの基礎

PDFlib ブロックを含む PDF ページをインポートし、すべてのブロックに処理を行います。PDFlib ブロックは pCOS 経由で取得され、ブロック配置関数は出力ページ上にブロックを視覚できるようにします。実用例としては、ブロックに外部のデータソースから取得したデータを配置するような場合が考えられます。


/*
 * Block starter:
 * Import a PDF page containing blocks and fill text and image
 * blocks with some data. For each addressee of the simulated
 * mailing a separate page with personalized information is
 * generated.
 * A real-world application would fill the Blocks with data from
 * some external data source. We simulate this with static data.
 *
 * Required software: PPS 9
 * Required data: input PDF, image
 */
 
package com.pdflib.cookbook.pdflib.blocks;


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

public class starter_block {
    public static void main(String argv[]) {

        /* This is where the data files are. Adjust as necessary. */
        String searchpath = "../input";
        String outfile = "starter_block.pdf";
        String infile = "block_template.pdf";
        String imagefile = "new.jpg";

        pdflib p = null;
        int  i, j, no_of_input_pages, pageno, indoc, image;
        String optlist, objtype;
        int exitcode = 0;
                
        /* Names of the recipient-specific Blocks contained on the imported page */
        String addressblocks[] = { "name", "street", "city" };

        /* Personalization data for the recipients */
        String recipients[][] = {
            { "Mr Maurizio Moroni", "Strada Provinciale 124", "Reggio Emilia" },
            { "Ms Dominique Perrier", "25, rue Lauriston", "Paris" },
            { "Mr Liu Wong", "55 Grizzly Peak Rd.", "Butte" } };

        /* Static text simulates database-driven main contents */
        String blockdata[][] = {
          {"intro", "Dear Paper Planes Fan,"},
          {"announcement", 
            "Our BEST PRICE OFFER includes today:"
            + "\n\n"
            + "Long Distance Glider\nWith this paper rocket you can send all your "
            + "messages even when sitting in a hall or in the cinema pretty near "
            + "the back.\n\n"
            + "Giant Wing\nAn unbelievable sailplane! It is amazingly robust and "
            + "can even do aerobatics. But it is best suited to gliding.\n\n"
            + "Cone Head Rocket\nThis paper arrow can be thrown with big swing. "
            + "We launched it from the roof of a hotel. It stayed in the air a "
            + "long time and covered a considerable distance.\n\n"
            + "Super Dart\nThe super dart can fly giant loops with a radius of 4 "
            + "or 5 meters and cover very long distances. Its heavy cone point is "
            + "slightly bowed upwards to get the lift required for loops.\n\n"
            + "Visit us on our Web site at www.kraxi.com!"},
            {"goodbye", "Yours sincerely,\nVictor Kraxi"} };
       
        try {
            p = new pdflib();

            /*
             * This means we must check return values of load_font() etc.
             * Set the search path for fonts and images etc.
             */
            p.set_option("errorpolicy=return SearchPath={{" + searchpath + "}}");

            if (p.begin_document(outfile,
                    "destination={type=fitwindow} pagelayout=singlepage") == -1) {
                throw new Exception("Error: " + p.get_errmsg());
            }

            p.set_info("Creator", "PDFlib starter sample");
            p.set_info("Title", "starter_block");

            /* Open the Block template which contains PDFlib Blocks */
            indoc = p.open_pdi_document(infile, "");
            if (indoc == -1) {
                throw new Exception("Error: " + p.get_errmsg());
            }
            no_of_input_pages = (int) p.pcos_get_number(indoc, "length:pages");
            /* Prepare all pages of the input document. We assume a small
             * number of input pages and a large number of generated output
             * pages. Therefore it makes sense to keep the input pages
             * open instead of opening the pages again for each recipient.
             */
            int[] pagehandles = new int[no_of_input_pages+1]; 
           
            for (pageno = 1; pageno <= no_of_input_pages; pageno++){
              /* Open the first page and clone the page size */
             pagehandles[pageno] = p.open_pdi_page(indoc, pageno, "cloneboxes");
                           
              if (pagehandles[pageno] == -1) {
                  throw new Exception("Error: " + p.get_errmsg());
              }
            }
            
            image = p.load_image("auto", imagefile, "");

            if (image == -1) {
                throw new Exception("Error: " + p.get_errmsg());
            }
            
            /* Duplicate input pages for each recipient and fill Blocks */
            

            /*
             * Based on the imported page generate several pages with the blocks
             * being filled with data related to different persons
             */
            for (i = 0; i < recipients.length; i++) {
                /* Loop over all pages of the input document */
                for (pageno = 1; pageno <= no_of_input_pages; pageno++){
                
                  /* Start the next output page. The page size will be
                   * replaced with the cloned size of the input page.
                   */
                
                  p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

                  /*
                   * Place the imported page on the output page, and clone all
                   * page boxes which are present in the input page; this will
                   * override the dummy size used in begin_page_ext().
                   */
                  p.fit_pdi_page(pagehandles[pageno], 0, 0, "cloneboxes");

                  /* Option list for text blocks */
                  optlist = "encoding=winansi embedding";

                  /* Loop over all recipient-specific Blocks. Fill each
                   * Block with the corresponding person's address data.
                   */
                  for (j = 0; j < addressblocks.length; j++) {
                    /* Check whether the Block is present on the imported page;
                     * type "dictionary" means that the Block is present.
                     */
                    objtype = p.pcos_get_string(indoc, 
                      "type:pages[" + (pageno-1) + "]/blocks/" + addressblocks[j]);
                      
                    if (objtype.equals("dict")){
                      if (p.fill_textblock(pagehandles[pageno], addressblocks[j],
                            recipients[i][j], optlist) == -1)
                        System.err.println("Warning: " + p.get_errmsg());
                    }
                  }
                  /* Loop over the remaining text Blocks. These are filled with 
                   * the same data for each recipient. 
                   */
                   
                  for (j = 0; j < blockdata.length; j++) {
                    /* Check whether the Block is present on the page */
                    objtype = p.pcos_get_string(indoc, 
                    "type:pages[" + (pageno-1) + "]/blocks/" + blockdata[j][0]);
                    if (objtype.equals("dict")){
                      if (p.fill_textblock(pagehandles[pageno], blockdata[j][0],
                            blockdata[j][1], optlist) == -1)
                        System.err.println("Warning: " + p.get_errmsg());
                    }
                  }
                  /* Fill the icon Block if it is present on the imported page */
                  objtype = p.pcos_get_string(indoc, 
                    "type:pages[" + (pageno-1) + "]/blocks/icon");
                  if (objtype.equals("dict")){
                    if (p.fill_imageblock(pagehandles[pageno], "icon", image, "") == -1)
                      System.err.println("Warning: " + p.get_errmsg());

                  p.end_page_ext("");
                }
              }
            }
            
            /* Close all input pages */
            for (pageno = 1; pageno <= no_of_input_pages; pageno++){
              p.close_pdi_page(pagehandles[pageno]);
            }
            p.close_pdi_document(indoc);
            p.close_image(image);

            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);
        }
    }
}
(Dec 11, 2012 - May 23, 2019)