glib/demo/info.cc | 9 ++++ glib/poppler-document.cc | 52 ++++++++++++++++++++++++++++ glib/poppler-document.h | 3 + glib/reference/poppler-sections.txt | 1 poppler/PDFDoc.cc | 65 ++++++++++++++++++++++++++++++++++++ poppler/PDFDoc.h | 3 + 6 files changed, 133 insertions(+)
New commits: commit a5fec843dbb40fdd2007b926405b96789b21496d Author: Carlos Garcia Campos <[email protected]> Date: Fri Sep 17 10:38:14 2010 +0200 [glib-demo] Show permanent/update ID in document info demo diff --git a/glib/demo/info.cc b/glib/demo/info.cc index 87be8ea..8aa6dc8 100644 --- a/glib/demo/info.cc +++ b/glib/demo/info.cc @@ -118,6 +118,8 @@ pgd_info_create_widget (PopplerDocument *document) gchar *title, *format, *author, *subject; gchar *keywords, *creator, *producer, *linearized; gchar *metadata; + gchar *perm_id; + gchar *up_id; GTime creation_date, mod_date; GEnumValue *enum_value; PopplerBackend backend; @@ -211,6 +213,13 @@ pgd_info_create_widget (PopplerDocument *document) enum_value = g_enum_get_value ((GEnumClass *) g_type_class_peek (POPPLER_TYPE_PAGE_LAYOUT), layout); pgd_table_add_property (GTK_TABLE (table), "<b>Page Layout:</b>", enum_value->value_name, &row); + if (poppler_document_get_id (document, &perm_id, &up_id)) { + pgd_table_add_property (GTK_TABLE (table), "<b>Permanent ID:</b>", perm_id, &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Update ID:</b>", up_id, &row); + g_free (perm_id); + g_free (up_id); + } + pgd_info_add_permissions (GTK_TABLE (table), permissions, &row); pgd_info_add_metadata (GTK_TABLE (table), metadata, &row); commit bfaf8f3cc62f28c6255d42680b9464ab9973737e Author: Carlos Garcia Campos <[email protected]> Date: Fri Sep 17 10:37:32 2010 +0200 [glib] Add poppler_document_get_id() to get the PDF file identifier diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index 78c739d..aaa26b3 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -359,6 +359,58 @@ poppler_document_finalize (GObject *object) } /** + * poppler_document_get_id: + * @document: A #PopplerDocument + * @permanent_id: (out) (allow-none): location to store an allocated string, use g_free() to free the returned string + * @update_id: (out) (allow-none): location to store an allocated string, use g_free() to free the returned string + * + * Returns the PDF file identifier represented as two byte string arrays. + * @permanent_id is the permanent identifier that is built based on the file + * contents at the time it was originally created, so that this identifer + * never changes. @update_id is the update identifier that is built based on + * the file contents at the time it was last updated. + * + * Returns: %TRUE if the @document contains an id, %FALSE otherwise + * + * Since: 0.16 + */ +gboolean +poppler_document_get_id (PopplerDocument *document, + gchar **permanent_id, + gchar **update_id) +{ + GooString *permanent = NULL; + GooString *update = NULL; + gboolean retval = FALSE; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE); + + if (permanent_id) { + permanent = new GooString(); + *permanent_id = NULL; + } + + if (update_id) { + update = new GooString(); + *update_id = NULL; + } + + if (document->doc->getID (permanent, update)) { + if (permanent) + *permanent_id = g_strdup (permanent->getCString()); + if (update) + *update_id = g_strdup (update->getCString()); + + retval = TRUE; + } + + delete permanent; + delete update; + + return retval; +} + +/** * poppler_document_get_n_pages: * @document: A #PopplerDocument * diff --git a/glib/poppler-document.h b/glib/poppler-document.h index 6be824b..4dc7c99 100644 --- a/glib/poppler-document.h +++ b/glib/poppler-document.h @@ -170,6 +170,9 @@ gboolean poppler_document_save (PopplerDocument *document, gboolean poppler_document_save_a_copy (PopplerDocument *document, const char *uri, GError **error); +gboolean poppler_document_get_id (PopplerDocument *document, + gchar **permanent_id, + gchar **update_id); int poppler_document_get_n_pages (PopplerDocument *document); PopplerPage *poppler_document_get_page (PopplerDocument *document, int index); diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt index 6582766..344c3e2 100644 --- a/glib/reference/poppler-sections.txt +++ b/glib/reference/poppler-sections.txt @@ -111,6 +111,7 @@ poppler_document_new_from_file poppler_document_new_from_data poppler_document_save poppler_document_save_a_copy +poppler_document_get_id poppler_document_get_n_pages poppler_document_get_page poppler_document_get_page_by_label commit b15641677447b2e89853a667fc34bcca1383a97a Author: srinivas adicherla <[email protected]> Date: Fri Sep 17 10:36:22 2010 +0200 Add a method to get the PDF file identifier diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index e4ac639..385e367 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -71,6 +71,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 @@ -462,6 +463,70 @@ GBool PDFDoc::isLinearized() { return lin; } +static GBool +get_id (const char *encodedid, GooString *id) { + char pdfid[pdfIdLength + 1]; + int n; + + if (strlen(encodedid) != 16) + return gFalse; + + n = 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); + if (n != pdfIdLength) + return gFalse; + + id->Set(pdfid, pdfIdLength); + return gTrue; +} + +GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) { + Object obj; + xref->getTrailerDict()->dictLookup ("ID", &obj); + + if (obj.isArray() && obj.arrayGetLength() == 2) { + Object obj2; + + if (permanent_id) { + if (obj.arrayGet(0, &obj2)->isString()) { + if (!get_id (obj2.getString()->getCString(), permanent_id)) { + obj2.free(); + return gFalse; + } + } else { + error(-1, "Invalid permanent ID"); + obj2.free(); + return gFalse; + } + obj2.free(); + } + + if (update_id) { + if (obj.arrayGet(1, &obj2)->isString()) { + if (!get_id (obj2.getString()->getCString(), update_id)) { + obj2.free(); + return gFalse; + } + } else { + error(-1, "Invalid update ID"); + obj2.free(); + return gFalse; + } + obj2.free(); + } + + obj.free(); + + return gTrue; + } + obj.free(); + + return gFalse; +} + int PDFDoc::saveAs(GooString *name, PDFWriteMode mode) { FILE *f; OutStream *outStr; diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 6d7dea2..8fb4bcb 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -206,6 +206,9 @@ public: 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. _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
