> I don't see any reason to inline it. However, it should probably be made > static (gcc will inline it if it thinks that it's appropriate).
Sure, no problem. > Is there any reason the GlobalParams and password stuff can't be moved > into the common function? With GlobalParams, I didn't know enough about the internals to safely say that running those lines _after_ the creating a new PDFDoc wouldn't screw anything up. Say the word and I'll add it, but I just wanted to make sure that I was reading this all correctly. As far as the password, I don't see how this can be moved to the common function, since its required when new_from_file and new_from_data each construct their own PDFDoc objects. > Also, I don't see any reason for the start parameter. I'd imagine most > users would pass in zero. If the user wants to start at a different > place, I think it makes sense for them to do the pointer addition > themselves. The only reason that I added that parameter is that MemStream required it, so I figured it might be useful to someone. I've attached a new patch with the static addition, and a bit of cleanup of unused variables. Let me know if you want to go forward with the changes we're discussing and I'll attach an updated patch. -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:57:21 -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:57:21 -0000
@@ -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,54 @@
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)
+{
+ 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:57:21 -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 [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
