PDFlib

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

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

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

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

PDFlib ブロックのプロパティを取得

PDFlib ブロックを含む PDF ページインポートし、様々なブロックのプロパティを取得します。pcos_get_number() と pcos_get_string() を使い、ページ中のすべてのブロックを処理します。以下のプロパティを取得します:

  • インポートした最初のページに含まれるすべてのブロックの名前と座標を列挙します
  • テキストフローブロックの "leading" プロパティを取得します
  • PDF に準拠したブロック仕様のバージョンを取得します
  • すべてのブロックについて、カスタムプロパティのキーと値を列挙します
  • それぞれのブロックから "fontname" プロパティの値を取得して、テキストブロックで使用されるすべてのフォントを列挙します

/*
 * Query block properties:
 * Import a PDF page containing blocks, and query various block properties
 *
 * Use pcos_get_number() and pcos_get_string() to process all blocks contained
 * on an imported PDF page. Query block properties which require special
 * treatment:
 * List the names and rectangle coordinates of all blocks contained on the first
 * page of the imported PDF.
 * Query the "leading" property of a Textflow block.
 * Query the version of the block specification to which the block PDF adheres. 
 * List the key and value of custom properties of all blocks.
 * List all fonts required in Text blocks by querying the "fontname" property of
 * each block.
 *
 * Required software: PDFlib+PDI/PPS 9
 * Required data: PDF document containing blocks
 */
package com.pdflib.cookbook.pdflib.blocks;

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

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

    pdflib p = null;
    String infile = "announcement_blocks.pdf";
    String blockname, blocktype;
    int i, j, font, boldfont, indoc, blockcount;
    int x = 30, xoff = 200, y = 800, yoff = 25;
    int exitcode = 0;

    try {
        p = new pdflib();

        p.set_option("searchpath={" + searchpath + "}");

        /* This means we must check return values of load_font() etc. */
        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);
        
        /* Load the standard font */
        font = p.load_font("Helvetica", "unicode", "");
        if (font == -1)
        throw new Exception("Error: " + p.get_errmsg());
        
        /* Load the bold font */
        boldfont = p.load_font("Helvetica-Bold", "unicode", "");
        if (boldfont == -1)
        throw new Exception("Error: " + p.get_errmsg());
        
        /* Open a PDF containing blocks. You don't need to call open_pdi_page()
         * since pCOS calls do not require a PDI page handle but simply the
         * page number.
         */
        indoc = p.open_pdi_document(infile, "");
        if (indoc == -1)
        throw new Exception("Error: " + p.get_errmsg());
        
        /* Start the page */
        p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
        
        /* Set the bold font with a font size of 14 */
        p.setfont(boldfont, 14);
        
        /* Output a heading line */
        p.fit_textline("Querying various block properties in " + infile + 
        " with pCOS", x, y, "");
        
        /* Set the standard font with a font size of 14*/
        p.setfont(font, 14);

        /* Retrieve the number of blocks contained on the first page (which is
         * page no. 0) of the PDF opened
         */     
        blockcount = (int) p.pcos_get_number(indoc,
        "length:pages[0]/blocks");

        if (blockcount == 0)
        throw new Exception("Error: " + infile +
            "does not contain any PDFlib blocks");
        
        
        /* -------------------------------------------------------------------
         * List the names and rectangle coordinates of all blocks contained on
         * the first page of the imported PDF.
         * -------------------------------------------------------------------
         */
        
        /* Output some heading lines */
        p.fit_textline("Name and rectangle coordinates of blocks:", 
        x, y-=2*yoff, "");
        p.fit_textline("block name", x, y-=yoff, "underline");
        p.fit_textline("block rectangle x1 y1 x2 y2", x+xoff, y, "underline");
          
        /* Loop over all all blocks on the first page */
        for (i = 0; i < blockcount; i++)
        {
        /* Retrieve the block name */
        blockname = p.pcos_get_string(indoc,
            "pages[0]/blocks[" + i + "]/Name");
        
        /* Output the block name */
        p.fit_textline(blockname, x, y-=yoff, "");
           
        for (j = 0; j < 4; j++) {
            int coord = (int) p.pcos_get_number(indoc,
            "pages[0]/blocks[" + i + "]/Rect[" + j + "]");
            
            /* Output the block name */
            p.fit_textline(String.valueOf(coord), x+xoff+j*40, y, "");
        }
        }

        
        /* ---------------------------------------------------------------------
         * Query the "leading" property of a Textflow block. The "leading"
         * property is of type "float or percentage". Percentages are stored as
         * array with two elements, e.g. /leading [120.0(%)].
         * Check the object type of the leading value (using the "type" prefix);
         * if it has type "number", use PDF_pcos_get_number(). If it has type 
         * "array", fetch the 0-th element of the array, and treat it as a
         * percentage.
         * ---------------------------------------------------------------------
         */
        blockname = "offer";
        
        boolean istextflow = 
        p.pcos_get_string(indoc,
            "type:pages[0]/blocks/" + blockname + "/textflow").equals("boolean")
            && p.pcos_get_string(indoc,
            "pages[0]/blocks/" + blockname + "/textflow").equals("true");
            
        if (istextflow)
        {
        /* Initialize leading and unit with default values */
        String unit = "%";
        double leading=100; 
        
        /* Get the current leading value of the block */
        String type = p.pcos_get_string(indoc, 
            "type:pages[0]/blocks/" + blockname + "/leading");
        
        if (type.equals("number")) 
        {
            unit = "pt";
            leading = p.pcos_get_number(indoc,
            "pages[0]/blocks/" + blockname + "/leading");
        }
        else if (type.equals("array"))
        {
            unit = "%";
            leading = p.pcos_get_number(indoc,
            "pages[0]/blocks/" + blockname + "/leading[0]");
        }
        
        /* Output the leading value */
        p.fit_textline("Leading value of the \"offer\" text block: " + 
            String.valueOf(leading) + unit, x, y-=2*yoff, "");
        }
        
        
        /* --------------------------------------------------------------------
         * Query the version of the block specification to which the block PDF
         * adheres. 
         * This is sometimes relevant when blocks are prepared with a newer
         * version of the Block plugin, but the PPS version on the server does
         * not accept the higher version of the blocks. Using the pCOS path
         * below users can check for this condition themselves before risking a
         * PPS exception.
         * --------------------------------------------------------------------
         */
        int version = (int) p.pcos_get_number(indoc,
        "pages[0]/PieceInfo/PDFlib/Private/Version");
                
        /* Output the version number of the block specification */
        p.fit_textline("Version of the block specification to which the " +
        "block PDF adheres: " + version, x, y-=2*yoff, "");
        
       
        /* -------------------------------------------------------------------
         * List the key and value of custom properties of all blocks contained
         * on the first page of the imported PDF.
         * -------------------------------------------------------------------
         */
        
        /* Output some heading lines */
        p.fit_textline("Custom properties used in blocks:",x , y-=2*yoff, "");
        p.fit_textline("block name", x, y-=yoff, "underline");
        p.fit_textline("custom key", x+xoff, y, "underline");
        p.fit_textline("custom value", x+2*xoff, y, "underline");
        
        /* Loop over all blocks on the first page */
        for (i = 0; i < blockcount; i++)
        {
        /* Fetch the block name */
        blockname = p.pcos_get_string(indoc,
            "pages[0]/blocks[" + i + "]/Name");
        
        /* Fetch the number of custom properties contained in the block */
        int propcount = (int) p.pcos_get_number(indoc,
            "length:pages[0]/blocks[" + i + "]/Custom");
        
        for (j = 0; j < propcount; j++)
        {
            /* Output the name of the custom property */
            p.fit_textline(blockname, x, y-=yoff, "");
            
            /* Fetch the name of the custom property */
            String propname = p.pcos_get_string(indoc, 
            "pages[0]/blocks[" + i + "]/Custom[" + j + "].key");
            
            /* Output the name of the custom property */
            p.fit_textline(propname, x+xoff, y, "");
            
            /* Query the type of the custom property: 
             * "string", "name", "number", or "list of numbers"
             */
            String proptype = p.pcos_get_string(indoc, 
            "type:pages[0]/blocks[" + i + "]/Custom[" + j + "]");
            
            /* Process the custom property depending on the type */
            if (proptype.equals("string"))
            {
            /* Get the string value of the custom property */
            String propvalue = p.pcos_get_string(indoc, 
                "pages[0]/blocks[" + i + "]/Custom[" + j + "].val");
            
            /* Output the value of the custom property */
            p.fit_textline(propvalue, x+2*xoff, y, "");
            }
            else if (proptype.equals("number"))
            {
            double propvalue = p.pcos_get_number(indoc,
                "pages[0]/blocks[" + i + "]/Custom[" + j + "].val"); 
            
            /* Output the name of the custom property */
            p.fit_textline(String.valueOf(propvalue), x+2*xoff, y, "");
            }
            else
            {
            /* Read the remaining types "name" or "list of numbers"
             * and perform appropriate actions
             */
            }
        }
        }
        
        
        /* -----------------------------------------------------------------
         * List all fonts required in Text blocks by querying the "fontname"
         * property of each block
         * -----------------------------------------------------------------
         */
        
        /* Output a heading line */
        p.fit_textline("Font names used in blocks:",x , y-=2*yoff, "");
        p.fit_textline("block name", x, y-=yoff, "underline");
        p.fit_textline("font", x+xoff, y, "underline");
        
        /* Loop over all blocks on the page */
        for (i = 0; i < blockcount; i++)
        {
        /* Fetch the name and type of the i-th block on the first
         * page (one of Text/Image/PDF)
         */
        blockname = p.pcos_get_string(indoc,
            "pages[0]/blocks[" + i + "]/Name");
        
        blocktype = p.pcos_get_string(indoc,
            "pages[0]/blocks[" + i + "]/Subtype");
        
        /* Check if it is a Text block */
        if (blocktype.equals("Text"))
        {
            String fontname = p.pcos_get_string(indoc,
            "pages[0]/blocks[" + i + "]/fontname");
            
            /* Output the block name and the font name */
            p.fit_textline(blockname, x, y-=yoff, "");
            p.fit_textline(fontname, x+xoff, y, "");
        }
        }
        
        p.end_page_ext("");
          
        p.end_document("");
        p.close_pdi_document(indoc);

        } 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)