PDFlib

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

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

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

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

背景色上のテキスト

PDFlib で、背景に色を持つテキスト行とテキストフローを、配置するサンプルプログラムです。

info_textline 関数で取得したテキストの寸法を使用して、塗りつぶした矩形を作成し、その上にテキストを配置します。

または、fit_textline、fit_textflow 関数で、matchbox オプションを使用し、背景の範囲枠を設定して塗りつぶし、その上にテキストの配置を行います。matchbox オプションでは、背景枠とテキストの間の余白を指定することができます。

必要な製品 : PDFlib/PDFlib+PDI/PPS


/*
 * 背景色上のテキスト :
 * 背景に色をもつテキスト行とテキストフローを配置する
 *
 * 背景に色を持つテキスト行を配置します。info_textline()を使用し、テキスト行の
 * サイズを取得します。
 * テキスト行を配置するのに、"matchbox" オプションを使えば、より多彩な方法でテキ
 * ストを配置できます。背景色で塗られた上にテキストフローを表示することもできます。
 *
 * 必要な製品 : PDFlib/PDFlib+PDI/PPS 9
 * 必要なデータ : 無し
 */
package com.pdflib.cookbook.pdflib.textflow;

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

public class text_on_color {
    public static void main(String argv[]) {
        /* 必要に応じてデータファイルがあるフォルダのパスを指定する */
        String searchpath = "../input";
        String outfile = "text_on_color.pdf";
        String title = "Text on colored Background";

        pdflib p = null;
        int font, tf = -1, x = 50, y;
        String result, optlist;
        double width, height;
        int exitcode = 0;

        String textline = "Giant Wing Paper Plane";

        String textflow = 
            "To fold the famous rocket looper proceed as follows:\nTake a A4 "
            + "sheet. Fold it lenghtwise in the middle. Then, fold the upper "
            + "corners down. Fold the long sides inwards that the points A "
            + "and B meet on the central fold. Fold the points C and D that "
            + "the upper corners meet with the central fold as well. Fold the "
            + "plane in the middle. Fold the wings down that they close with "
            + "the lower border of the plane.";

        try {
            p = new pdflib();

            p.set_option("searchpath={" + searchpath + "}");

            /* load_font() 等でエラーが起きた場合、-1を返す */
            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);

            /* 出力文書を開く */
            p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

            /* フォントをロードする */
            font = p.load_font("Helvetica", "unicode", "");

            if (font == -1)
                throw new Exception("Error: " + p.get_errmsg());

            /* --------- テキストラインを使用した出力方法 I -------- */

            /*
             * info_textline()よりテキストのデフォルトの幅と高さを取得し、背景色の上に
             * テキストを配置する。
             * フォントのデフォルトの高さは、キャップハイトを用いる。
             * 他のフォントプロパティを使用する場合は、 "matchbox"オプションを使用する。
             */
            optlist = "font=" + font + " fontsize=40 " + "fillcolor={gray 1}";
            width = p.info_textline(textline, "width", optlist);
            height = p.info_textline(textline, "height", optlist);

            /* 取得した幅と高さで、矩形を描き、塗りつぶす */
            p.setcolor("fill", "rgb", 0.0, 0.8, 0.8, 0);
            p.rect(x, 700, width, height);
            p.fill();

            /* 矩形の上にテキストを配置する */
            p.fit_textline(textline, x, 700, optlist);

            /* --------- テキストラインを使用した出力方法 II -------- */

            /*
             * fit_textline で塗りつぶした矩形の背景にテキストを配置する。
             * "matchbox" オプションは、背景の矩形を作成するために使用する。
             * マッチボックスの高さは"boxheight"で指定する。
             * また、"offsetbottom" "offsettop"は上部と下部からの余白を追加し、
             * "offsetleft"と"offsetright"では、テキストの右端、左端からの余白を
             * 定義する。
             */
            optlist = "font=" + font + " fontsize=40 fillcolor={gray 1} "
                + "matchbox={fillcolor={rgb 0 0.8 0.8} "
                + "boxheight={ascender descender}}";

            /* テキストを配置する */
            p.fit_textline(textline, x, 600, optlist);

            /*
             * マッチボックスの上部と下部に余白を追加するには "offsetbottom" 
             * "offsettop"を指定する。
             * 左右に余白を追加するには "offsetleft" と "offsetright" をそれぞれ
             * 指定する
             */
            optlist = "font=" + font + " fontsize=40 fillcolor={gray 1} "
                + "matchbox={fillcolor={rgb 0 0.8 0.8} "
                + "boxheight={ascender descender} "
                + "offsetleft=-8 offsetright=8 offsettop=8 offsetbottom=-8}";

            /* テキストラインを配置する */
            p.fit_textline(textline, x, 500, optlist);

            /* --------- テキストフローで、塗りつぶした背景色の上にテキストを出力 -------- */

            /*
             * テキストフローで緑の矩形の背景を作成する。
             * 背景はマッチボックスで作成する。
             */
            optlist = "font=" + font + " fontsize=20 fillcolor={gray 1}";

            tf = p.add_textflow(tf, textflow, optlist);
            if (tf == -1)
                throw new Exception("Error: " + p.get_errmsg());

            /* 矩形の高さ */
            y = 430;

            /* 矩形の幅 */
            width = 500;

            /*
             * テキストフローを使用し、マッチボックスの背景を塗りつぶす。
             */
            result = p.fit_textflow(tf, x, 0, x + width, y,
                "matchbox={fillcolor={rgb 0.0 0.8 0.8}}");
            if (!result.equals("_stop")) {
                /* エラーかどうか、または、まだ配置すべきテキストが残って
                 * いるかをチェック
                 */
            }

            /* テキスト全体の外接枠の高さ */
            height = p.info_textflow(tf, "textheight");

            /*
             * 次に表示する矩形は、テキストの高さも含めて、垂直に下方向に移動
             * するため、y座標を以下の通り設定する
             */
            y -= height + 50;

            /*
             * 再度、fit_textflowを呼び出し、margin を指定し、マッチボックスの
             * 上下左右の余白を追加する。"rewind=1" で、fit_textflow( ) を最初
             * に呼び出した時の前の状態へ戻す。
             */
            result = p.fit_textflow(tf, x, 0, x + width, y,
                "rewind=1 matchbox={margin=-10 fillcolor={rgb 0.0 0.8 0.8}}");
            if (!result.equals("_stop")) {
                /* エラーかどうか、または、まだ配置すべきテキストが残っているか
                 * をチェック
                 */
            }

            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);
        }
    }
}
(Apr 3, 2007 - May 23, 2019)