Hi,

   I attached a patch for getting the pdf ID.
   If anybody have any queries I put the same thing in
[email protected]. Any suggestions are accepted.

Thanks
--
A Srinivas
Index: poppler-0.14.0/poppler/PDFDoc.h
===================================================================
--- poppler-0.14.0/poppler/PDFDoc.h	(revision 3)
+++ poppler-0.14.0/poppler/PDFDoc.h	(working copy)
@@ -206,6 +206,9 @@
   int getPDFMajorVersion() { return pdfMajorVersion; }
   int getPDFMinorVersion() { return pdfMinorVersion; }
 
+  //Return the PDF ID in the trailer dictionary (if any).
+  GBool getID(GooString *permanent_id, GooString *update_id);
+
   // Save this file with another name.
   int saveAs(GooString *name, PDFWriteMode mode=writeStandard);
   // Save this file in the given output stream.
Index: poppler-0.14.0/poppler/PDFDoc.cc
===================================================================
--- poppler-0.14.0/poppler/PDFDoc.cc	(revision 3)
+++ poppler-0.14.0/poppler/PDFDoc.cc	(working copy)
@@ -70,6 +70,7 @@
 
 #define headerSearchSize 1024	// read this many bytes at beginning of
 				//   file to look for '%PDF'
+#define pdfIdLength 32   // PDF Document IDs (PermanentId, UpdateId) length
 
 //------------------------------------------------------------------------
 // PDFDoc
@@ -445,6 +446,58 @@
   return lin;
 }
 
+static bool
+get_id(Object val, GooString *id) {
+  char pdfid[pdfIdLength+1];
+  if (val.isString()) {
+      GooString *temp;
+      temp = val.getString();
+      if (temp->getLength() != 16) { // security check
+        return false;
+      } else {
+	char *encodedid = temp->getCString();
+	sprintf(pdfid,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", encodedid[0] & 0xff, encodedid[1] & 0xff, encodedid[2] & 0xff, encodedid[3] & 0xff, encodedid[4] & 0xff, encodedid[5] & 0xff, encodedid[6] & 0xff, encodedid[7] & 0xff, encodedid[8] & 0xff, encodedid[9] & 0xff, encodedid[10] & 0xff, encodedid[11] & 0xff, encodedid[12] & 0xff, encodedid[13] & 0xff, encodedid[14] & 0xff, encodedid[15] & 0xff);
+        id->Set (pdfid, pdfIdLength);
+      }
+  } else {
+      return false;
+  }
+  return true;
+}
+
+GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) {
+  Object obj;
+  xref->getTrailerDict()->dictLookup ("ID", &obj);
+
+  if (!obj.isArray())
+  {
+    obj.free();
+    return false;
+  } else if (obj.arrayGetLength() != 2) { // security check
+    return false;
+  }	
+
+  Object val1, val2;	
+  obj.arrayGet(0, &val1);
+  obj.arrayGet(1, &val2);
+  
+  obj.free();
+ 
+  if (!permanent_id && !update_id) {// security check
+    return false;
+  } else {
+    bool pid, uid;
+    pid = get_id (val1, permanent_id);
+    uid = get_id (val2, update_id);
+    if (!pid && !uid)
+      return false;
+  }
+  
+  val1.free();
+  val2.free();
+  return true;
+}
+
 int PDFDoc::saveAs(GooString *name, PDFWriteMode mode) {
   FILE *f;
   OutStream *outStr;
Index: poppler-0.14.0/glib/poppler.h
===================================================================
--- poppler-0.14.0/glib/poppler.h	(revision 3)
+++ poppler-0.14.0/glib/poppler.h	(working copy)
@@ -80,6 +80,7 @@
 } PopplerSelectionStyle;
 
 typedef struct _PopplerDocument            PopplerDocument;
+typedef struct _PopplerDocumentId          PopplerDocumentId;
 typedef struct _PopplerIndexIter           PopplerIndexIter;
 typedef struct _PopplerFontsIter           PopplerFontsIter;
 typedef struct _PopplerLayersIter          PopplerLayersIter;
Index: poppler-0.14.0/glib/poppler-document.cc
===================================================================
--- poppler-0.14.0/glib/poppler-document.cc	(revision 3)
+++ poppler-0.14.0/glib/poppler-document.cc	(working copy)
@@ -54,7 +54,9 @@
 	PROP_PAGE_MODE,
 	PROP_VIEWER_PREFERENCES,
 	PROP_PERMISSIONS,
-	PROP_METADATA
+	PROP_METADATA,
+	PROP_PERMANENT_ID,
+	PROP_UPDATE_ID
 };
 
 static void poppler_document_layers_free (PopplerDocument *document);
@@ -647,7 +649,8 @@
   Catalog *catalog;
   gchar *str;
   guint flag;
-
+  GooString permanent_id, update_id;
+  
   switch (prop_id)
     {
     case PROP_TITLE:
@@ -762,6 +765,14 @@
 	  }
 	}
       break;
+    case PROP_PERMANENT_ID:
+      if (document->doc->getID (&permanent_id, NULL))
+        g_value_set_string (value, permanent_id.getCString());
+      break;
+    case PROP_UPDATE_ID:
+      if (document->doc->getID (NULL, &update_id))
+        g_value_set_string (value, update_id.getCString());
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -931,6 +942,25 @@
 				"Embedded XML metadata",
 				NULL,
 				G_PARAM_READABLE));
+
+  g_object_class_install_property
+	  (G_OBJECT_CLASS (klass),
+	   PROP_PERMANENT_ID,
+	   g_param_spec_string ("permanent-id",
+				"Permanent Id",
+				"Permanent Id of the PDF Document",
+				NULL,
+				G_PARAM_READABLE));
+
+    g_object_class_install_property
+	  (G_OBJECT_CLASS (klass),
+	   PROP_UPDATE_ID,
+	   g_param_spec_string ("update-id",
+				"Update Id",
+				"Update Id of the PDF Document",
+				NULL,
+				G_PARAM_READABLE));
+
 }
 
 static void
@@ -1928,7 +1958,83 @@
   return NULL;
 }
 
+/* PopplerDocumentId type */
+POPPLER_DEFINE_BOXED_TYPE (PopplerDocumentId, poppler_document_id,
+			    poppler_document_id_copy, 
+			    poppler_document_id_free)
+
+/**
+ * poppler_document_id_new:
+ * 
+ * creates a new #PopplerDocumentId
+ *
+ **/
+PopplerDocumentId *
+poppler_document_id_new (void)
+{
+  return g_new0 (PopplerDocumentId, 1);
+}
+
+/**
+ * poppler_document_id_copy:
+ * @id: a #PopplerDocumentId
+ * 
+ * Creates a new #PopplerDocumentId as a copy of @id. This must be freed with
+ * poppler_document_id_free().
+ * 
+ * Return value: a new #PopplerDocumentId
+ **/
+PopplerDocumentId *
+poppler_document_id_copy (PopplerDocumentId *id)
+{
+  PopplerDocumentId *new_id;
+
+  g_return_val_if_fail (id != NULL, NULL);
+  
+  new_id = g_new (PopplerDocumentId, 1);
+  *new_id = *id;
+
+  return new_id;
+}
+
+/**
+ * poppler_document_id_free:
+ * @id: a #PopplerDocumentId
+ * 
+ * Frees @id
+ * 
+ **/
+void
+poppler_document_id_free (PopplerDocumentId *id)
+{
+  g_free (id);
+}
+
+/**
+ * poppler_document_get_id: 	
+ * @document: a #PopplerDocument
+ * @documentid: a #PopplerDocumentId
+ *
+ * Returns true if the pdf file contains the ID
+ *
+ * Return value: a gboolean. %TRUE if document contains an ID else %FALSE
+ **/
 gboolean
+poppler_document_get_id (PopplerDocument *document, PopplerDocumentId *documentid)
+{
+  GooString permanent_id,update_id;
+
+  if (document->doc->getID (&permanent_id, &update_id)) {
+    g_stpcpy(documentid->permanent_id,permanent_id.getCString());
+    g_stpcpy(documentid->update_id,update_id.getCString());
+
+    return TRUE;
+  } else {
+      return FALSE;	
+  }
+}
+
+gboolean
 _poppler_convert_pdf_date_to_gtime (GooString *date,
 				    time_t    *gdate) 
 {
Index: poppler-0.14.0/glib/poppler-document.h
===================================================================
--- poppler-0.14.0/glib/poppler-document.h	(revision 3)
+++ poppler-0.14.0/glib/poppler-document.h	(working copy)
@@ -22,6 +22,8 @@
 #include <glib-object.h>
 #include "poppler.h"
 
+#define DOC_ID_LENGTH 33   // 32 bytes for each of the PDF ID (Permanent Id , Update Id) length, and 1 byte for '\0'
+
 G_BEGIN_DECLS
 
 #define POPPLER_TYPE_DOCUMENT             (poppler_document_get_type ())
@@ -89,6 +91,11 @@
 
 } PopplerPermissions;
 
+struct _PopplerDocumentId
+{
+  gchar permanent_id[DOCUMENT_ID_LENGTH];
+  gchar update_id[DOCUMENT_ID_LENGTH];
+};
 
 
 GType            poppler_document_get_type          (void) G_GNUC_CONST;
@@ -122,6 +129,15 @@
 PopplerFormField *poppler_document_get_form_field   (PopplerDocument  *document,
 						     gint              id);
 
+/* Document Id */
+#define POPPLER_TYPE_DOCUMENT_ID                (poppler_document_id_get_type ())
+GType              poppler_document_id_get_type (void) G_GNUC_CONST;
+PopplerDocumentId *poppler_document_id_new      (void);
+PopplerDocumentId *poppler_document_id_copy     (PopplerDocumentId *id);
+void		    poppler_document_id_free     (PopplerDocumentId *id);	
+gboolean	    poppler_document_get_id      (PopplerDocument *document,
+					          PopplerDocumentId *documentid); 
+
 /* Interface for getting the Index of a poppler_document */
 #define POPPLER_TYPE_INDEX_ITER                 (poppler_index_iter_get_type ())
 GType             poppler_index_iter_get_type   (void) G_GNUC_CONST;
_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to