PDFlib Cookbook

cookbook

fonts/starter_fallback

Starter sample for fallback fonts

Download PHP Code  Switch to Java Code  Show Output 

<?php
/*
 * Starter sample for fallback fonts
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 10
 * Required data: suitable fonts
 */

/* This is where the data files are. Adjust as necessary. */
$searchpath = dirname(__FILE__,3)."/input";
$outfile = "";

$llx = 30; $lly = 50; $urx = 800; $ury = 570;

$headers = array( 
    "Use case",
    "Option list for the 'fallbackfonts' option", 
    "Base font",
    "With fallback font" );

class testcase {
    public function __construct($usecase, $fontname, 
            $fallbackoptions, $text) {
        $this->usecase = $usecase;
        $this->fontname = $fontname;
        $this->fallbackoptions = $fallbackoptions;
        $this->text = $text;
    }

    public $usecase;
    public $fontname;
    public $fallbackoptions;
    public $text;
}

$testcases = array(
    new testcase(
        "Add Emoji to text font",
        "NotoSerif-Regular",
        // Due to "colormode=ignoremono" only color glyphs are processed.
        "{fontname=EmojiOneColor colormode=ignoremono}",
        // U+1F602 = Face with Tears of Joy
        "Emoji: \u{1F602}"),


    new testcase(
        "Add enlarged pictogram", "NotoSerif-Regular",
        // U+261E = WHITE RIGHT POINTING INDEX
        "{fontname=ZapfDingbats forcechars=U+261E fontsize=150% textrise=-15%}",
        "hand symbol: \u{261E}"),

    new testcase(
        "Add enlarged symbol glyph",
        "NotoSerif-Regular",
        // U+2663 = Black Club Suit
        "{fontname=Symbol forcechars=U+2663 fontsize=125%}",
        "club symbol: \u{2663}"),

    new testcase(
        "Add Hebrew character to Latin font", "NotoSerif-Regular",
        "{fontname=NotoSerifHebrew-Regular}",
        "Hebrew: \u{05D0}"),
);

try {
    $p = new pdflib();

    $p->set_option("searchpath={" . $searchpath . "}");
    $p->set_option("charref=true");
    $p->set_option("glyphcheck=replace");

    /*
     * 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_option("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=NotoSerif-Bold fontsize=10} "
                . "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=NotoSerif-Regular fontsize=10} "
                . "margin=4";
        $table = $p->add_table_cell($table, $col++, $row, $testcase->usecase,
                $optlist);

        /* Column 2: reproduce option list literally */
        $optlist = "fittextline={fontname=NotoSerif-Regular 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
                . " fontsize=10 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
                . " fontsize=10 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=starter_fallback.pdf");
    print $buf;
}
catch (PDFlibException $e) {
    echo("PDFlib exception occurred in starter_fallback sample:\n" .
        "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
        $e->get_errmsg() . "\n");
    exit(1);
}
catch (Throwable $e) {
    echo($e);
    exit(1);
}

$p = 0;
?>