/* $Id: starter_pcos.java,v 1.9 2007/10/06 19:31:07 katja Exp $
 * pCOS starter:
 * Dump information from an existing PDF document
 *
 * Required software: PDFlib+PDI/PPS 7
 * Required data: PDF document
 */
package com.pdflib.cookbook.pdflib.pdf_import;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
import java.text.DecimalFormat;

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 = "TET-datasheet.pdf";

    final String docoptlist = "requiredmode=minimum";
    int count, pcosmode;
    int i, doc;
    String  objtype;

    try
    {
        p = new pdflib();

        p.set_parameter("SearchPath", searchpath);

        /* This means we must check return values of load_font() etc. */
        p.set_parameter("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) */

        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_number(doc, "pdfversion")/10);

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

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

        if (pcosmode == 0)
        {
        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("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("");

        if (pcosmode == 1)
        {
        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("\n" + "XMP meta data: ");


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

        p.close_pdi_document(doc);

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