Hey,

> > I'm currently writing an application which streams PDF data from the
> > network, then views it using Poppler.  Not only is it inconvenient, but
> > in this case, it is also legally dubious to save this data to disk for
> > the purposes of using poppler_document_new_from_file.
> 
> I'd buy the inconvenience argument but the legality one is sort of
> weak. What are we trying to prevent?

Well, for our specific example, we're dealing with medical reports, so
it becomes a patient data safety issue (ala HIPAA) to save the data to
the filesystem.

> This implementation copies a lot of the code poppler_document_from_file
> which is not ideal. It'd be better if the duplicate code could be
> shared.

Understandable.  I've cooked up a new patch with a shared method.
Should this method be inlined, or do we mind adding another method to
the stack?

-Brad

-- 
Brad Taylor
Genome Software
http://www.getcoded.net
Index: ChangeLog
===================================================================
RCS file: /cvs/poppler/poppler/ChangeLog,v
retrieving revision 1.450
diff -u -r1.450 ChangeLog
--- ChangeLog	19 Dec 2006 20:27:55 -0000	1.450
+++ ChangeLog	20 Dec 2006 23:01:35 -0000
@@ -1,3 +1,9 @@
+2006-12-20  Brad Taylor  <[EMAIL PROTECTED]>
+	
+	* poppler/glib/poppler-document.h:
+	* poppler/glib/poppler-document.cc: Add poppler_document_new_from_data
+	  to allow loading PDFs out of memory.
+
 2006-12-19  Albert Astals Cid <[EMAIL PROTECTED]>
 
 	* poppler/SplashOutputDev.cc: Fix gray calculation. Patch by Scott
Index: glib/poppler-document.cc
===================================================================
RCS file: /cvs/poppler/poppler/glib/poppler-document.cc,v
retrieving revision 1.37
diff -u -r1.37 poppler-document.cc
--- glib/poppler-document.cc	19 May 2006 22:12:38 -0000	1.37
+++ glib/poppler-document.cc	20 Dec 2006 23:01:35 -0000
@@ -61,6 +61,48 @@
 
 G_DEFINE_TYPE (PopplerDocument, poppler_document, G_TYPE_OBJECT);
 
+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
@@ -106,38 +148,55 @@
   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
+ * @start: the start position of #data
+ * @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          start,
+                                int          length,
+                                const char  *password,
+                                GError     **error)
+{
+  PopplerDocument *document;
+  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, start, 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: glib/poppler-document.h
===================================================================
RCS file: /cvs/poppler/poppler/glib/poppler-document.h,v
retrieving revision 1.21
diff -u -r1.21 poppler-document.h
--- glib/poppler-document.h	19 May 2006 22:19:21 -0000	1.21
+++ glib/poppler-document.h	20 Dec 2006 23:01:35 -0000
@@ -92,6 +92,11 @@
 PopplerDocument *poppler_document_new_from_file     (const char       *uri,
 						     const char       *password,
 						     GError          **error);
+PopplerDocument *poppler_document_new_from_data     (char             *data,
+						     int               start,
+						     int               length,
+						     const char       *password,
+						     GError          **error);
 gboolean         poppler_document_save              (PopplerDocument  *document,
 						     const char       *uri,
 						     GError          **error);

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
poppler mailing list
poppler@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to