エンコーディング 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();
}
}
}