[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