PDFlib Cookbook

cookbook

type3_fonts/type3_vectorlogo

Create a Type 3 font which contains a single logo derived from a PDF page.

Download PHP Code  Switch to Java Code  Show Output 

<?php
/*
 * Type 3 vector logo font:
 * Create a Type 3 font which contains a single logo derived from a vector
 * based PDF page
 *
 * Required software: PDFlib+PDI/PPS 10
 * Required data: PDF file
 */

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

$logofile = "kraxi_logo.pdf";

try {
    $p = new PDFlib();
    $p->set_option("searchpath={" . $searchpath . "}");

    /* This means we must check return values of load_font() etc. */
    $p->set_option("errorpolicy=return");

    if ($p->begin_document($outfile, "") == 0)
            throw new Exception("Error: " . $p->get_errmsg());

    $p->set_info("Creator", "PDFlib Cookbook");
    $p->set_info("Title", $title );

    /* Import vector data from "kraxi_logo.pdf" to create the "LogoFont"
     * Type 3 font with one glyph "kraxi". Output text containing
     * the glyph by addressing via character reference value by glyph
     * name and via PUA value (Unicode Private Use Area).
     */

    /* Load vector data from PDF file */
    $indoc = $p->open_pdi_document($logofile, "");
    if ($indoc == 0)
        throw new Exception("Error: " . $p->get_errmsg());

    $page = $p->open_pdi_page($indoc, 1, "");
    if ($page == 0)
        throw new Exception("Error: " . $p->get_errmsg());

    /* Create the font LogoFont. The matrix entries are chosen to create
     * the common 1000x1000 coordinate system. These numbers are also
     * used when placing the logo within the glyph box below (option
     * "boxsize").
     */
    $p->begin_font("LogoFont", 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, "");

    /* The .notdef (fallback) glyph should be contained in all Type 3
     * fonts to avoid problems with some PDF viewers. It is usually
     * empty.
     */
    $p->begin_glyph_ext(0x0000, "width=1000");
    $p->end_glyph();

    /*
     * Add a glyph with the name "kraxi" and width 1000. Colorized fonts
     * do not need any bounding box, so we supply the values 0, 0, 0, 0.
     * 
     * As there is no meaningful Unicode value for the logo, we let
     * PDFlib assign a PUA value. The glyph can be addressed via its
     * glyph name, or alternatively the Unicode PUA value can be
     * retrieved via info_font().
     */
    $p->begin_glyph_ext(-1, "width=1000 colorized glyphname=kraxi boundingbox={0 0 0 0}");

    /* Fit the contents of the PDF in a box similar to the dimensions
     * of the glyph box. We place the glyph at (0, 100) in order to
     * slightly move up the logo so that it better matches standard
     * text.
     */
    $p->fit_pdi_page($page, 0, 100, "boxsize={1000 1000} fitmethod=meet");
    $p->end_glyph();

    $p->end_font();

    $p->close_pdi_page($page);
    $p->close_pdi_document($indoc);

    /* Load the new "LogoFont" font with encoding "unicode" */
    $logofont = $p->load_font("LogoFont", "unicode", "");
    if ($logofont == 0)
        throw new Exception("Error: " . $p->get_errmsg());

    /* Start page */
    $p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
    

    /* Print the glyph "kraxi" of the "LogoFont" font */
    $p->fit_textline("&.kraxi;", 100, 500, "fontname=LogoFont fontsize=24 charref");

    /* Print descriptive text */
    $p->fit_textline("This is the kraxi logo.", 150, 500, "fontname=NotoSerif-Regular fontsize=24");

    /*
     * Alternatively fetch the PUA value and address the glyph with
     * the PUA value.
     */
    $kraxi_pua_value = (int) $p->info_font($logofont, "unicode", "glyphname=kraxi");
    $kraxi_dec_charref = "&#" . $kraxi_pua_value . ";";
    $p->fit_textline($kraxi_dec_charref, 425, 500, "font=" . $logofont .  " fontsize=24 charref");

    /* Finish page */
    $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=type3_vectorlogo.pdf");
    print $buf;

} catch (PDFlibException $e) {
    echo("PDFlib exception occurred:\n" .
        "[" . $e->get_errnum() . "] " . $e->get_apiname() .
        ": " . $e->get_errmsg() . "\n");
    exit(1);
} catch (Throwable $e) {
    echo("PHP exception occurred: " . $e->getMessage() . "\n");
    exit(1);
}
$p = 0;
?>