PDFlib

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

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

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

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

テーブル行の高さを指定

PDFlib ではテーブルの行毎に高さを指定できます。高さを指定しない場合、行内の内容などから PDFlib が高さを算出します。

下記のサンプルプログラムでは、1 ページ毎に以下のように高さを指定しています。

  1. すべての行で高さを指定しない場合
    テーブルの高さに合わせて各行で均等に高さが設定されます。
  2. すべての行に rowheight=1 (高さの最小単位) を指定した場合
    行毎の内容に合わせた最小の高さが設定されます。テーブルの高さに満たない部分は空欄になります。
  3. 行毎にパーセントで rowheight を指定した場合
    テーブルの高さに対する割合で高さが設定されます。
  4. 行毎にポイントで rowheight を指定した場合
    指定した高さが設定されます。テーブルの高さに満たない部分は空欄になります。

/*
 * 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;
    int exitcode = 0;
    
    /* 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);
        
        /* 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("NotoSerif-Bold", "unicode", "");
        if (boldfont == -1)
            throw new Exception("Error: " + p.get_errmsg());
        
        normalfont = p.load_font("NotoSerif-Regular", "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 " + (int)(tab_urx - tab_llx) +  
        " x " + (int)(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 " + (int)(tab_urx - tab_llx) +
        " x " + (int)(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 " + (int)(tab_urx - tab_llx) +
        " x " + (int)(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 " + (int)(tab_urx - tab_llx) + 
        " x " + (int)(tab_ury - tab_lly), x, ytext, "");
        
        ytext -= yoff;
        p.fit_textline("For the first row rowheight=" + (int)rowheight1 + 
        " is defined", x, ytext, "");
        ytext -= yoff;
        p.fit_textline("For the second row rowheight="  + (int)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.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.toString());
        exitcode = 1;
        } finally {
            if (p != null) {
                p.delete();
            }
        System.exit(exitcode);
        }
    }
}
(Sep 18, 2013 - May 23, 2019)