PDFlib
BASKET
PDFlib

blocks/override_block_rectangle

Override block rectangle. Fill some blocks of an imported PDF page while changing the rectangle coordinates. Output an imported PDF page containing blocks. The blocks "name", "business_address", and "business_city" have a defined font, font size, and color. Fill those blocks by using a different font and a larger font size. In addition, due to the increased font, increase the block rectangle and move its position to prevent it from overlapping with the other blocks.

Download Java Code      Show Output PDF      Show Input PDF

/* $Id: override_block_rectangle.java,v 1.2.4.1 2008/06/17 12:29:36 katja Exp $

 * Override block rectangle:

 * Fill some blocks of an imported PDF page while changing the rectangle

 * coordinates.

 *

 * Output an imported PDF page containing blocks. The blocks "name",

 * "business_address", and "business_city" have a defined font, font size, and

 * color. Fill those blocks by using a different font and a larger font size.

 * In addition, due to the increased font, increase the block rectangle and

 * move its position to prevent it from overlapping with the other blocks.   

 *

 * Required software: PPS 7

 * Required data: PDF document containing blocks

 */

package com.pdflib.cookbook.pdflib.blocks;


import com.pdflib.pdflib;

import com.pdflib.PDFlibException;


public class override_block_rectangle

{

    public static void main (String argv[])

    {

    /* This is where the data files are. Adjust as necessary. */

    String searchpath = "../input";

    String outfile = "override_block_rectangle.pdf";

    String title = "Override Block Rectangle";


    pdflib p = null;

    double width, height;

    String infile = "stationery_blocks.pdf";

    int inpage, indoc;

    String blockname = "", blocktype = "";

    String text_optlist;

    double block_llx, block_lly, block_urx, block_ury;

    double newblock_llx, newblock_lly, newblock_urx, newblock_ury;

    int i, j, blockcount;

    double blockfontsize, newfontsize, enlarge;

   

    final double incrfactor = 3;

    final int percentage = 30;

     

    final int nblocks = 3; // number of blocks with properties to be overridden

   

    /* Names of blocks with properties to be overridden */

    String blocknames[] = {

        "name", "business_address", "business_city"

    };

   

    try {

        p = new pdflib();


        p.set_parameter("SearchPath", searchpath);


        /* This means we must check return values of load_font() etc. */

        p.set_parameter("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.2.4.1 $");

       

        /* Open a PDF containing blocks */

        indoc = p.open_pdi_document(infile, "");

        if (indoc == -1)

            throw new Exception("Error: " + p.get_errmsg());

       

        /* Open the first page */

        inpage = p.open_pdi_page(indoc, 1, "");

        if (inpage == -1)

            throw new Exception("Error: " + p.get_errmsg());

       

        /* Get the width and height of the imported page */

        width = p.pcos_get_number(indoc, "pages[0]/width");

        height = p.pcos_get_number(indoc, "pages[0]/height");

       

        /* Start the output page with the size given by the imported page */

        p.begin_page_ext(width, height, "");


        /* Place the imported page on the output page */

        p.fit_pdi_page(inpage, 0, 0, "");

       

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

       

        /* For three Text blocks on the first page, increase

         * the font size by 20%. Increase the size of the block rectangle by

         * a defined percentage and move the block down to prevent it from

         * overlapping with another block.

         */

        for (i = 0; i < blockcount; i++)

        {

            /* Get the name of the block */

            blockname = p.pcos_get_string(indoc,

                "pages[0]/blocks[" + i + "]/Name");

           

            /* Get the type of the block */

            blocktype = p.pcos_get_string(indoc,

                "pages[0]/blocks[" + i + "]/Subtype");

           

            for (j = 0; j < nblocks; j++) {

                if (blockname.equals(blocknames[j])) {

                    /* Check if it is a Text block */

                    if (blocktype.equals("Text"))

                    {

                    /* Get the font size of the block */

                    blockfontsize = p.pcos_get_number(indoc,

                        "pages[0]/blocks[" + i + "]/fontsize");

                       

                    /* Retrieve the rectangle coordinates of the block */

                    block_llx = (int) p.pcos_get_number(indoc,

                        "pages[0]/blocks[" + i + "]/Rect[0]");

                   

                    block_lly = (int) p.pcos_get_number(indoc,

                        "pages[0]/blocks[" + i + "]/Rect[1]");

                   

                    block_urx = (int) p.pcos_get_number(indoc,

                        "pages[0]/blocks[" + i + "]/Rect[2]");

                   

                    block_ury = (int) p.pcos_get_number(indoc,

                        "pages[0]/blocks[" + i + "]/Rect[3]");

                   

                    /* Increase the font size by the percentage defined */

                    newfontsize = blockfontsize * (percentage + 100) / 100;

                   

                    /* Specify the enlargement by the difference between the old

                     * and the new font size multiplied by an increment factor

                     */

                    enlarge = incrfactor * (newfontsize - blockfontsize);

                   

                    /* Increase the block rectangle by the enlargement

                     * specified. In addition, move the rectangle down by j

                     * times the enlargment to prevent the blocks from

                     * overlapping.

                     */

                    newblock_llx = block_llx;

                    newblock_lly = block_lly - (1 + j) * enlarge;

                    newblock_urx = block_urx + enlarge;

                    newblock_ury = block_ury - j * enlarge;

                   

                    text_optlist =

                        "fontname=Courier encoding=unicode fontsize=" +

                        newfontsize +

                        " refpoint={" + block_llx + " " + newblock_lly + "}" +

                        " boxsize={" + (newblock_urx - newblock_llx) + " " +

                        (newblock_ury - newblock_lly) + "}" +

                        " fillcolor={rgb 0 0.7 0}";

                   

                    if (p.fill_textblock(inpage, blockname, blockname,

                        text_optlist) == -1)

                        System.err.println("Warning: " + p.get_errmsg());

                    }

                    break;

                }

            }

        }

 

        p.end_page_ext("");


        p.close_pdi_page(inpage);


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

        } finally {

            if (p != null) {

                p.delete();

            }

        }

    }

}