Hi,

  By considering valuable suggestions from all, I created 3 patches to get
the ID from the PDF document.

All patches do the same. But the implementation has different. I request all
to give suggestions that which is the good way, and if there is any other
better way
please let  me know.

Explanation:

patch1:
         Here I wrote getPermanentID() & getUpdateID() seperate functions.
I called these from poppler-glib to get the entire ID and return the
structure PopplerDocumentId.
         But here the repetetion of the code for getting "ID" object from
trailer dictionary and check the conditions. To elimante that,

pathc2:
         I wrote one more function getID(GooString *id, int index) in
PDFDoc.cc, and calling this from getPermanentID() and getUpdateID(), by
passing appropriate index.
         To eliminate this index thing,

patch3:
         I declare one enum PDFID
                             {
                                  permanentID,
                                  updateID
                             }
               and remove getPermanentID() and getUpdateID() functions.
Added getID(GooString *id, PDFID idType)

Iam not at good in giving names to variable & functions. Please give me
suggestions.

Please let me know when you commit this patch. If any of the patch is
considered from the above.

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,10 @@
   int getPDFMajorVersion() { return pdfMajorVersion; }
   int getPDFMinorVersion() { return pdfMinorVersion; }
 
+  //Return the PDF ID in the trailer dictionary (if any).
+  GBool getPermanentID(GooString *permanent_id);
+  GBool getUpdateID(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,79 @@
   return lin;
 }
 
+static void
+get_id(char* encodedid, char *pdfid) {
+  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);
+}
+
+GBool PDFDoc::getPermanentID(GooString *permanent_id) {
+  char tmpid[docIdLength+1];
+  Object obj;
+  xref->getTrailerDict()->dictLookup ("ID", &obj);
+
+  if (!obj.isArray())
+  {
+    obj.free();
+    return false;
+  } else if (obj.arrayGetLength() != 2) { // security check
+    return false;
+  }	
+  
+  Object val;	
+  obj.arrayGet(0,&val);
+  obj.free();
+
+  if (val.isString()) {
+    GooString *temp;
+    temp = val.getString();
+    if (temp->getLength() != 16) { // security check
+      return false;
+    } else {
+      get_id (temp->getCString(), tmpid);
+      permanent_id->Set (tmpid, pdfIdLength);
+    }
+  } else {
+    return false;
+  }
+
+  val.free();
+  return true;
+}
+
+GBool PDFDoc::getUpdateID(GooString *update_id) {
+  char tmpid[docIdLength+1];
+  Object obj;
+  xref->getTrailerDict()->dictLookup("ID", &obj);
+
+  if (!obj.isArray())
+  {
+    obj.free();
+    return false;
+  } else if (obj.arrayGetLength() != 2) { // security check
+    return false;
+  }	
+
+  Object val;	
+  obj.arrayGet(1, &val);
+  obj.free();
+
+  if (val.isString()) {
+    GooString *temp;
+    temp = val.getString();
+    if (temp->getLength() != 16) { // security check
+      return false;
+    } else {
+      get_id (temp->getCString(), tmpid);
+      update_id->Set (tmpid, pdfIdLength);
+    }
+  } else {
+    return false;
+  }
+ 
+  val.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->getPermanentID (&permanent_id))
+        g_value_set_string (value, permanent_id.getCString());
+      break;
+    case PROP_UPDATE_ID:
+      if (document->doc->getUpdateID (&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,84 @@
   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->getPermanentID (&permanent_id) &&
+      document->doc->getUpdateID (&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;
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,11 @@
   int getPDFMajorVersion() { return pdfMajorVersion; }
   int getPDFMinorVersion() { return pdfMinorVersion; }
 
+  //Return the PDF ID in the trailer dictionary (if any).
+  GBool getPermanentID(GooString *permanent_id);
+  GBool getUpdateID(GooString *update_id);
+  GBool getID(GooString *id, int index);
+
   // 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,53 @@
   return lin;
 }
 
+static void
+get_id(char* encodedid, char *pdfid) {
+  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);
+}
+
+GBool PDFDoc::getID(GooString *id, int index) {
+  char tmpid[pdfIdLength+1];
+  Object obj;
+  xref->getTrailerDict()->dictLookup("ID", &obj);
+
+  if (!obj.isArray())
+  {
+    obj.free();
+    return false;
+  } else if (obj.arrayGetLength() != 2) { // security check
+    return false;
+  }	
+
+  Object val;	
+  obj.arrayGet(index, &val);
+  obj.free();
+
+  if (val.isString()) {
+    GooString *temp;
+    temp = val.getString();
+    if (temp->getLength() != 16) { // security check
+      return false;
+    } else {
+      get_id(temp->getCString(), tmpid);
+      id->Set(tmpid, docIdLength);
+    }
+  } else {
+    return false;
+  }
+
+  val.free();
+  return true;
+}
+
+GBool PDFDoc::getPermanentID(GooString *permanent_id) {
+  return getID(permanent_id, 0);
+}
+
+GBool PDFDoc::getUpdateID(GooString *update_id) {
+  return getID(update_id, 1);
+}
+
 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->getPermanentID (&permanent_id))
+        g_value_set_string (value, permanent_id.getCString());
+      break;
+    case PROP_UPDATE_ID:
+      if (document->doc->getUpdateID (&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,84 @@
   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->getPermanentID (&permanent_id) &&
+      document->doc->getUpdateID (&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;
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)
@@ -55,6 +55,11 @@
   writeForceIncremental
 };
 
+enum PDFID {
+  permanentID,
+  updateID
+};
+
 //------------------------------------------------------------------------
 // PDFDoc
 //------------------------------------------------------------------------
@@ -206,6 +211,9 @@
   int getPDFMajorVersion() { return pdfMajorVersion; }
   int getPDFMinorVersion() { return pdfMinorVersion; }
 
+  //Return the PDF ID in the trailer dictionary (if any).
+  GBool getID(GooString *id, PDFID idType);
+
   // 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,52 @@
   return lin;
 }
 
+static void
+get_id(char* encodedid, char *pdfid) {
+  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);
+}
+
+GBool PDFDoc::getID(GooString *id, PDFID idType) {
+  char tmpid[pdfIdLength+1];
+  Object obj;
+  xref->getTrailerDict()->dictLookup ("ID", &obj);
+
+  if (!obj.isArray())
+  {
+    obj.free();
+    return false;
+  } else if (obj.arrayGetLength() != 2) { // security check
+    return false;
+  }	
+
+  Object val;	
+  if (idType == permanentID) {
+    obj.arrayGet(0, &val);
+  } else if(idType == updateID) {
+    obj.arrayGet(1, &val);
+  } else {
+    return false;
+  }
+ 
+  obj.free();
+
+  if (val.isString()) {
+    GooString *temp;
+    temp = val.getString();
+    if (temp->getLength() != 16) { // security check
+      return false;
+    } else {
+      get_id (temp->getCString(), tmpid);
+      id->Set (tmpid, pdfIdLength);
+    }
+  } else {
+    return false;
+  }
+
+  val.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, permanentID))
+        g_value_set_string (value, permanent_id.getCString());
+      break;
+    case PROP_UPDATE_ID:
+      if (document->doc->getID (&update_id, updateID))
+        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, permanentID) &&
+      document->doc->getID (&update_id, updateID)) {
+    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