PDFlib Cookbook

cookbook

pdfua/form_fields_pdfua1

Create accessible form field according to PDF/UA.

Download PHP Code  Switch to Java Code  Show Output 

<?php
/*
 * Create accessible form fields according to PDF/UA
 * Each call to create_field() generates the required OBJR structure element
 * automatically. The corresponding "Form" element and auxiliary structure
 * elements must be created by the user.
 * The nesting of Part, Div, Caption, P and Form follows the recommendations
 * in the document "Tagged PDF Best Practice Guide".
 * 
 * Required software: PDFlib/PDFlib+PDI/PPS 10
 * Required data: font file
 */

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

/*
 * Search path for extra resources, put "ErlerDingbats.ttf" or
 * "ZapfDingbats.ttf" here.
 */
$extra_searchpath = dirname(dirname(dirname(__FILE__)))."/extra_input";

$title = "Tagged form fields";

try {
    $x1=50; $x2=150; $y=750;
    $fieldheight=24; $fieldwidth=200; $fieldsmall=12;
    
    $p = new pdflib();
    
    /*
     * errorpolicy=exception means that program will stop
     * if one of the API function runs into a problem.
     */
    $p->set_option("errorpolicy=exception searchpath={{" . $searchpath
                . "} {" . $extra_searchpath . "}}");

    $p->begin_document("",
        "pdfua=PDF/UA-1 lang=en tag={tagname=Document Title={" . $title . "}}") ;

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

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

    $p->begin_page_ext(0, 0,
        "width=a4.width height=a4.height taborder=structure");

    $id_Part = $p->begin_item("Part", "");

    $font = $p->load_font("NotoSerif-Regular", "winansi", "simplefont nosubsetting");

    $p->setfont($font, 24.0);
    $p->fit_textline("Kraxi paper planes order form",
        $x1, $y, "tag={tagname=H1}");
    $p->create_bookmark("Kraxi paper planes order form", "");
    
    $p->setfont($font, 12.0);


    /* =================== Text field ======================== */
    $id_Div = $p->begin_item("Div", "");
    $y -= 3 * $fieldheight;

    $labeltext = "Enter name:";
    $p->fit_textline($labeltext, $x1, $y + 0.5 * $fieldheight, "
        tag={tagname=Caption tag={tagname=P}}");
    
    $optlist = "tag={tagname=P tag={tagname=Form}} tooltip={" . $labeltext . "} " .
        "bordercolor={gray 0} font=" . $font;
    
    $p->create_field($x2, $y, $x2 + $fieldwidth, $y + $fieldheight,
        "name", "textfield", $optlist);

    $p->end_item($id_Div);


    /* =================== Combo box ======================== */
    $id_Div = $p->begin_item("Div", "");
    $y -= 3 * $fieldheight;

    $labeltext = "Select size:";
    $p->fit_textline($labeltext, $x1, $y + 0.5 * $fieldheight, 
    "tag={tagname=Caption tag={tagname=P}}");
    
    /* Create a form field of type "combobox".
     * Set the values for the combobox items (itemnamelist={0 1 2 3 4}).
     * Set the labels for the combobox items (itemtextlist={...}).
     * Set the focus on the last item (currentvalue=XXL).
     * Allow the user to change an item (editable=true)
     */
    
    $optlist = "tag={tagname=P tag={tagname=Form}} tooltip={" . $labeltext . "} " . 
        "font=" . $font . " fontsize=12 backgroundcolor={gray 0.9} " .
        "bordercolor={gray 0.7} itemnamelist={0 1 2 3 4} " .
        "currentvalue=XXL itemtextlist={S M L XL XXL} editable=true";
    
    $p->create_field($x2, $y, $x2 + $fieldwidth, $y + $fieldheight,
        "size", "combobox", $optlist);
    
    $p->end_item($id_Div);
   
    
    /* =================== List box ======================== */
    $id_Div = $p->begin_item("Div", "");
    $y -= 4 * $fieldheight; 

    $labeltext = "Select model:";
    $p->fit_textline($labeltext, $x1, $y, "tag={tagname=Caption tag={tagname=P}}");
       
    /* Create a form fiels of type "listbox".
     * Set the values for the list items (itemnamelist={0 1 2 3}).
     * Set the labels for the list items (itemtextlist={...}).
     * Set the focus on the first item (currentvalue=0).
     */
    $optlist = "tag={tagname=P tag={tagname=Form}} tooltip={" . $labeltext . "} " . 
        "font=" . $font . " fontsize=12 backgroundcolor={gray 0.9} " .
        "bordercolor={gray 0.7} itemnamelist={0 1 2 3} currentvalue=0 " .
        "itemtextlist={{Long Distance Glider} {Giant Wing} " .
        "{Cone Head Rocket} {Super Dart}}";
    $y -= 2.5 * $fieldheight;

    $p->create_field($x2, $y, $x2 + $fieldwidth, $y + 3 * $fieldheight,
        "model", "listbox", $optlist);

    $p->end_item($id_Div);


    /* =================== Check boxes ======================== */
    $id_Div = $p->begin_item("Div", "");

    $y -= 2 * $fieldheight;
    $labeltext = "Select extras:";

    $p->fit_textline($labeltext, $x1, $y, "tag={tagname=Caption tag={tagname=P}}");
    
    /* The nested Div element encloses the check boxes */
    $id_Div2 = $p->begin_item("Div", "");

    /* Create several form fields of type "checkbox" */
    $optlist = "buttonstyle=cross bordercolor={gray 0} " .
        "backgroundcolor={rgb 0.95 0.95 1} fillcolor={rgb 0.25 0 0.95}";

    /* Emit the Caption text before the field because logically it comes first. */
    $labeltext = "glossy paper";
    $p->fit_textline($labeltext, $x2 + 2 * $fieldsmall, $y, "tag={tagname=Caption tag={tagname=P}}");

    $p->create_field($x2, $y, $x2 + $fieldsmall, $y + $fieldsmall,
        $labeltext, "checkbox",
        $optlist . " tag={tagname=P tag={tagname=Form}}  tooltip={" . $labeltext . "}");

    $y -= $fieldheight;
    $labeltext = "rainbow colors";

    $p->fit_textline($labeltext, $x2 + 2 * $fieldsmall, $y, "tag={tagname=Caption tag={tagname=P}}");

    $p->create_field($x2, $y, $x2 + $fieldsmall, $y + $fieldsmall,
        $labeltext, "checkbox",
        $optlist . " tag={tagname=P tag={tagname=Form}} tooltip={" . $labeltext . "}");

    $p->end_item($id_Div2);
    $p->end_item($id_Div);


    /* =================== radio buttons ======================== */
    $id_Div = $p->begin_item("Div", "");
    $y -= 3 * $fieldheight;

    $labeltext= "Select color:";
    $p->fit_textline($labeltext, $x1, $y, "tag={tagname=Caption tag={tagname=P}}");

    /* The nested Div element encloses the buttons */
    $id_Div2 = $p->begin_item("Div", "");
    
    /* First create a form field group called "colors" */
    $p->create_fieldgroup("colors",
        "fieldtype=radiobutton tooltip={" . $labeltext . "}");

    /* Create several form fields of type "radiobutton". 
     * All fields belong to the "colors" field group. Indicate this
     * relationship by providing each radiobutton field name with the
     * prefix "colors.".
     * Activate the first radio button (currentvalue={On}).
     * The tooltip is always shared by the group.
     */
    $optlist = "buttonstyle=circle bordercolor={gray 0.8}";

    /* Emit the Caption text before the field because logically it comes first. */
    $labeltext = "standard";
  
    $p->fit_textline($labeltext, $x2 + 2 * $fieldsmall, $y, 
        "tag={tagname=Caption tag={tagname=P}}");

    $p->create_field($x2, $y, $x2 + $fieldsmall, $y + $fieldsmall,
        "colors." . $labeltext, "radiobutton",
        $optlist . " currentvalue={On} tag={tagname=P tag={tagname=Form}}");
    
    $y -= $fieldheight;
    $labeltext = "yellow";

    $p->fit_textline($labeltext, $x2 + 2 * $fieldsmall, $y, 
        "tag={tagname=Caption tag={tagname=P}}");

    $p->create_field($x2, $y, $x2 + $fieldsmall, $y + $fieldsmall,
        "colors." . $labeltext, "radiobutton",
        $optlist . " tag={tagname=P tag={tagname=Form}}");
    
    $y -= $fieldheight;
    $labeltext = "blue";
  
    $p->fit_textline($labeltext, $x2 + 2 * $fieldsmall, $y, 
        "tag={tagname=Caption tag={tagname=P}}");
    $p->create_field($x2, $y, $x2 + $fieldsmall, $y + $fieldsmall,
        "colors.". $labeltext, "radiobutton",
        $optlist . " tag={tagname=P tag={tagname=Form}}");

    $p->end_item($id_Div2);
    $p->end_item($id_Div);


    /* =================== Push button ======================== */

    /* Create a print field of type "pushbutton". */
    
    /* Create an action for executing the Acrobat command File/Print */
    $printaction = $p->create_action("Named", "menuname=Print");
    
    $y -= 3 * $fieldheight;

    $optlist = "bordercolor={rgb 0.25 0 0.95} " .
        "backgroundcolor={rgb 0.95 0.95 1} " .
        "fillcolor={rgb 0.25 0 0.95} font=" . $font . " fontsize=14";

    $labeltext = "Print form" ;

    /* For the Div-->Caption-->P-->Form nesting we use quadruple abbreviated tagging */
    $p->create_field($x2, $y, $x2 + 0.5*$fieldwidth, $y + $fieldheight,
        "print", "pushbutton",
        $optlist . " caption={" . $labeltext . "} action={up " . $printaction .
        "} tag={tagname=Div tag={tagname=Caption " . 
        "tag={tagname=P tag={tagname=Form}}}} tooltip={" . $labeltext . "}");

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

$p = 0;
?>