[poppler] poppler/glib: poppler-document.cc, 1.37, 1.38 poppler-document.h, 1.21, 1.22

Jeff Muizelaar jrmuizel at kemper.freedesktop.org
Thu Dec 28 20:12:42 PST 2006


Update of /cvs/poppler/poppler/glib
In directory kemper:/tmp/cvs-serv19992/glib

Modified Files:
	poppler-document.cc poppler-document.h 
Log Message:
2006-12-28  Brad Taylor  <brad at getcoded.net>
	
	* poppler/glib/poppler-document.h:
	* poppler/glib/poppler-document.cc: Add poppler_document_new_from_data
	  to allow loading PDFs out of memory.


Index: poppler-document.cc
===================================================================
RCS file: /cvs/poppler/poppler/glib/poppler-document.cc,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -d -r1.37 -r1.38
--- poppler-document.cc	19 May 2006 22:12:38 -0000	1.37
+++ poppler-document.cc	29 Dec 2006 04:12:40 -0000	1.38
@@ -61,6 +61,48 @@
 
 G_DEFINE_TYPE (PopplerDocument, poppler_document, G_TYPE_OBJECT);
 
+static PopplerDocument *
+_poppler_document_new_from_pdfdoc (PDFDoc  *newDoc,
+                                   GError **error)
+{
+  PopplerDocument *document;
+  int err;
+
+  document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, NULL, NULL);
+
+  if (!newDoc->isOk()) {
+    err = newDoc->getErrorCode();
+    delete newDoc;
+    if (err == errEncrypted) {
+      g_set_error (error, POPPLER_ERROR,
+		   POPPLER_ERROR_ENCRYPTED,
+		   "Document is encrypted.");
+    } else {
+      g_set_error (error, G_FILE_ERROR,
+		   G_FILE_ERROR_FAILED,
+		   "Failed to load document from data (error %d)'\n",
+		   err);
+    }
+
+    return NULL;
+  }
+
+  document->doc = newDoc;
+
+#if defined (HAVE_CAIRO)
+  document->output_dev = new CairoOutputDev ();
+#elif defined (HAVE_SPLASH)
+  SplashColor white;
+  white[0] = 255;
+  white[1] = 255;
+  white[2] = 255;
+  document->output_dev = new SplashOutputDev(splashModeRGB8, 4, gFalse, white);
+#endif
+  document->output_dev->startDoc(document->doc->getXRef ());
+
+  return document;
+}
+
 /**
  * poppler_document_new_from_file:
  * @uri: uri of the file to load
@@ -78,15 +120,12 @@
 				const char  *password,
 				GError     **error)
 {
-  PopplerDocument *document;
   PDFDoc *newDoc;
   GooString *filename_g;
   GooString *password_g;
   int err;
   char *filename;
 
-  document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, NULL, NULL);
-  
   if (!globalParams) {
     globalParams = new GlobalParams("/etc/xpdfrc");
   }
@@ -106,38 +145,52 @@
   if (password_g)
     delete password_g;
 
-  if (!newDoc->isOk()) {
-    err = newDoc->getErrorCode();
-    delete newDoc;
-    if (err == errEncrypted) {
-      g_set_error (error, POPPLER_ERROR,
-		   POPPLER_ERROR_ENCRYPTED,
-		   "Document is encrypted.");
-    } else {
-      g_set_error (error, G_FILE_ERROR,
-		   G_FILE_ERROR_FAILED,
-		   "Failed to load document (error %d) '%s'\n",
-		   err,
-		   uri);
-    }
+  return _poppler_document_new_from_pdfdoc (newDoc, error);
+}
 
-    return NULL;
+/**
+ * poppler_document_new_from_data:
+ * @data: the pdf data contained in a char array
+ * @length: the length of #data
+ * @password: password to unlock the file with, or %NULL
+ * @error: Return location for an error, or %NULL
+ * 
+ * Creates a new #PopplerDocument.  If %NULL is returned, then @error will be
+ * set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR
+ * domains.
+ * 
+ * Return value: A newly created #PopplerDocument, or %NULL
+ **/
+PopplerDocument *
+poppler_document_new_from_data (char        *data,
+                                int          length,
+                                const char  *password,
+                                GError     **error)
+{
+  Object obj;
+  PDFDoc *newDoc;
+  MemStream *str;
+  GooString *password_g;
+  int err;
+  char *filename;
+
+  if (!globalParams) {
+    globalParams = new GlobalParams("/etc/xpdfrc");
   }
+  
+  // create stream
+  obj.initNull();
+  str = new MemStream(data, 0, length, &obj);
 
-  document->doc = newDoc;
+  password_g = NULL;
+  if (password != NULL)
+    password_g = new GooString (password);
 
-#if defined (HAVE_CAIRO)
-  document->output_dev = new CairoOutputDev ();
-#elif defined (HAVE_SPLASH)
-  SplashColor white;
-  white[0] = 255;
-  white[1] = 255;
-  white[2] = 255;
-  document->output_dev = new SplashOutputDev(splashModeRGB8, 4, gFalse, white);
-#endif
-  document->output_dev->startDoc(document->doc->getXRef ());
+  newDoc = new PDFDoc(str, password_g, password_g);
+  if (password_g)
+    delete password_g;
 
-  return document;
+  return _poppler_document_new_from_pdfdoc (newDoc, error);
 }
 
 /**

Index: poppler-document.h
===================================================================
RCS file: /cvs/poppler/poppler/glib/poppler-document.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- poppler-document.h	19 May 2006 22:19:21 -0000	1.21
+++ poppler-document.h	29 Dec 2006 04:12:40 -0000	1.22
@@ -92,6 +92,10 @@
 PopplerDocument *poppler_document_new_from_file     (const char       *uri,
 						     const char       *password,
 						     GError          **error);
+PopplerDocument *poppler_document_new_from_data     (char             *data,
+						     int               length,
+						     const char       *password,
+						     GError          **error);
 gboolean         poppler_document_save              (PopplerDocument  *document,
 						     const char       *uri,
 						     GError          **error);



More information about the poppler mailing list