Starter sample for fallback fonts
Download PHP Code Switch to Java Code Show Output PDF
/* $Id: starter_fallback.php,v 1.3 2012/05/03 14:00:38 stm Exp $
* Starter sample for fallback fonts
*
* Required software: PDFlib/PDFlib+PDI/PPS 8
* Required data: suitable fonts, Japanese CMaps
*/
/* This is where the data files are. Adjust as necessary. */
$searchpath = dirname(dirname(dirname(__FILE__)))."/input";
$outfile = "";
$llx = 50; $lly = 50; $urx = 800; $ury = 550;
$headers = array( "Use case",
"Option list for the 'fallbackfonts' option", "Base font",
"With fallback font" );
class testcase {
public function testcase($usecase, $fontname, $encoding,
$fallbackoptions, $text) {
$this->usecase = $usecase;
$this->fontname = $fontname;
$this->encoding = $encoding;
$this->fallbackoptions = $fallbackoptions;
$this->text = $text;
}
public $usecase;
public $fontname;
public $encoding;
public $fallbackoptions;
public $text;
}
$testcases = array(
/* Add Euro glyph to an encoding which doesn't support it */
new testcase(
"Extend 8-bit encoding", "Helvetica", "iso8859-1",
"{fontname=Helvetica encoding=unicode forcechars=euro}",
/*
* Reference Euro glyph by name (since it is missing from
* the encoding)
*/
"123€"),
new testcase(
"Use Euro glyph from another font",
"Courier",
"winansi",
"{fontname=Helvetica encoding=unicode forcechars=euro textrise=-5%}",
"123€"),
new testcase("Enlarge all glyphs in a font", "Times-Italic",
"winansi",
/*
* Enlarge all glyphs to better match other fonts of the
* same point size
*/
"{fontname=Times-Italic encoding=unicode forcechars={U+0020-U+00FF} "
. "fontsize=120%}", "font size"),
new testcase(
"Add enlarged pictogram", "Times-Roman", "unicode",
/* pointing hand pictogram */
"{fontname=ZapfDingbats encoding=unicode forcechars=.a12 fontsize=150% "
. "textrise=-15%}", "Bullet symbol: &.a12;"),
new testcase(
"Add enlarged symbol glyph",
"Times-Roman",
"unicode",
"{fontname=Symbol encoding=unicode forcechars=U+2663 fontsize=125%}",
"Club symbol: ♣"),
/*
* Greek characters missing in the font will be pulled from Symbol
* font
*/
new testcase(
"Add Greek characters to Latin font", "Times-Roman",
"unicode", "{fontname=Symbol encoding=unicode}",
"Greek text: ΛΟΓΟΣ"),
/* Font with end-user defined character (EUDC) */
new testcase(
"Gaiji with EUDC font", "KozMinProVI-Regular",
"unicode",
"{fontname=EUDC encoding=unicode forcechars=U+E000 fontsize=140% "
. "textrise=-20%}", "Gaiji: "),
/* SING fontlet containing a single gaiji character */
new testcase(
"Gaiji with SING font", "KozMinProVI-Regular",
"unicode",
"{fontname=PDFlibWing encoding=unicode forcechars=gaiji}",
"Gaiji: "),
new testcase(
"Replace Latin characters in CJK font",
"KozMinProVI-Regular",
"unicode",
"{fontname=Courier-Bold encoding=unicode forcechars={U+0020-U+007E}}",
"Latin and 日本語"),
/* Requires "Unicode BMP Fallback SIL" font in fallback.ttf */
/* Identify missing glyphs caused by workflow problems */
new testcase(
"Identify missing glyphs", "Times-Roman", "unicode",
"{fontname=fallback encoding=unicode}",
/*
* deliberately use characters which are not available in
* the base font
*/
"Missing glyphs: ሴ 本 語")
);
try {
$p = new pdflib();
$p->set_parameter("SearchPath", $searchpath);
$p->set_parameter("charref", "true");
$p->set_parameter("glyphcheck", "replace");
$p->set_parameter("textformat", "bytes");
/*
* This means that formatting and other errors will raise an
* exception. This simplifies our sample code, but is not
* recommended for production code.
*/
$p->set_parameter("errorpolicy", "exception");
/* Set an output path according to the name of the topic */
if ($p->begin_document($outfile, "") == 0) {
throw new Exception("Error: " . $p->get_errmsg());
}
$p->set_info("Creator", "PDFlib starter sample");
$p->set_info("Title", "starter_fallback");
/* Start Page */
$p->begin_page_ext(0, 0, "width=a4.height height=a4.width");
$table = 0;
/* Table header */
for ($i = 0; $i < count($headers); $i++) {
$col = $i + 1;
$optlist = "fittextline={fontname=Helvetica-Bold encoding=unicode fontsize=11} "
. "margin=4";
$table = $p->add_table_cell($table, $col, 1, $headers[$i], $optlist);
}
/* Create fallback samples, one use case per row */
for ($i = 0; $i < count($testcases); $i++) {
$row = $i + 2;
$testcase = $testcases[$i];
$col = 1;
/* Column 1: description of the use case */
$optlist = "fittextline={fontname=Helvetica encoding=unicode fontsize=11} "
. "margin=4";
$table = $p->add_table_cell($table, $col++, $row, $testcase->usecase,
$optlist);
/* Column 2: reproduce option list literally */
$optlist = "fittextline={fontname=Helvetica encoding=unicode fontsize=10} "
. "margin=4";
$table = $p->add_table_cell($table, $col++, $row,
$testcase->fallbackoptions, $optlist);
/* Column 3: text with base font */
$optlist = "fittextline={fontname=" . $testcase->fontname
. " encoding=" . $testcase->encoding
. " fontsize=11 replacementchar=? } margin=4";
$table = $p->add_table_cell($table, $col++, $row, $testcase->text,
$optlist);
/* Column 4: text with base font and fallback fonts */
$optlist = "fittextline={fontname=" . $testcase->fontname
. " encoding=" . $testcase->encoding
. " fontsize=11 fallbackfonts={"
. $testcase->fallbackoptions . "}} margin=4";
$table = $p->add_table_cell($table, $col++, $row, $testcase->text,
$optlist);
}
/* Place the table */
$optlist = "header=1 fill={{area=rowodd "
. "fillcolor={gray 0.9}}} stroke={{line=other}} ";
$result = $p->fit_table($table, $llx, $lly, $urx, $ury, $optlist);
if ($result == "_error") {
throw new Exception("Couldn't place table: " . $p->get_errmsg());
}
$p->end_page_ext("");
$p->end_document("");
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello.pdf");
print $buf;
}
catch (PDFlibException $e) {
die("PDFlib exception occurred in starter_fallback sample:\n" .
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
$e->get_errmsg() . "\n");
}
catch (Exception $e) {
die($e);
}
$p = 0;
?>