pCOS Cookbook

cookbook

interchange/dumper

pCOS sample application for dumping PDF information.

Download Java Code     Show Output     Show Input PDF

package com.pdflib.cookbook.pcos.interchange;

import java.text.DecimalFormat;


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

/**
 * pCOS sample application for dumping PDF information
 * 
 * Required software: pCOS interface 3 (pCOS 3.x, PDFlib+PDI/PPS 7.x, TET 2.2,
 * PLOP 3.x) <br>
 * Required data: PDF document
 *
 * @version $Id: dumper.java,v 1.16 2016/06/10 09:58:33 stm Exp $
 */
public class dumper 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 {
        int count, pcosmode;
        int i;
        boolean plainmetadata;
        String objtype;
        
        int pcosinterface = (int) p.pcos_get_number(doc, "pcosinterface");

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

        pcosmode = (int) p.pcos_get_number(doc, "pcosmode");

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

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

        System.out.println("  Encryption: "
            + p.pcos_get_string(doc, "encrypt/description"));
        
        /*
         * Starting with pCOS interface 11 it is possible to open files
         * that are encrypted with certificate security, and to retrieve
         * information about the recipients and a digital id supplied to
         * open the file.
         * 
         * Note that this pCOS Cookbook example is not prepared out-of-the-box
         * for passing a digital id to open a file encrypted with certificate
         * security. The code would have to be modified to pass a digital id
         * to the pcos_open_document() function.
         * 
         * On Windows this example program can decrypt an input file
         * encrypted with certificate security with a suitable digital id
         * installed in the Windows Certificate Store. In this case it is
         * sufficient to pass the option "engine=mscapi" to the
         * the pcos_open_document() function.
         */
        if (pcosinterface >= 11) {
            int recipientcount =
                (int) p.pcos_get_number(doc, "length:encrypt/recipients");
    
            if (recipientcount > 0)
            {
                System.out.println("Recipient groups: " + recipientcount);
                System.out.print("  Digital ID: ");
        
                if (pcosmode == 2)
                    System.out.println("supplied digital ID has master permissions");
                else if (pcosmode == 1)
                    System.out.println("supplied digital ID doesn't have master permissions");
                else
                    System.out.println("no suitable digital ID supplied");
            }
        }

        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"));

        System.out.println();

        if (pcosmode == 0) {
            System.out.println("Minimum mode: no more information available");
            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(0);
        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();

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

        if (pcosmode == 1 && !plainmetadata
            && p.pcos_get_number(doc, "encrypt/nocopy") != 0) {
            System.out.println("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.println();
        System.out.print("XMP metadata: ");

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

            contents = p.pcos_get_stream(doc, "", "/Root/Metadata");
            System.out.println(contents.length + " bytes");
        }
        else {
            System.out.println("not present");
        }
    }

    public dumper(String[] argv, String readable_name, String search_path,
        String full_rcs_file_name, String revision) {
        super(argv, readable_name, search_path, full_rcs_file_name, revision);
    }

    public static void main(String argv[]) {
        dumper example = new dumper(argv, "General info", SEARCH_PATH,
            "$RCSfile: dumper.java,v $", "$Revision: 1.16 $");
        example.execute();
    }
}