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 14 Dec 2006 17:39:51 -0000 @@ -141,6 +141,87 @@ } /** + * 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; + + document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, NULL, NULL); + + if (!globalParams) { + globalParams = new GlobalParams("/etc/xpdfrc"); + } + + // create stream + obj.initNull(); + str = new MemStream(data, start, length, &obj); + + password_g = NULL; + if (password != NULL) + password_g = new GooString (password); + + newDoc = new PDFDoc(str, password_g, password_g); + 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 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_save: * @document: a #PopplerDocument * @uri: uri of file to save 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 14 Dec 2006 17:39:51 -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);