PDFlib Cookbook

cookbook

table/starter_table

Create table which may span multiple pages.

Download PHP Code  Switch to Java Code  Show Output 

<?php
/*
 *
 * Table starter:
 * Create table which may span multiple pages
 *
 * required software: PDFlib/PDFlib+PDI/PPS 9
 * required data: image file (dummy text created within the program)
 */

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

$tf=0; $tbl=0;
$rowmax = 50; $colmax = 5;
$llx= 50; $lly=50; $urx=550; $ury=800;

$headertext = "Table header (centered across all columns)";

/* Dummy text for filling a cell with multi-line Textflow */
$tf_text = 
"Lorem ipsum dolor sit amet, consectetur adi&shy;pi&shy;sicing elit, sed do eius&shy;mod tempor incidi&shy;dunt ut labore et dolore magna ali&shy;qua. Ut enim ad minim ve&shy;niam, quis nostrud exer&shy;citation ull&shy;amco la&shy;bo&shy;ris nisi ut ali&shy;quip ex ea commodo con&shy;sequat. Duis aute irure dolor in repre&shy;henderit in voluptate velit esse cillum dolore eu fugiat nulla pari&shy;atur. Excep&shy;teur sint occae&shy;cat cupi&shy;datat non proident, sunt in culpa qui officia dese&shy;runt mollit anim id est laborum. ";

try {
    $p = new PDFlib();

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

    $p->set_option("searchpath={" . $searchpath . "}");
    $p->set_option("stringformat=utf8");

    if ($p->begin_document($outfilename, "") == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

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

    /* -------------------- Add table cells -------------------- */

    /* ---------- row 1: table header (spans all columns) */
    $row = 1; $col = 1;
    $font = $p->load_font("NotoSerif-Bold", "unicode", "");
    if ($font == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    $optlist = "fittextline={position=center font=" . $font . " fontsize=14} " .
    "colspan=" . $colmax;

    $tbl = $p->add_table_cell($tbl, $col, $row, $headertext, $optlist);
    if ($tbl == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    /* ---------- row 2: various kinds of content */
    /* ----- Simple text cell */
    $row++; $col=1;

    $optlist = "fittextline={font=" . $font . " fontsize=10 orientate=west}";

    $tbl = $p->add_table_cell($tbl, $col, $row, "vertical line", $optlist);
    if ($tbl == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    /* ----- Colorized background */
    $col++;

    $optlist = "fittextline={font=" . $font . " fontsize=10} " .
    "matchbox={fillcolor={rgb 0.9 0.5 0}}";

    $tbl = $p->add_table_cell($tbl, $col, $row, "some color", $optlist);
    if ($tbl == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    /* ----- Multi-line text with Textflow */
    $col++;
    $font = $p->load_font("NotoSerif-Regular", "unicode", "");
    if ($font == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    $optlist = "charref fontname=NotoSerif-Regular encoding=unicode fontsize=8 ";

    $tf = $p->add_textflow($tf, $tf_text, $optlist);
    if ($tf == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    $optlist = "margin=2 textflow=" . $tf;

    $tbl = $p->add_table_cell($tbl, $col, $row, "", $optlist);
    if ($tbl == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    /* ----- Rotated $image */
    $col++;

    $image = $p->load_image("auto", $imagefile, "");
    if ($image == 0) {
        echo("Couldn't load $image: " . $p->get_errmsg());
        exit(1);
    }

    $optlist = "image=" . $image . " fitimage={orientate=west}";

    $tbl = $p->add_table_cell($tbl, $col, $row, "", $optlist);
    if ($tbl == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    /* ----- Diagonal stamp */
    $col++;

    $optlist = "fittextline={font=" . $font . " fontsize=10 stamp=ll2ur}";

    $tbl = $p->add_table_cell($tbl, $col, $row, "entry void", $optlist);
    if ($tbl == 0) {
        echo("Error: " . $p->get_errmsg());
        exit(1);
    }

    /* ---------- Fill $row 3 and above with their numbers */
    for ($row++; $row <= $rowmax; $row++) {
        for ($col = 1; $col <= $colmax; $col++) {
            $num = "Col " . $col . "/Row " . $row;
            $optlist = "colwidth=20% fittextline={font=" . $font . " fontsize=10}";
            $tbl = $p->add_table_cell($tbl, $col, $row, $num, $optlist);
            if ($tbl == 0) {
                echo("Error: " . $p->get_errmsg());
                exit(1);
            }
        }
    }

    /* ---------- Place the table on one or more pages ---------- */

    /*
     * Loop until all of the table is placed; create new pages
     * as long as more table instances need to be placed.
     */
    do {
        $p->begin_page_ext(0, 0, "width=a4.width height=a4.height");

        /* Shade every other $row; draw lines for all table cells.
         * Add "showcells showborder" to visualize cell borders 
         */
        $optlist = "header=1 rowheightdefault=auto " .
        "fill={{area=rowodd fillcolor={gray 0.9}}} " .
        "stroke={{line=other}} ";

        /* Place the table instance */
        $result = $p->fit_table($tbl, $llx, $lly, $urx, $ury, $optlist);
        if ($result ==  "_error") {
            echo("Couldn't place table: " . $p->get_errmsg());
            exit(1);
        }

        $p->end_page_ext("");

    } while ($result == "_boxfull");

    /* Check the $result; "_stop" means all is ok. */
    if ($result != "_stop") {
        if ($result ==  "_error") {
            echo("Error when placing table: " . $p->get_errmsg());
            exit(1);
        }
        else {
            /* Any other return value is a user exit caused by
             * the "return" option; this requires dedicated code to
             * deal with.
             */
            echo("User return found in Table");
            exit(1);
        }
    }

    /* This will also delete Textflow handles used in the table */
    $p->delete_table($tbl, "");

    $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_table.pdf");
    print $buf;
}
catch (PDFlibException $e) {
    echo("PDFlib exception occurred in starter_table sample:\n" .
        "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
        $e->get_errmsg() . "\n");
            exit(1);
}
catch (Exception $e) {
    echo($e);
            exit(1);
}

$p = 0;
?>