PDFlib Cookbook

cookbook

pdf_import/starter_pcos

Dump information from an existing PDF document.

Download Java Code  Switch to PHP Code  Show Output 

/*
 * pCOS starter:
 * Dump information from an existing PDF document
 *
 * Required software: PDFlib+PDI/PPS 9
 * Required data: PDF document
 */
package com.pdflib.cookbook.pdflib.pdf_import;

import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
import java.text.DecimalFormat;
import java.util.Locale;

public class starter_pcos {
    public static void main(String argv[]) {
        /* This is where the data files are. Adjust as necessary. */
        String searchpath = "../input";

        pdflib p = null;
        String pdfinput = "PLOP-datasheet.pdf";

        final String docoptlist = "requiredmode=minimum";
        int count;
        int i, doc;
        String objtype;
        int exitcode = 0;
        Locale.setDefault(Locale.US); 

        try {
            p = new pdflib();

            p.set_option("searchpath={" + searchpath + "}");

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

            /*
             * We do not create any output document, so no call to
             * begin_document() is required.
             */

            /* Open the input document */
            if ((doc = p.open_pdi_document(pdfinput, docoptlist)) == -1)
                throw new Exception("Error: " + p.get_errmsg());

            /* --------- general information (always available) */

            String pcosmode = p.pcos_get_string(doc, "pcosmodename");

            System.out.println("   File name: " + pdfinput);

            System.out.println(" PDF version: "
                    + p.pcos_get_string(doc, "pdfversionstring"));

            System.out.println("  Encryption: "
                    + p.pcos_get_string(doc, "encrypt/description"));

            System.out.println("   Master pw: "
                    + ((p.pcos_get_number(doc, "encrypt/master") != 0) ? "yes"
                            : "no"));

            System.out.println("     User pw: "
                    + ((p.pcos_get_number(doc, "encrypt/user") != 0) ? "yes"
                            : "no"));

            System.out.println("Text copying: "
                    + ((p.pcos_get_number(doc, "encrypt/nocopy") != 0) ? "no"
                            : "yes"));

            System.out.println("  Linearized: "
                    + ((p.pcos_get_number(doc, "linearized") != 0) ? "yes"
                            : "no") + "\n");

            if (pcosmode.equals("minimum")) {
                System.out.println(
                            "Minimum mode: no more information available\n");
                p.delete();
                System.exit(0);
            }

            /* --------- more details (requires at least user password) */
            System.out.println("PDF/X status: "
                    + p.pcos_get_string(doc, "pdfx"));

            System.out.println("PDF/A status: "
                    + p.pcos_get_string(doc, "pdfa"));

            boolean xfa_present = !p.pcos_get_string(doc,
                    "type:/Root/AcroForm/XFA").equals("null");
            System.out.println("    XFA data: " + (xfa_present ? "yes" : "no"));

            System.out.println("  Tagged PDF: "
                    + ((p.pcos_get_number(doc, "tagged") != 0) ? "yes" : "no"));

            System.out.println("No. of pages: "
                    + (int) p.pcos_get_number(doc, "length:pages"));

            DecimalFormat page_dim_format = new DecimalFormat();
            page_dim_format.setMinimumFractionDigits(3);
            page_dim_format.setMaximumFractionDigits(3);

            System.out.println(" Page 1 size: width="
                    + page_dim_format.format(p.pcos_get_number(doc,
                            "pages[0]/width"))
                    + ", height="
                    + page_dim_format.format(p.pcos_get_number(doc,
                            "pages[0]/height")));

            count = (int) p.pcos_get_number(doc, "length:fonts");
            System.out.println("No. of fonts: " + count);

            for (i = 0; i < count; i++) {
                String fonts;

                fonts = "fonts[" + i + "]/embedded";
                if (p.pcos_get_number(doc, fonts) != 0)
                    System.out.print("embedded ");
                else
                    System.out.print("unembedded ");

                fonts = "fonts[" + i + "]/type";
                System.out.print(p.pcos_get_string(doc, fonts) + " font ");
                fonts = "fonts[" + i + "]/name";
                System.out.println(p.pcos_get_string(doc, fonts));
            }

            System.out.println();

            boolean plainmetadata = p.pcos_get_number(doc,
                    "encrypt/plainmetadata") != 0;

            if (pcosmode.equals("restricted") && !plainmetadata
                    && p.pcos_get_number(doc, "encrypt/nocopy") != 0) {
                System.out.print(
                        "Restricted mode: no more information available");
                p.delete();
                System.exit(0);
            }

            /* ----- document info keys and XMP metadata (requires master pw) */

            count = (int) p.pcos_get_number(doc, "length:/Info");

            for (i = 0; i < count; i++) {
                String info;
                String key;
                int len;

                info = "type:/Info[" + i + "]";
                objtype = p.pcos_get_string(doc, info);

                info = "/Info[" + i + "].key";
                key = p.pcos_get_string(doc, info);
                len = 12 - key.length();
                while (len-- > 0)
                    System.out.print(" ");

                System.out.print(key + ": ");

                /* Info entries can be stored as string or name objects */
                if (objtype.equals("name") || objtype.equals("string")) {
                    info = "/Info[" + i + "]";
                    System.out
                            .println("'" + p.pcos_get_string(doc, info) + "'");
                }
                else {
                    info = "type:/Info[" + i + "]";
                    System.out.println("(" + p.pcos_get_string(doc, info)
                            + " object)");
                }
            }

            System.out.print("\nXMP metadata: ");

            objtype = p.pcos_get_string(doc, "type:/Root/Metadata");
            if (objtype.equals("stream")) {
                byte[] contents;

                contents = p.pcos_get_stream(doc, "", "/Root/Metadata");
                /* This demonstrates Unicode conversion */
                String string = p.convert_to_unicode("utf8", contents,
                                                "outputformat=utf16");
                System.out.print("(" + (string.length()) + " Unicode code points)");
            }
            else {
                System.out.println("not present");
            }

            p.close_pdi_document(doc);

        }
        catch (PDFlibException e) {
            System.err.println("PDFlib exception occurred:");
            System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() +
                ": " + e.get_errmsg());
            exitcode = 1;
        }
        catch (Exception e) {
            System.err.println(e);
            exitcode = 1;
        }
        finally {
            if (p != null) {
                p.delete();
            }
            System.exit(exitcode);
        }
    }
}