BASKET
Search
PDFlib

blocks/query_block_properties

Download Java Code      Switch to PHP Code     Show Output PDF      Show Input PDF

/* $Id: query_block_properties.java,v 1.10 2013/01/15 10:11:56 stm Exp $

 * 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;


    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 + " $Revision: 1.10 $");

       

        /* 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.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();

            }

        }

    }

}