set_option("searchpath={" . $searchpath . "}"); $p->set_option("searchpath={" . $fontpath . "}"); /* 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_apiname() . ": " . $p->get_errmsg()); $p->set_info("Creator", "PDFlib Cookbook"); $p->set_info("Title", $title); $font = $p->load_font("NotoSerif-Regular", "", ""); if ($font == 0){ throw new Exception("Error: " . $p->get_apiname() . ": " . $p->get_errmsg()); } /* Open the input PDF */ $indoc = $p->open_pdi_document($pdffile, "usejavascript"); if ($indoc == 0) throw new Exception("Error: " . $p->get_apiname() . ": " . $p->get_errmsg()); $endpage = $p->pcos_get_number($indoc, "length:pages"); /* Loop over all pages of the input document */ for ($pageno = 1; $pageno <= $endpage; $pageno++) { $page = $p->open_pdi_page($indoc, $pageno, ""); if ($page == 0) { print("Error: " . $p->get_errmsg()); continue; } /* Dummy page size; will be adjusted by $p->fit_pdi_page() */ $p->begin_page_ext(100, 100, ""); /* Place the imported page on the output page and * adjust the page size. If the page contains form fields * these are also imported. */ $p->fit_pdi_page($page, 0, 0, "adjustpage usefields=all useactions"); /* Enumerate imported form fields */ $fieldcount = (int) $p->pcos_get_number($indoc, "length:pages[" . ($pageno-1) . "]/fields"); if ($fieldcount == 0){ fwrite(STDERR, "no form fields found on page " . $pageno . "\n"); }else{ fwrite(STDERR, "processing page " . $pageno . "\n"); } for ($f = 0; $f < $fieldcount; $f++) { $fieldname = $p->pcos_get_string($indoc, "pages[" . ($pageno-1) . "]/fields[" . $f . "]/fullname"); $fieldtype = $p->pcos_get_string($indoc, "pages[" . ($pageno-1) . "]/fields[" . $f . "]/type"); /* Process field depending on its type */ switch ($fieldtype) { case "textfield": $output = sprintf("filling %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); // Fill the field with its own name $optlist = "currentvalue={" . $fieldname . "} font=" . $font . " bordercolor=pink"; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); break; case "radiobutton": // Highlight the field $optlist = "bordercolor=pink"; if (strlen($fieldname) > 2 && substr($fieldname, -2) == "#0") { $output = sprintf("Activating %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); // Activate the first button in the group $optlist .= " currentvalue=On"; } else { $output = sprintf("Highlighting %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); } $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); break; case "checkbox": $output = sprintf("activating %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); // Activate all boxes $optlist = "currentvalue=On bordercolor=pink"; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); break; case "combobox": $output = sprintf("highlighting and popluating %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); // Highlight the field $optlist = "itemtextlist={item1 item2 item3} currentvalue=item1 bordercolor=pink font=" . $font; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); break; case "listbox": $output = sprintf("highlighting and popluating %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); // Highlight the field $optlist = "itemtextlist={item1 item2 item3} currentvalue={1} bordercolor=pink font=" . $font; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); break; case "pushbutton": $output = sprintf("adding caption for %s field %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); // Add caption (descriptive text) and highlight field border $optlist = "caption={push me} bordercolor=pink font=" . $font; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); break; case "signature": // Highlight field border // Use "fieldcontents" to change the appearance $optlist = "bordercolor=pink"; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); /* * Invisible signature fields are ignored upon import. * In this case we risk an error message from PDF_create_field() * since the selected field isn't available for filling. * Therefore we must detect and skip empty signature fields here. */ $llx = $p->pcos_get_number($indoc, "pages[" . ($pageno-1) . "]/fields[" . $f . "]/Rect[0]"); $lly = $p->pcos_get_number($indoc, "pages[" . ($pageno-1) . "]/fields[" . $f . "]/Rect[1]"); $urx = $p->pcos_get_number($indoc, "pages[" . ($pageno-1) . "]/fields[" . $f . "]/Rect[2]"); $ury = $p->pcos_get_number($indoc, "pages[" . ($pageno-1) . "]/fields[" . $f . "]/Rect[3]"); if ($llx == $urx || $lly == $ury) { $output = sprintf("ignoring empty signature field %d: '%s'\n", $f, $fieldname); fwrite(STDERR, $output); } else { // Highlight field border // Use "fieldcontents" to change the appearance $output = sprintf("hightlighting %s field %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); $optlist = "bordercolor=pink"; $p->create_field(0, 0, 0, 0, $fieldname, "", $optlist); } break; // The remaining pCOS types don't designate usable fields; nothing to do case "container": // node in the form tree which is not a form itself case "radiogroup": // parent of a group of radio buttons default: $output = sprintf("skipping %s %d: '%s'\n", $fieldtype, $f, $fieldname); fwrite(STDERR, $output); break; } } $p->close_pdi_page($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=fill_imported_form_fields.pdf"); print $buf; } catch (PDFlibException $e) { echo("PDFlib exception occurred in fill_imported_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; ?>