PDFlib
KAUFEN
PDFlib

table/mixed_table_contents

Demonstrate how to place various kinds of contents in table cells spanning one or more columns or rows. Create a table with various kinds of contents.
Place a text line spanning several columns and colorize the background of the cell.
Place a text line and a Textflow in two neighbour cells of the same row and vertically align them so that they have the same distance from the left and upper cell borders.
Place an image in a cell spanning several rows and place a text line on top of it in the same cell.

Download Java Code      Show Output PDF

/* $Id: mixed_table_contents.java,v 1.5 2008/02/14 17:30:32 katja Exp $

 * Mixed table contents:

 * Demonstrate how to place various kinds of contents in table cells spanning

 * one or more columns or rows

 *

 * Create a table with various kinds of contents.

 * Place a text line spanning several columns and colorize the background of the

 * cell.

 * Place a text line and a Textflow in two neighbour cells of the same row and

 * vertically align them so that they have the same distance from the left and

 * upper cell borders.

 * Place an image in a cell spanning several rows and place a text line on top

 * of it in the same cell.

 *

 * Required software: PDFlib/PDFlib+PDI/PPS 7

 * Required data: image file

 */

package com.pdflib.cookbook.pdflib.table;


import com.pdflib.pdflib;

import com.pdflib.PDFlibException;


public class mixed_table_contents

{

    public static void main (String argv[])

    {

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

    String searchpath = "../input";

    String outfile = "mixed_table_contents.pdf";

    String title = "Mixed Table Contents";


    pdflib p = null;

    int normalfont, boldfont, image, tf=-1, tbl=-1;

    String tftext, result, optlist;

    String imagefile = "kraxi_logo.tif";

   

    /* Width of the first, second, and third column of the table */

    final int c1 = 50, c2 = 120, c3 = 90;

   

    /* Coordinates of the lower left and upper right corners of the table

     * fitbox. The width of the fitbox matches the sum of the widths of the

     * three table columns.

     */

    final double llx = 100, lly = 500, urx = 360, ury = 600;

   

    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.5 $");


        /* Load the font */

        boldfont = p.load_font("Helvetica-Bold", "unicode", "");

        if (boldfont == -1)

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

       

        normalfont = p.load_font("Helvetica", "unicode", "");

        if (normalfont == -1)

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


        p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

               

       

        /* ---------------------

         * Adding the first cell

         * ---------------------

         *

         * The cell will be placed in the first column of the first row and will

         * span three columns.

         * The first column has a width of 50 points.

         * The text line is centered vertically and horizontally, with a margin

         * of 4 points from all borders.

         */

        optlist = "fittextline={font=" + boldfont + " fontsize=12" +

            " position=center} margin=4 colspan=3 colwidth=" + c1;


        tbl = p.add_table_cell(tbl, 1, 1, "Our Paper Plane Models", optlist);

        if (tbl == -1)

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

 

       

        /* -------------------------------------------

         * Adding the second cell spanning two columns

         * -------------------------------------------

         *

         * The cell is placed in the first column of the second row and spans

         * two columns.

         * The first column has a width of 50 points.

         * The row height is 14 points.

         * The text line is horizontally positioned on the left and vertically

         * centered, with a margin of 4 points from all borders.

         * Since we want to vertically align text lines and a Textflow we would

         * like to have an exact font size of 8 but using the option

         * "fontsize=8" does not exactly represent the letter height but adds

         * some space below and above. However, the height of an uppercase

         * letter is exactly represented by the capheight value of the font. For

         * this reason use "fontsize={capheight=6}" which will approximately

         * result in a font size of 8 points and (along with "margin=4"), will

         * sum up to an overall height of 14 points corresponding to the

         * "rowheight" option.

         * Since the cell doesn't cover a complete row but only two of

         * three columns it cannot be filled with color using on of the

         * row-based shading options. We apply the Matchbox feature instead to

         * fill the rectangle covered by the cell with a gray background color.

         */

        optlist = "fittextline={position={left top} font=" + boldfont +

            " fontsize={capheight=6}} rowheight=14 colwidth=" + c1 +

            " margin=4 colspan=2 matchbox={fillcolor={gray .92}}";

       

        tbl = p.add_table_cell(tbl, 1, 2, "1  Giant Wing", optlist);

        if (tbl == -1)

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

       

       

        /* ---------------------------------

         * Adding three more text line cells

         * ---------------------------------

         *

         * Add two more text lines in the first column of the third row as well

         * as in the first column of the fourth row. For a description of the

         * options see above,

         */

        optlist = "fittextline={position={left top} font=" + normalfont +

            " fontsize={capheight=6}} rowheight=14 colwidth=" + c1 +

            " margin=4";

       

        tbl = p.add_table_cell(tbl, 1, 3, "Material", optlist);

        if (tbl == -1)

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


        tbl = p.add_table_cell(tbl, 1, 4, "Benefit", optlist);

        if (tbl == -1)

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

       

        /* Add another text line in the second column of the third row with a

         * column width of 120. For a description of the options see above.

         */

        optlist = "fittextline={position={left top} font=" + normalfont +

            " fontsize={capheight=6}} rowheight=14 colwidth=" + c2 +

            " margin=4";


        tbl = p.add_table_cell(tbl, 2, 3, "Offset print paper 220g/sqm",

            optlist);

        if (tbl == -1)

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

       

       

        /* ------------------------

         * Adding the Textflow cell

         * ------------------------

         *

         */

        tftext =

                "It is amazingly robust and can even do aerobatics. " +

                "But it is best suited to gliding.";

       

        /* Prepare the option list for adding the Textflow

         *

         * Use "fontsize={capheight=6}" which will approximately result in a

         * font size of 8 points and (along with "margin=4"), will sum up to an

         * overall height of 14 points as for the text lines above.

         */

        optlist = "font=" + normalfont + " fontsize={capheight=6} leading=110%";

       

        /* Add the Textflow to be placed in a table cell later */

        tf = p.add_textflow(-1, tftext, optlist);

        if (tf == -1)

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

       

        /* Prepare the option list for adding the Textflow table cell

         *

         * The first line of the Textflow should be aligned with the baseline of

         * the "Benefit" text line. At the same time, the "Benefit" text should

         * have the same distance from the top cell border as the "Material"

         * text. To avoid any space from the top add the Textflow cell using

         * "fittextflow={firstlinedist=capheight}". Then add a margin of 4

         * points, the same as for the text lines.

         */

        optlist = "textflow=" + tf + " fittextflow={firstlinedist=capheight} " +

            "colwidth=" + c2 + " margin=4";


        tbl = p.add_table_cell(tbl, 2, 4, "", optlist);

        if (tbl == -1)

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

       

       

        /* -----------------------------------

         * Add the image cell with a text line

         * -----------------------------------

         *

         * The image is placed in a cell starting in the third column of the

         * second row and spans three rows.

         * The column width is 90 points. The cell margins are set to 4 points.

         */

        image = p.load_image("auto", imagefile, "");

        if (image == -1)

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


        optlist = "fittextline={font=" + boldfont + " fontsize=9} image=" +

            image +     " colwidth=" + c3 + " rowspan=3 margin=4";


        tbl = p.add_table_cell(tbl, 3, 2, "Amazingly robust!", optlist);

        if (tbl == -1)

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

       

       

        /* -------------

         * Fit the table

         * -------------

         *

         * Using "header=1" the table header will include the first line.

         * The "fill" option and the suboptions "area=header" and

         * "fillcolor={rgb 0.8 0.8 0.87}" specify the header row(s) to be filled

         * with the supplied color.

         * The "stroke" option and the suboptions "line=frame linewidth=0.8"

         * define the ruling of the table frame with a line width of 0.8.

         * Using "line=other linewidth=0.3" the ruling of all cells is specified

         * with a line width of 0.3.

         */

        optlist = "header=1 fill={{area=header fillcolor={rgb 0.8 0.8 0.87}}}" +

            " stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}";

       

        result = p.fit_table(tbl, llx, lly, urx, ury, optlist);

       

        /* Check the result; "_stop" means all is ok */

        if (!result.equals("_stop")) {

                if (result.equals( "_error"))

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

                else {

                        /* Other return values require dedicated code to deal with */

                }

        }

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

            }

        }

    }

}