pCOS Cookbook

cookbook

interactive/formfields updated

List form fields and emit their properties and values.

Download Java Code  Show Output  Show Input (PDFlib-purchase-order.pdf) 

/*
 * List form fields and emit their properties and values.
 *
 * Required software: pCOS interface 9 (PDFlib+PDI 10, TET 5.x, PLOP 5.x)
 *
 * Required data: PDF document
 */

package com.pdflib.cookbook.pcos.interactive;

import com.pdflib.IpCOS;
import com.pdflib.cookbook.pcos.pcos_cookbook_example;

public class formfields extends pcos_cookbook_example {

    /* This is where the data files are. Adjust as necessary. */
    private final static String SEARCH_PATH = "../input";

    public void example_code(IpCOS p, int doc) throws Exception {

        System.out.println("File name: " + p.pcos_get_string(doc, "filename"));

        int fieldcount = (int) p.pcos_get_number(doc, "length:fields");
        if (fieldcount == 0) {
            System.out.println("No form fields found\n");
        }
        else {
            System.out.println(fieldcount + " form fields found (including administrative nodes in the forms hierarchy)");

            for (int f = 0; f < fieldcount; f++) {
                print_field(p, doc, f);
            }
        }
    }

    /**
     * Print information about a single field.
     * 
     * @param p
     *            IpCOS object
     * @param doc
     *            document handle
     * @param f
     *            number of field in "fields" pseudo object array
     * @throws Exception
     */
    private void print_field(IpCOS p, int doc, int f) throws Exception {
        System.out.print("field " + f + ": level="
            + (int) p.pcos_get_number(doc, "fields[" + f + "]/level") + " ");

        String res = p.pcos_get_string(doc, "fields[" + f + "]/fullname");
        System.out.print("fullname='" + res + "'; ");

        /* Check the field type /FT */
        String objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/FT");
        if (objtype.equals("name")) {
            String fieldtype = p.pcos_get_string(doc, "fields[" + f + "]/FT");
            System.out.print("type='" + fieldtype + "' ");

            if (fieldtype.equals("Btn")) {
                print_button_field(p, doc, f);
            }
            else if (fieldtype.equals("Ch")) {
                print_choice_field(p, doc, f);
            }
            else if (fieldtype.equals("Tx")) {
                print_text_field(p, doc, f);
            }
            else if (fieldtype.equals("Sig")) {
                System.out.println("See pCOS Cookbook topic 'signatures' to learn how to retrieve signature details");
            }
        }
        else {
            System.out.println("non-terminal field without any type");
        }
    }

    /**
     * Print information about a button field.
     * 
     * @param p
     *            IpCOS object
     * @param doc
     *            document handle
     * @param f
     *            number of field in "fields" pseudo object array
     * 
     * @throws Exception
     */
    private void print_button_field(IpCOS p, int doc, int f)
        throws Exception {
                
        // Retrieve the field type
        String type = p.pcos_get_string(doc, "fields[" + f + "]/type");

        System.out.println("(" + type + " field)");

        print_value(p, doc, f, "  ");
    }

    /**
     * Print information about a choice field (type /Ch).
     * 
     * @param p
     *            IpCOS object
     * @param doc
     *            document handle
     * @param f
     *            number of field in "fields" pseudo object array
     * 
     * @throws Exception
     */
    private void print_choice_field(IpCOS p, int doc, int f)
        throws Exception {
        String prefix = "  ";
        String objtype;
        
        // Retrieve the field type
        String type = p.pcos_get_string(doc, "fields[" + f + "]/type");

        System.out.println("(" + type + ")");

        print_value(p, doc, f, prefix);

        /* List options */
        objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/Opt");
        if (objtype.equals("array")) {
            int num_opt = (int) p.pcos_get_number(doc, "length:fields[" + f
                + "]/Opt");

            for (int i = 0; i < num_opt; i += 1) {
                String option = null;
                objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/Opt["
                    + i + "]");
                if (objtype.equals("array")) {
                    option = p.pcos_get_string(doc, "fields[" + f + "]/Opt["
                        + i + "][1]");
                }
                else if (objtype.equals("string")) {
                    option = p.pcos_get_string(doc, "fields[" + f + "]/Opt["
                        + i + "]");
                }
                if (option != null) {
                    System.out.println(prefix + "option " + (i + 1) + "='"
                        + option + "'");
                }
            }
        }
    }

    /**
     * Print information about a text field (type /FT).
     * 
     * @param p
     *            IpCOS object
     * @param doc
     *            document handle
     * @param f
     *            number of field in "fields" pseudo object array
     * 
     * @throws Exception
     */
    private void print_text_field(IpCOS p, int doc, int f) throws Exception {
        String prefix = "  ";
        String fieldtype = "text";
        String objtype;
        
        /* Check for barcode field */
        objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/PMD");
        if (objtype.equals("dict")) {
            objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/PMD/Symbology");
            if (objtype.equals("name")) {
                /* Check barcode type ("symbology") */
                fieldtype = p.pcos_get_string(doc, "fields[" + f + "]/PMD/Symbology") + " barcode";
            }
        }

        System.out.println("(" + fieldtype + " field)");

        /* Print value if available */
        print_value(p, doc, f, prefix);

        /* Print the "quadding" (justification) */
        String[] formatnames = { "left-justified", "centered",
            "right-justified", "unknown" };

        objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/Q");
        int format = 0; /* 0 is default */
        if (objtype.equals("number")) {
            format = (int) p.pcos_get_number(doc, "fields[" + f + "]/Q");
        }
        if (format < 0 || format > 2)
            format = 3;
        System.out.println(prefix + "format=" + formatnames[format]);
    }

    /**
     * Print a single /V value.
     * 
     * @param p
     *            IpCOS object
     * @param doc
     *            document handle
     * @param f
     *            number of field in "fields" pseudo object array
     * @param prefix
     *            prefix for indentation
     * @throws Exception
     */
    private void print_value(IpCOS p, int doc, int f, String prefix)
        throws Exception {
        String objtype = p.pcos_get_string(doc, "type:fields[" + f + "]/V");
        if (objtype.equals("name") || objtype.equals("string")) {
            String res = p.pcos_get_string(doc, "fields[" + f + "]/V");
            System.out.println(prefix + "value='" + res + "'");
        }
        else if (objtype.equals("stream")) {
            byte[] res_stream = p.pcos_get_stream(doc, "fields[" + f + "]/FT",
                "");
            System.out.println(prefix + "value='" + res_stream + "'");
        }
    }

    public formfields(String[] argv, String readable_name, String search_path) {
        super(argv, readable_name, search_path);
    }

    public static void main(String argv[]) {
        formfields example = new formfields(argv, "Form fields", SEARCH_PATH);
        example.execute();
    }
}