PDFlib Cookbook

cookbook

pdfua/tag_out_of_order

Download PHP Code       Switch to Java Code      Show Output PDF

<?php
/* $Id: tag_out_of_order.php,v 1.2 2014/02/03 17:10:24 rjs Exp $
 * tag_out_of_order
 *
 * This topic demonstrates how to create Tagged PDF out of order, using
 * the following features:
 * - suspend/resume_page() for adding content to a previous page
 * - query the current structure element id and index with get_option()
 * - the "parent" and "index" tagging options for adding structure elements
 *   at a previous location in the structure tree
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 9
 * Required data: font
 */

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

$outfile = "";
$title = "Create Tagged PDF content out of order";

$x = 50; $y1 = 600; $y2 = 550;

try {
    $p = new pdflib();

    $p->set_option("searchpath={" . $searchpath . "}");
    
    /* all strings are expected as utf8*/
    $p->set_option("stringformat=utf8");

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

    if ($p->begin_document($outfile,
        "pdfua=PDF/UA-1 tag={tagname=Document} lang=en") == 0)
        throw new Exception("Error: " . $p->get_errmsg());

    /* Automatically create spaces between chunks of text */
    $p->set_option("autospace=true");

    $p->set_info("Creator", "PDFlib Cookbook");
    $p->set_info("Title", $title . ' $Revision: 1.2 $');

    $font = $p->load_font("DejaVuSerif", "unicode", "embedding");
    if ($font == 0)
        throw new Exception("Error: " . $p->get_errmsg());

    $p->create_bookmark($title, "");

    // ***************************************************
    // First pass: create partial content on each page.
    // ***************************************************

    $id_parent = (int) $p->get_option("activeitemid", "");

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

    $p->setfont($font, 24);

    $p->fit_textline("Heading of Chapter 1", $x, $y1, "tag={tagname=H1}");

    /* Fetch the number of kids of the parent */
    $index1 = (int) $p->get_option("activeitemkidcount", "");

    // Suspend page 1 to resume it later
    $p->suspend_page("");

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

    $p->setfont($font, 24);
    $p->fit_textline("Heading of Chapter 2", $x, $y1, "tag={tagname=H1}");
    $index2 = (int) $p->get_option("activeitemkidcount", "");

    // Suspend page 2 to resume it later
    $p->suspend_page("");

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

    $p->setfont($font, 24);
    $p->fit_textline("Heading of Chapter 3", $x, $y1, "tag={tagname=H1}");
    $index3 = (int) $p->get_option("activeitemkidcount", "");

    // Suspend page 3 to resume it later
    $p->suspend_page("");

    // ***************************************************
    // Second pass: add more content to each page.
    // ***************************************************

    // Revisit page 1
    $p->resume_page("pagenumber=1");

    // insert more content after the H1 element
    $p->fit_textline("Contents of chapter 1...", $x, $y2, "fontsize=12 "
        . "tag={tagname=P parent=" . $id_parent . " index=" . $index1 . "}");

    // Since we inserted an element we must increase subsequent indices
    $index2++;
    $index3++;

    $p->end_page_ext("");

    // Revisit page 2
    $p->resume_page("pagenumber=2");

    // insert more content after the H1 element
    $p->fit_textline("Contents of chapter 2...", $x, $y2, "fontsize=12 "
        . "tag={tagname=P parent=" . $id_parent . " index=" . $index2 . "}");

    // Since we inserted an element we must increase the subsequent
    // index
    $index3++;

    $p->end_page_ext("");

    // Revisit page 3
    $p->resume_page("pagenumber=3");

    // insert more content after the H1 element
    $p->fit_textline("Contents of chapter 3...", $x, $y2, "fontsize=12 "
        . "tag={tagname=P parent=" . $id_parent . " index=" . $index3 . "}");

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

$p = 0;

?>