PDFlib

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

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

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

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

様々なコンテンツを含むテーブル

セル内に以下のようなコンテンツを含むテーブルを作成します。

  • 複数列にまたがるセルに背景色付きの一行テキスト
  • 複数行にまたがるセルに複数行テキストを配置
  • 複数行にまたがるセルに画像と一行テキストを配置

それぞれ PDF_add_table_cell() のオプションである fittextline、fittextflow、image オプションに値やハンドルを渡すことで、セル内に配置することができます。

必要な製品:PDFlib または PDFlib+PDI または PPS


/*
 * 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 9
 * 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";
    int exitcode = 0;
    
    /* 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_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 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.println("PDFlib exception occurred:");

        exitcode = 1;
        } catch (Exception e) {
            System.err.println(e);
        exitcode = 1;
        } finally {
            if (p != null) {
                p.delete();
            }
        System.exit(exitcode);
        }
    }
}
(Sep 18, 2013 - Oct 23, 2022)