PDFlib Cookbook

cookbook

table/table_row_height

Download Java Code        Switch to PHP Code      Show Output PDF

/* $Id: table_row_height.java,v 1.6 2013/01/15 10:12:07 stm Exp $
 * Table row height:
 * Define the height of the rows in a table
 * 
 * Demonstrate how to use the "rowheight" option of add_table_cell() to 
 * define the height of the rows in a table.
 * 
 * Required software: PDFlib/PDFlib+PDI/PPS 9
 * Required data: image file
 */
package com.pdflib.cookbook.pdflib.table;

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

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

    pdflib p = null;
    String celloptlist, imgoptlist, taboptlist;
    int tbl = -1;
    String result;
    
    /* Image files and handles*/
    int image1, image2;
    final String imagefile1 = "new.jpg";
    final String imagefile2 = "new.jpg";
    
    /* Text handles */
    int tf1 = -1, tf2 = -1; 
    
    /* x and y coordinates for the output of descriptive text */
    int ystart = 800;
    int ytext = ystart;
    int yoff = 15;
    int x = 20;
    
    /* Font handles and sizes */
    int normalfont, boldfont;
    int fontsize = 14;
    
    /* 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. 
     */
    double tab_llx = 100, tab_lly = 200, tab_urx = 450, tab_ury = 600;
    
    double rowheight1 = (tab_ury - tab_lly) / 2;
    double rowheight2 = (tab_ury - tab_lly) / 4;
    
    /* Textflows. Soft hyphens are marked with the character reference "­"
     * (character references are enabled by the "charref" option). */
    String tftext1 = 
        "Long Distance Glider: With this paper rocket you can send all your " +
        "messages even when sitting in a hall or in the cinema pretty near " +
        "the back.";
    
    String tftext2 =
        "Giant Wing: An unbeliev­able sailplane! It is amaz­ingly " +
        "robust and can even do aerobatics.";
    
   
    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.6 $");
        
        /* Load two images */
        image1 = p.load_image("auto", imagefile1, "");
        if (image1 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        image2 = p.load_image("auto", imagefile2, "");
        if (image2 == -1)
            throw new Exception("Error: " + p.get_errmsg());

        /* 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());
        
        final String tfoptlist = "font=" + normalfont + " fontsize=" + 
            fontsize + " leading=110% charref";

        
        /* ---------------------------------------------------------------------
         * First case:
         * Create and fit a table containing two rows. The table width and 
         * height are given but no row height is defined. The row height will
         * be calculated automatically as a half, a third, a quarter etc. of the
         * table height, depending of the number of rows available. This means
         * that each row will always have the same size.
         * ---------------------------------------------------------------------
         */
        p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
        
        /* In the first column of the first row, add a table cell containing a
         * Textflow
         */
        
        /* In the first column of the first row, add an image cell */
        imgoptlist = "image=" + image1;
        tbl = p.add_table_cell(tbl, 1, 1, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf1 = p.add_textflow(-1, tftext1, tfoptlist);
        if (tf1 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the first row, add a Textflow table cell */
        celloptlist = "textflow=" + tf1;
        tbl = p.add_table_cell(tbl, 2, 1, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the first column of the second row, add an image cell */
        imgoptlist = "image=" + image2;
        tbl = p.add_table_cell(tbl, 1, 2, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf2 = p.add_textflow(-1, tftext2, tfoptlist);
        if (tf2 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the second row, add a Textflow table cell */
        celloptlist = "textflow=" + tf2;
        tbl = p.add_table_cell(tbl, 2, 2, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Set the stroke color which is used for testing to illustrate the
         * borders of the table fitbox with the "showborder" option below
         */
        p.setcolor("stroke", "rgb", 1.0, 0.5, 0.0, 0.0);
        
        /* Fit the table
         * 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.
         * "showborder" is only used for testing to illustrate the borders of
         * the table fitbox.
         */
        taboptlist = 
            "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}" +
            " showborder";
        
        result = p.fit_table(tbl, tab_llx, tab_lly, tab_urx, tab_ury, 
            taboptlist);
        
        /* 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 */
        	}
        }
        
        /* Output some descriptive text */
        p.setfont(boldfont, 14);
        p.fit_textline("Table size is defined as " + (tab_urx - tab_llx) +  
            " x " + (tab_ury - tab_lly), x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("No row height is defined", x, ytext, "");
        
        ytext -= 2 * yoff;
        p.fit_textline("Result:", x, ytext, "");
        ytext -= yoff;
        p.fit_textline("Row height will be calculated automatically",
            x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("With two rows available it will be half of the table " +
            "height", x, ytext, "");
        ytext -= yoff;
        p.fit_textline("(with three rows it will be a third of the table " +
            "height, etc.)", x, ytext, "");
        ytext -= yoff;
        p.fit_textline("As a result each row will have the same height", 
            x, ytext, "");
        
        p.end_page_ext("");
        
        
        /* ----------------------------------------------------------------
         * Second case:
         * Create and fit a table containing two rows. The table width and 
         * height are given. The row height of each row is set to a minimum
         * height of 1. In this case, the row height is calculated as it is 
         * needed to fit the object completely. 
         * ----------------------------------------------------------------
         */
        p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
        ytext = ystart;
        tf1 = -1;
        tf2 = -1;
        tbl = -1;
        
        /* In the first column of the first row, add an image cell */
        imgoptlist = "image=" + image1;
        tbl = p.add_table_cell(tbl, 1, 1, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf1 = p.add_textflow(-1, tftext1, tfoptlist);
        if (tf1 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the first row, add a Textflow table cell.
         * Use the "rowheight" option to set the minimum row height to 1. The
         * row height will be increased automatically as the object needs more
         * space to be fit completely.
         */
        celloptlist = "textflow=" + tf1 + " rowheight=1";
        tbl = p.add_table_cell(tbl, 2, 1, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the first column of the second row, add an image cell */
        imgoptlist = "image=" + image2;
        tbl = p.add_table_cell(tbl, 1, 2, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf2 = p.add_textflow(-1, tftext2, tfoptlist);
        if (tf2 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the second row, add a Textflow table cell.
         * Use the "rowheight" option to set the minimum row height to 1. The
         * row height will be increased automatically as the object needs more
         * space to be fit completely.
         */
        celloptlist = "textflow=" + tf2 + " rowheight=1";
        tbl = p.add_table_cell(tbl, 2, 2, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Set the stroke color which is used for testing to illustrate the
         * borders of the table fitbos with the "showborder" option below
         */
        p.setcolor("stroke", "rgb", 1.0, 0.5, 0.0, 0.0);
        
        /* Fit the table
         * 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.
         * "showborder" is only used for testing to illustrate the borders of
         * the table fitbox.
         */
        taboptlist = 
            "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}" +
            " showborder";
        
        result = p.fit_table(tbl, tab_llx, tab_lly, tab_urx, tab_ury, 
            taboptlist);
        
        /* 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 */
            }
        }
        
        /* Output some descriptive text */
        p.setfont(boldfont, 14);
        p.fit_textline("Table size is defined as " + (tab_urx - tab_llx) +
            " x " + (tab_ury - tab_lly), x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("For the first row rowheight=1 is defined", 
            x, ytext, "");
        ytext -= yoff;
        p.fit_textline("For the second row rowheight=1 is defined",
            x, ytext, "");
        
        ytext -= 2 * yoff;
        p.fit_textline("Result:", x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("rowheight=1 defines the minimum height of the row. " +
            "The height will ", x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("be increased automatically as the object needs more " +
            "space to be fit", x, ytext, "");
              
        p.end_page_ext("");
        
        
        /* ---------------------------------------------------------------------
         * Third case:
         * Create and fit a table containing two rows. The table width and 
         * height are given. The row height of each row is defined as percentage 
         * of the overall table height.
         * ---------------------------------------------------------------------
         */
        p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
        ytext = ystart;
        tf1 = -1;
        tf2 = -1;
        tbl = -1;
        
        /* In the first column of the first row, add an image cell */
        imgoptlist = "image=" + image1;
        tbl = p.add_table_cell(tbl, 1, 1, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf1 = p.add_textflow(-1, tftext1, tfoptlist);
        if (tf1 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the first row, add a Textflow table cell */
        celloptlist = "textflow=" + tf1 + " rowheight=70%";
        tbl = p.add_table_cell(tbl, 2, 1, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the first column of the second row, add an image cell */
        imgoptlist = "image=" + image2;
        tbl = p.add_table_cell(tbl, 1, 2, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf2 = p.add_textflow(-1, tftext2, tfoptlist);
        if (tf2 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the second row, add a Textflow table cell */
        celloptlist = "textflow=" + tf2 + " rowheight=30%";
        tbl = p.add_table_cell(tbl, 2, 2, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Set the stroke color which is used for testing to illustrate the
         * borders of the table fitbos with the "showborder" option below
         */
        p.setcolor("stroke", "rgb", 1.0, 0.5, 0.0, 0.0);
        
        /* Fit the table
         * 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.
         * "showborder" is only used for testing to illustrate the borders of
         * the table fitbox.
         */
        taboptlist = 
            "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}" +
            " showborder";
        
        result = p.fit_table(tbl, tab_llx, tab_lly, tab_urx, tab_ury, 
            taboptlist);
        
        /* 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 */
            }
        }
        
        /* Output some descriptive text */
        p.setfont(boldfont, 14);
        p.fit_textline("Table size is defined as " + (tab_urx - tab_llx) +
            " x " + (tab_ury - tab_lly), x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("For the first row rowheight=70% is defined",
            x, ytext, "");
        ytext -= yoff;
        p.fit_textline("For the second row rowheight=30% is defined",
            x, ytext, "");
        
        ytext -= 2 * yoff;
        p.fit_textline("Result:", x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("The height of the first row will be 70% of " +
            "the table height", x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("The height of the second row will be 30% of the table" +
            " height", x, ytext, "");
              
        p.end_page_ext("");
        
        
        /* -------------------------------------------------------------------
         * Fourth case:
         * Create and fit a table containing two rows. The table width and 
         * height are given. The row height of each row is defined as a fixed 
         * value.
         * -------------------------------------------------------------------
         */
        p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
        ytext = ystart;
        tf1 = -1;
        tf2 = -1;
        tbl = -1;
        
        /* In the first column of the first row, add an image cell */
        imgoptlist = "image=" + image1;
        tbl = p.add_table_cell(tbl, 1, 1, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf1 = p.add_textflow(-1, tftext1, tfoptlist);
        if (tf1 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the first row, add a Textflow table cell */
        celloptlist = "textflow=" + tf1 + " rowheight=" + rowheight1;
        tbl = p.add_table_cell(tbl, 2, 1, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the first column of the second row, add an image cell */
        imgoptlist = "image=" + image2;
        tbl = p.add_table_cell(tbl, 1, 2, "", imgoptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Add the Textflow to be placed in the table cell */
        tf2 = p.add_textflow(-1, tftext2, tfoptlist);
        if (tf2 == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* In the second column of the second row, add a Textflow table cell */
        celloptlist = "textflow=" + tf2 + " rowheight=" + rowheight2;
        tbl = p.add_table_cell(tbl, 2, 2, "", celloptlist);
        if (tbl == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        /* Set the stroke color which is used for testing to illustrate the
         * borders of the table fitbos with the "showborder" option below
         */
        p.setcolor("stroke", "rgb", 1.0, 0.5, 0.0, 0.0);
        
        /* Fit the table
         * 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.
         * "showborder" is only used for testing to illustrate the borders of
         * the table fitbox.
         */
        taboptlist = 
            "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}" +
            " showborder";
        
        result = p.fit_table(tbl, tab_llx, tab_lly, tab_urx, tab_ury, 
            taboptlist);
        
        /* 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 */
            }
        }
        
        /* Output some descriptive text */
        p.setfont(boldfont, 14);
        p.fit_textline("Table size is given as " + (tab_urx - tab_llx) + 
            " x " + (tab_ury - tab_lly), x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("For the first row rowheight=" + rowheight1 + 
            " is defined", x, ytext, "");
        ytext -= yoff;
        p.fit_textline("For the second row rowheight="  + rowheight2 +
            " is defined", x, ytext, "");
        
        ytext -= 2 * yoff;
        p.fit_textline("Result:", x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("rowheight defines the minimum row height. Since the " +
            "objects need less space it ", x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("does not have to be increased. Parts of the table " +
            "fitbox will be left empty", x, ytext, "");
              
        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.toString());
        } finally {
            if (p != null) {
                p.delete();
            }
        }
    }
}