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);
signature.asc
Description: This is a digitally signed message part
_______________________________________________ poppler mailing list poppler@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/poppler