PDFlib

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

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

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

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

Type 3 トルコ文字

PDFlib で、他のフォントからクローニングによって Type 3 フォントを作成し、グリフを追加するサンプルプログラムです。

エンコーディング iso8859-9 (Unicode では、8 ビット Type 3 フォントが働かないので) を使用します。"Courier" フォントをベースとする「CourierTurkish」という Type 3 フォントを作成します。合成グリフ U+0130 大文字 I の上部のないもの(iso885909 では 0xDD)を追加し、そのグリフでテキストを出力します。合成文字は、補助区分に有効な文字「dotaccent」U+02D9 上部のドットに大文字 I U+0049 を加えたものを使います。iso8859-9 で使用されない 0x90 補助スロットに「dotaccent」を配置します。


/*
 * $Id: type3_turkish_character.java,v 1.9 2013/02/20 10:35:48 stm Exp $
 * 
 * Type 3 turkish character:
 * Create a Type 3 font by using another font to create a new glyph from a
 * combination of two glyphs. Use this font as a fallback font.
 *
 * Create a Type 3 font "CourierTurkish" on the basis of the core font
 * "Courier".
 * Add the synthetic glyph U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
 * and output text with that glyph.
 * To construct the synthetic character use the auxiliary diacritical character
 * U+02D9 DOT ABOVE plus U+0049 LATIN CAPITAL LETTER I.
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 9
 * Required data: none
 */
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;

public class type3_turkish_character {
    public static void main(String argv[]) {
        String outfile = "type3_turkish_character.pdf";
        String title = "Type 3 Turkish Character";

        pdflib p = null;

        try {
            final double fontsize = 14;
            
            p = new pdflib();

            /* 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.9 $");

            /* Start page */
            p.begin_page_ext(0, 0, "width=200 height=200");

            /*
             * --------------------------------------------
             * Step 1: Define the new font "CourierTurkish"
             * --------------------------------------------
             */
            
            /* Load the font from which the glyphs will be taken for creating
             * the glyph for U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE. 
             */
            int basefont = p.load_font("Courier", "unicode", "");
            if (basefont == -1)
                throw new Exception("Error: " + p.get_errmsg());
            
            /*
             * Base the width of the new glyph on the width of the similar
             * character 'I', but any character could be used in this example
             * as Courier is a monospace font. Set the font size to 1000 because
             * the new font uses a 1000x1000 coordinate system.
             */
            double glyphwidth = p.info_textline("I", "width",
                            "font=" + basefont + " fontsize=1000");

            p.begin_font("CourierTurkish",
                                0.001, 0.0, 0.0, 0.001, 0.0, 0.0, "");

            /* .notdef is required; the width of .notdef does not really
             * matter
             */
            p.begin_glyph_ext(0x0000, "width=600");
            p.end_glyph();
            
            /*
             * The bounding box must be large enough to contain the
             * respective glyph. Better create the bounding box too large
             * than risk problems.
             */
            p.begin_glyph_ext(0x0130, "width=" + glyphwidth + " "
                        + "boundingbox={0 -250  600 800} "
                        + "glyphname=Idottaccent");
            p.setfont(basefont, 1000);

            /*
             * Now for the crucial trick: Create a new glyph by combining
             * the two existing glyphs "I" ...
             */
            p.fit_textline("I", 0, 0, "");

            /*
             * ... and U+02D9 DOT ABOVE. Shift the accent upwards to
             * nicely position it on top of the "I".
             */
            p.fit_textline("\u02d9", 0.0, 160.0, "");
            p.end_glyph();

            p.end_font();

            /*
             * ------------------------
             * Step 2: Use the new font
             * ------------------------
             */

            /*
             * Load the Courier font, now with the "CourierTurkish" Type 3
             * font as fallback font.
             */
            basefont = p.load_font("Courier", "unicode",
                "fallbackfonts={{fontname=CourierTurkish encoding=unicode}}");
            if (basefont == -1)
                throw new Exception("Error: " + p.get_errmsg());

            /* Output "Istanbul" */
            p.fit_textline("Istanbul", 50, 140, "font=" + basefont
                + " fontsize=" + fontsize);

            /* Output U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE and
             * "stanbul".
             */
            p.fit_textline("\u0130stanbul", 50, 100, "font=" + basefont
                + " fontsize=" + fontsize);

            /* Finish page */
            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();
        }
    }
}
(Apr 3, 2007 - Feb 20, 2014)