PDFlib Cookbook

cookbook

textflow/transparent_part_of_text

Use gstate in Textflow, e.g. for transparency/opacity.

Download PHP Code  Switch to Java Code  Show Output 

<?php
/*
 * Transparent part of text:
 * Create transparent text and highlight it with transparent rectangles
 * 
 * Use the "opacityfill" and "opacitystroke" options of create_gstate() to 
 * create an explicit graphics state with transparency settings. 
 * Place a transparent text line in two different ways. 
 * First use set_gstate() to set the explicit graphics state before placing the
 * text line. 
 * Second use the "gstate" option of fit_textline(). 
 * Output a Textflow with one word highlighted with a transparent rectangle
 * using the "gstate" suboption of the "matchbox" option of add_textflow().
 * Output a transparent Textflow with one word surrounded by the transparent
 * borders of a rectangle using the "gstate" suboption of the "matchbox" option
 * and the "gstate" option of add_textflow().
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 10
 * Required data: image file
 */

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

$imagefile = "nesrin.jpg";
$tf = 0;

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 );
    
    /* Load image */
    $image = $p->load_image("auto", $imagefile, "");
    if ($image == 0)
        throw new Exception("Error: " . $p->get_errmsg());

    /* Start page */
    $p->begin_page_ext(0, 0, "width=a4.height height=a4.width");
    
    /* Draw a yellow background rectangle */
    $p->setcolor("fill", "rgb", 1, 0.9, 0.58, 0);
    $p->rect(0, 0, 842, 595);
    $p->fill(); 
    
    /* Output a background image */
    $p->fit_image($image, 50, 50, "");
    
    /* Save the current graphics state. The save/restore of the current
     * state is not necessarily required, but it will help you get back to
     * a graphics state without any transparency.
     */
    $p->save();
    
    /* Create an extended graphics state with transparency set to 50%, using
     * create_gstate() with the "opacityfill" option set to 0.5.
     */
    $gstate = $p->create_gstate("opacityfill=.5");
    
    /* Apply the extended graphics state */
    $p->set_gstate($gstate);
    
    /* Display some text which will be transparent according to the
     * graphics state set
     */
    $p->setcolor("fill", "rgb", 1, 0.9, 0.58, 0);
    $p->fit_textline("Page 1: My favorite holiday photo", 100, 100, 
        "fontname=NotoSerif-Bold fontsize=40");
    
    /* Restore the current graphics state */
    $p->restore();
    
    $p->end_page_ext("");
    
    /* Start page */
    $p->begin_page_ext(0, 0, "width=a4.height height=a4.width");
    
    /* Draw a yellow background rectangle */
    $p->setcolor("fill", "rgb", 1, 0.9, 0.58, 0);
    $p->rect(0, 0, 842, 595);
    $p->fill(); 
    
    /* Output a background image */
    $p->fit_image($image, 50, 50, "");
    
    
    /* ------------------------------
     * Output a transparent text line
     * ------------------------------
     */
    
    /* Create an explicit graphics state with the transparency for fill 
     * operations set to 40%
     */
    $gstate = $p->create_gstate("opacityfill=0.4");
    
    /* Display a text line with the explicit graphics state applied. The
     * text will appear transparent. 
     */
    $optlist = 
        "fontname=NotoSerif-Bold fontsize=40 fillcolor={rgb 1 0.9 0.58} " .
        "gstate=" . $gstate;
    
    $p->fit_textline("Page 2: My favorite holiday photo", 100, 470, 
        $optlist);
    
    
    /* --------------------------------------------------------
     * Output a Textflow with the word "favorite" filled with a 
     * transparent rectangle
     * --------------------------------------------------------
     */
    
    /* Create an explicit graphics state with the transparency for fill
     * operations set to 40%
     */
    $gstate = $p->create_gstate("opacityfill=0.4");
    
    /* Define the general Textflow options */
    $optlist =
        "fontname=NotoSerif-Bold fontsize=30 " .
        "leading=120% charref fillcolor={rgb 1 0.9 0.58} ";
    
    /* Add parts of the Textflow */
    $text = "Here you can see my ";  
    $tf = $p->add_textflow($tf, $text, $optlist);
    if ($tf == 0)
        throw new Exception("Error: " . $p->get_errmsg());
    
    /* Use the "matchbox" option to define a matchbox rectangle to be 
     * filled on parts of the Textflow. To fill the rectangle 
     * transparently the matchbox is provided with the graphics state
     * created above.
     */
    $mopts = "matchbox={name=mymatchbox boxheight={ascender descender}" .
        " fillcolor={rgb 1 0.9 0.58} gstate=" . $gstate .
        " offsetleft=-4 offsetright=4 offsettop=4} ";
    
    /* Use the "gstate" option to apply the explicit graphics state
     * defined above
     */
    $gopts = "gstate=" . $gstate;
    
    /* Add a part of the Textflow with the "matchbox" and "gstate" 
     * options. That part of the text will be filled with a transparent
     * rectangle and will appear transparent.
     */
    $text = "favorite";   
    $tf = $p->add_textflow($tf, $text, $optlist . $mopts . $gopts);
    if ($tf == 0)
        throw new Exception("Error: " . $p->get_errmsg());
    
    /* Define the "matchbox=end" option to end the matchbox */
    $mopts = "matchbox=end ";
    
    /* Create another explicit graphics state with no transparency */
    $gstate = $p->create_gstate("opacityfill=1");
    
    /* Use the "gstate" option to apply the explicit graphics state
     * defined above
     */
    $gopts = "gstate=" . $gstate;
    
    /* Add parts of the text with the "matchbox=end" option applied.
     * The matchbox rectangle will end before the text to be added.
     * The text will not appear transparent any more.
     */
    $text = " holiday photo.";
    $tf = $p->add_textflow($tf, $text, $optlist . $mopts . $gopts);
    if ($tf == 0)
        throw new Exception("Error: " . $p->get_errmsg());
    
    $result = $p->fit_textflow($tf, 100, 200, 300, 400, "");
    if ($result == "_stop")
    {
        /* Check for errors or more text to be placed */
    }
    $p->delete_textflow($tf);
    
    
    /* -----------------------------------------------------------------
     * Output a transparent Textflow with the word "favorite" surrounded
     * by the transparent borders of a rectangle.
     * -----------------------------------------------------------------
     */
    $tf = 0;
    
    /* Create an explicit graphics state with transparency for stroking
     * and filling set to 40%
     */
    $gstate = $p->create_gstate("opacitystroke=0.4 opacityfill=0.4");
    
    /* Define the general Textflow options including the graphics state
     * defined above
     */
    $optlist =
        "fontname=NotoSerif-Bold fontsize=30 " .
        "leading=120% charref fillcolor={rgb 1 0.9 0.58} " .
        "gstate=" . $gstate;
    
    /* Add parts of the Textflow */
    $text = "This is my ";  
    $tf = $p->add_textflow($tf, $text, $optlist);
    if ($tf == 0)
        throw new Exception("Error: " . $p->get_errmsg());
    
    /* Use the "matchbox" option for defining a matchbox rectangle to be 
     * stroked around parts of the Textflow. To stroke the rectangle 
     * transparently the matchbox is provided with the graphics state 
     * created above.
     */
    $mopts = " matchbox={name=mymatchbox gstate=" . $gstate . 
        " boxheight={ascender descender} linecap=projecting" .
        " borderwidth=3 strokecolor={rgb 1 0.9 0.58}" .
        " offsetleft=-4 offsetright=4 offsettop=4}";
    
    /* Add a part of the Textflow with the matchbox option */
    $text = "favorite";   
    $tf = $p->add_textflow($tf, $text, $optlist . $mopts);
    if ($tf == 0)
        throw new Exception("Error: " . $p->get_errmsg());
    
    /* Define the "matchbox=end" option to end the matchbox */
    $mopts = " matchbox=end";
    
    /* Add parts of the text with the "matchbox=end" option.
     * The matchbox rectangle will end before the text to be added.
     */
    $text = " holiday photo.";
    $tf = $p->add_textflow($tf, $text, $optlist . $mopts);
    if ($tf == 0)
        throw new Exception("Error: " . $p->get_errmsg());
    
    $result = $p->fit_textflow($tf, 650, 100, 780, 280, "");
    if ($result != "_stop")
    {
        /* Check for errors or more text to be placed */
    }
    $p->delete_textflow($tf);
    
    $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=transparent_part_of_text.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;

?>