/*
* Determine the total number of file attachments:
* - document-level attachments; identify PDF Portfolios (collections)
* - file attachments on all pages.
*
* Required software: pCOS interface 8 (PDFlib+PDI/PPS 9, TET 4.1, PLOP 5.0)
* Required data: PDF document
*/
package com.pdflib.cookbook.pcos.interactive;
import com.pdflib.IpCOS;
import com.pdflib.cookbook.pcos.pcos_cookbook_example;
public class attachments 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 pagecount = (int) p.pcos_get_number(doc, "length:pages");
/* Check whether the document represents a PDF Portfolio */
String colltype = p.pcos_get_string(doc, "type:/Root/Collection");
if (colltype.equals("dict")) {
String defaultdoc;
System.out.print("PDF Portfolio, default document: ");
/*
* Check the default document (may be different from container PDF);
* we currently don't check whether this name is actually present in
* the list of embedded files.
*/
if (p.pcos_get_string(doc, "type:/Root/Collection/D").equals(
"string")) {
defaultdoc = "'" + p.pcos_get_string(doc, "/Root/Collection/D")
+ "'";
}
else
defaultdoc = "container PDF";
System.out.println(defaultdoc);
}
/* Check for document file attachments */
int filecount = (int) p.pcos_get_number(doc, "length:names/EmbeddedFiles");
for (int file = 0; file < filecount; file++) {
/* Check for Unicode file name */
String objtype = p.pcos_get_string(doc, "type:names/EmbeddedFiles["
+ file + "]/UF");
if (objtype.equals("string")) {
String val = p.pcos_get_string(doc, "names/EmbeddedFiles["
+ file + "]/UF");
System.out.println("Document attachment '"
+ val
+ "', length "
+ get_attachment_contents(p, doc, "names/EmbeddedFiles["
+ file + "]/EF/F") + " bytes");
}
else {
/* Check for ASCII/native encoded file name */
objtype = p.pcos_get_string(doc, "type:names/EmbeddedFiles["
+ file + "]/F");
if (objtype.equals("string")) {
String val = p.pcos_get_string(doc, "names/EmbeddedFiles["
+ file + "]/F");
System.out.println("Document attachment '"
+ val
+ "', length "
+ get_attachment_contents(p, doc,
"names/EmbeddedFiles[" + file + "]/EF/F")
+ " bytes");
}
}
}
System.out.println(filecount + " document attachments found");
System.out.println();
/* Check all pages for annotations of type FileAttachment */
filecount = 0;
for (int page = 0; page < pagecount; page++) {
int annotcount = (int) p.pcos_get_number(doc, "length:pages["
+ page + "]/Annots");
for (int annot = 0; annot < annotcount; annot++) {
// pCOS path for a specific annotation on a page
String page_annotation = "pages[" + page + "]/Annots[" + annot
+ "]";
String val = p.pcos_get_string(doc, page_annotation
+ "/Subtype");
if (val.equals("FileAttachment")) {
process_attachment(p, doc, page, page_annotation);
filecount++;
}
}
}
System.out.println(filecount + " attachment annotations found");
}
/**
* Prints information about a file attachment and extracts it to disk.
* The method expects the pCOS path to the attachment in the form
* "pages[i]/Annots[j]", with i being the page number and j being the number
* of the annotation of interest on that page.
*
* @param p
* IpCOS object
* @param doc
* document handle
* @param page
* page number (zero based)
* @param annotation
* pCOS path to the annotation
*
* @throws Exception
*/
private void process_attachment(IpCOS p, int doc, int page, String annotation)
throws Exception {
/* Check for Unicode file name */
String objtype = p
.pcos_get_string(doc, "type:" + annotation + "/FS/UF");
if (objtype.equals("string")) {
String val = p.pcos_get_string(doc, annotation + "/FS/UF");
System.out.println("Page " + (page + 1) + ", attachment '" + val
+ "', length "
+ get_attachment_contents(p, doc, annotation + "/FS/EF/F")
+ " bytes");
}
else {
/* Check for ASCII/native encoded file name */
objtype = p.pcos_get_string(doc, "type:" + annotation + "/FS/F");
if (objtype.equals("string")) {
String val = p.pcos_get_string(doc, annotation + "/FS/F");
System.out.println("Page " + (page + 1) + ", attachment '"
+ val + "', length "
+ get_attachment_contents(p, doc, annotation + "/FS/EF/F")
+ " bytes");
}
}
}
/**
* Retrieves the contents of the attachment.
*
* @param p
* IpCOS object
* @param doc
* document handle
* @param attachment_stream_path
* pCOS path to embedded file stream
*
* @return the length of the attachment in bytes
*
* @throws Exception
*/
private int get_attachment_contents(IpCOS p, int doc,
String attachment_stream_path) throws Exception {
byte[] attachment_contents = p.pcos_get_stream(doc, "",
attachment_stream_path);
return attachment_contents.length;
}
public attachments(String[] argv, String readable_name, String search_path) {
super(argv, readable_name, search_path);
}
public static void main(String argv[]) {
attachments example = new attachments(argv, "File attachments",
SEARCH_PATH);
example.execute();
}
}