Create a Type 3 font by cloning another font and adding a further glyph. We use encoding iso8859-9 (since unicode doesn't work well with 8-bit Type 3 fonts). 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 (0xDD in iso8859-9) and output text with that glyph. To construct the synthetic character use the auxiliary diacritical character "dotaccent" U+02D9 DOT ABOVE plus U+0049 LATIN CAPITAL LETTER I. Place "dotaccent" on auxiliary slot 0x90 which is unused in iso8859-9.
Download Java Code Show Output PDF
* Type 3 turkish character:
* Create a Type 3 font by cloning another font and adding a further glyph
*
* We use encoding iso8859-9 (since unicode doesn't work well with 8-bit Type 3
* fonts). 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
* (0xDD in iso8859-9) and output text with that glyph.
* To construct the synthetic character use the auxiliary diacritical character
* "dotaccent" U+02D9 DOT ABOVE plus U+0049 LATIN CAPITAL LETTER I.
* Place "dotaccent" on auxiliary slot 0x90 which is unused in iso8859-9.
*
* Required software: PDFlib/PDFlib+PDI/PPS 7
* Required data: none
*/
package com.pdflib.cookbook.pdflib.fonts;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
public class type3_turkish_character
{
public static void main (String argv[])
{
/* This is where the data files are. Adjust as necessary. */
String searchpath = "../input";
String outfile = "type3_turkish_character.pdf";
String title = "Type 3 Turkish Character";
pdflib p = null;
pdflib q = null;
double info;
int i, basefont, auxfont, newfont;
String glyphnames[] = new String[256];
double glyphwidths[] = new double [256];
try {
p = new pdflib();
p.set_parameter("SearchPath", searchpath);
/* This means we must check return values of load_font() etc. */
p.set_parameter("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.2.4.1 $");
/* Start page */
p.begin_page_ext(0, 0, "width=200 height=200");
/* -----------------------------
* Step 1: Construct an encoding
* -----------------------------
*/
/* Load an auxiliary font with the encoding of interest "iso8859-9" */
auxfont = p.load_font("Helvetica", "iso8859-9", "");
/* Fetch all glyph names for the encoding */
for (i = 0; i < 255; i++) {
info = p.info_font(auxfont, "glyphname", "code=" + i);
glyphnames[i] = p.get_parameter("string", info);
}
/* Add the auxiliary diacritical character "dotaccent" U+02D9 DOT ABOVE
* to the extended encoding to slot 0x90. This character will be used to
* construct the new glyph.
*/
glyphnames[0x90] = "dotaccent";
/* Construct an auxiliary encoding based on iso8859-9 and add all wanted
* glyph names
*/
for (i = 0; i < 255; i++)
p.encoding_set_char("iso8859-9-extended", i, glyphnames[i], 0);
/* --------------------------------------------------------------
* Step 2: Derive the glyph metrics by fetching the glyph widths;
* actually not required for monospaced fonts like Courier
* --------------------------------------------------------------
*/
/* To avoid the base font in the Output PDF perform the task with a
* scratch PDF document. Supply an empty file name to begin_document()
* to create the scratch file in memory.
*/
try {
q = new pdflib();
/* Set the errorpolicy to "exception". With this setting PDFlib
* functions will throw an exception if an error occurs
*/
q.set_parameter("errorpolicy", "exception");
q.begin_document("", "");
/* Load the base font with "iso8859-9" encoding.
*
* Note: Since the "iso8859-9-extended" encoding is not available in
* the scratch document context we use "iso8859-9". "iso8859-92" has
* .notdef at position 0x90, and glyphwidths[0x90] will contain the
* widths of .notdef. "iso8859-9-extended" has dotaccent at 0x90,
* and the corresponding width. However, since we don't use the
* width of the accent (only the width of the base character) it
* doesn't hurt; for other situations (different pair of combined
* characters) it could be relevant.
*/
basefont = q.load_font("Courier", "iso8859-9", "");
q.begin_page_ext(595, 842, "");
q.setfont(basefont, 1000);
for (i = 0; i < 255; i++)
glyphwidths[i] =
q.info_textline(String.valueOf((char) i), "width", "");
/* Set the glyph width of the synthetic glyph (0xDD) to the width
* of the 'T' character
*/
glyphwidths[0xDD] =
q.info_textline(String.valueOf('T'), "width", "");
q.end_page_ext("");
q.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");
throw (new Exception("Problem with scratch document; couldn't " +
"determine glyph metrics"));
} catch (Exception e) {
System.err.println(e.getMessage());
throw (new Exception("Problem with scratch document; couldn't " +
"determine glyph metrics"));
} finally {
if (q != null)
q.delete();
}
/* --------------------------------------------
* Step 3: Define the new font "CourierTurkish"
* --------------------------------------------
*/
basefont = p.load_font("Courier", "iso8859-9-extended", "");
if (basefont == -1)
throw new Exception("Error: " + p.get_errmsg());
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(".notdef", 600, 0, 0, 0, 0);
p.end_glyph();
/* Clone all available glyphs from the input font with the exception of
* any ".notdef" glyphs
*/
for (i = 0; i < 255; i++) {
if (glyphnames[i].equals(".notdef")) {
continue;
}
/* The bounding box must be large enough to contain the respective
* glyph. We are lazy and use the font bounding box as a safe
* estimate. Better create the bounding box too large than risk
* problems.
*/
p.begin_glyph(glyphnames[i], glyphwidths[i], -23, -250, 623, 805);
p.setfont(basefont, 1000);
/* Now for the crucial trick:
* Create a new glyph at position "0xDD" by combining the two
* existing glyphs "I" and "dotaccent". The name of the new glyph
* has already been set to "Idotaccent" above.
*/
if (i == 0xDD) {
/* Combine the "I" glyph... */
p.show_xy("I", 0, 0);
/* ...with the character at position 0x90 (which has been set
* to "dotaccent" above. Shift the accent upwards to nicely
* position it on top of the "I".
*/
p.show_xy(String.valueOf((char) 0x90), 0.0, 160.0);
}
else {
p.show_xy(String.valueOf((char) i), 0, 0);
}
p.end_glyph();
}
p.end_font();
/* ------------------------
* Step 4: Use the new font
* ------------------------
*/
/* With the Courier core font output "Istanbul" */
basefont = p.load_font("Courier", "iso8859-9", "");
if (basefont == -1)
throw new Exception("Error: " + p.get_errmsg());
p.fit_textline("Istanbul", 50, 140, "font=" + basefont + " fontsize=14");
/* With the new Type 3 font output "\335stanbul" with "\335" being the
* octal representation of the "Idotaccent" glyph (0xDD) defined above
*/
newfont = p.load_font("CourierTurkish", "iso8859-9", "");
if (newfont == -1)
throw new Exception("Error: " + p.get_errmsg());
p.fit_textline("\335stanbul", 50, 100, "font=" + newfont +
" fontsize=14 charref");
/* 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();
}
}
}