summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authormiklosh <miklosh@users.sourceforge.net>2007-07-04 00:05:18 +0000
committermiklosh <miklosh@users.sourceforge.net>2007-07-04 00:05:18 +0000
commit7914003efc7fced33da77ff0f4f33390127b7275 (patch)
treeceaf54450971212af97836f17b7a07258c6ee23a /src
parentReplaced blending modes example with a more detailed example (diff)
downloadinkscape-7914003efc7fced33da77ff0f4f33390127b7275.tar.gz
inkscape-7914003efc7fced33da77ff0f4f33390127b7275.zip
Initial commit of Cairo-based PDF import using libpoppler
(bzr r3175)
Diffstat (limited to 'src')
-rw-r--r--src/extension/init.cpp2
-rw-r--r--src/extension/internal/Makefile_insert2
-rw-r--r--src/extension/internal/pdf-input-cairo.cpp110
-rw-r--r--src/extension/internal/pdf-input-cairo.h51
4 files changed, 165 insertions, 0 deletions
diff --git a/src/extension/init.cpp b/src/extension/init.cpp
index 75f825f24..a8129fc8b 100644
--- a/src/extension/init.cpp
+++ b/src/extension/init.cpp
@@ -43,6 +43,7 @@
# include "internal/cairo-png-out.h"
# include "internal/cairo-ps-out.h"
#endif
+#include "internal/pdf-input-cairo.h"
#include "internal/pov-out.h"
#include "internal/odf.h"
#include "internal/latex-pstricks-out.h"
@@ -124,6 +125,7 @@ init()
}
Internal::CairoPsOutput::init();
#endif
+ Internal::PdfInputCairo::init();
#ifdef WITH_GNOME_PRINT
Internal::PrintGNOME::init();
#endif
diff --git a/src/extension/internal/Makefile_insert b/src/extension/internal/Makefile_insert
index 6c4dc9556..8886254da 100644
--- a/src/extension/internal/Makefile_insert
+++ b/src/extension/internal/Makefile_insert
@@ -29,6 +29,8 @@ extension_internal_libinternal_a_SOURCES = \
extension/internal/ps-out.cpp \
extension/internal/pdf-cairo.cpp \
extension/internal/pdf-cairo.h \
+ extension/internal/pdf-input-cairo.cpp \
+ extension/internal/pdf-input-cairo.h \
extension/internal/cairo-pdf-out.h \
extension/internal/cairo-pdf-out.cpp \
extension/internal/cairo-ps-out.h \
diff --git a/src/extension/internal/pdf-input-cairo.cpp b/src/extension/internal/pdf-input-cairo.cpp
new file mode 100644
index 000000000..2b38481e1
--- /dev/null
+++ b/src/extension/internal/pdf-input-cairo.cpp
@@ -0,0 +1,110 @@
+ /*
+ * Simple PDF import extension using libpoppler and Cairo's SVG surface.
+ *
+ * Authors:
+ * miklos erdelyi
+ *
+ * Copyright (C) 2007 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_POPPLER_GLIB
+
+#include "pdf-input-cairo.h"
+#include "extension/system.h"
+#include "extension/input.h"
+#include "document.h"
+
+#include <cairo-svg.h>
+#include <poppler/glib/poppler.h>
+#include <poppler/glib/poppler-document.h>
+#include <poppler/glib/poppler-page.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+
+static cairo_status_t _write_ustring_cb(void *closure, const unsigned char *data, unsigned int length);
+
+SPDocument *
+PdfInputCairo::open(Inkscape::Extension::Input * mod, const gchar * uri) {
+
+ gchar* filename_uri = g_filename_to_uri(uri, NULL, NULL);
+
+ PopplerDocument* document = poppler_document_new_from_file(filename_uri, NULL, NULL);
+ if (document == NULL)
+ return NULL;
+
+ double width, height;
+ PopplerPage* page = poppler_document_get_page(document, 0);
+ poppler_page_get_size(page, &width, &height);
+
+ Glib::ustring* output = new Glib::ustring("");
+ cairo_surface_t* surface = cairo_svg_surface_create_for_stream(Inkscape::Extension::Internal::_write_ustring_cb,
+ output, width, height);
+ cairo_t* cr = cairo_create(surface);
+
+ poppler_page_render(page, cr);
+ cairo_show_page(cr);
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(surface);
+
+ SPDocument * doc = sp_document_new_from_mem(output->c_str(), output->length(), TRUE);
+
+ delete output;
+ g_object_unref(page);
+ g_object_unref(document);
+
+ return doc;
+}
+
+static cairo_status_t
+ _write_ustring_cb(void *closure, const unsigned char *data, unsigned int length)
+{
+ Glib::ustring* stream = (Glib::ustring*)closure;
+ stream->append((const char*)data, length);
+
+ return CAIRO_STATUS_SUCCESS;
+}
+
+
+#include "clear-n_.h"
+
+void
+PdfInputCairo::init(void) {
+ Inkscape::Extension::Extension * ext;
+
+ ext = Inkscape::Extension::build_from_mem(
+ "<inkscape-extension>\n"
+ "<name>PDF Input</name>\n"
+ "<id>org.inkscape.input.pdf</id>\n"
+ "<input>\n"
+ "<extension>.pdf</extension>\n"
+ "<mimetype>application/pdf</mimetype>\n"
+ "<filetypename>Adobe PDF (*.pdf)</filetypename>\n"
+ "<filetypetooltip>PDF Document</filetypetooltip>\n"
+ "</input>\n"
+ "</inkscape-extension>", new PdfInputCairo());
+} // init
+
+} } } /* namespace Inkscape, Extension, Implementation */
+
+#endif /* HAVE_POPPLER_GLIB */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/extension/internal/pdf-input-cairo.h b/src/extension/internal/pdf-input-cairo.h
new file mode 100644
index 000000000..5715b57c9
--- /dev/null
+++ b/src/extension/internal/pdf-input-cairo.h
@@ -0,0 +1,51 @@
+#ifndef __EXTENSION_INTERNAL_PDFINPUTCAIRO_H__
+#define __EXTENSION_INTERNAL_PDFINPUTCAIRO_H__
+
+/*
+ * PDF input using libpoppler and Cairo's SVG surface.
+ *
+ * Authors:
+ * miklos erdelyi
+ *
+ * Copyright (C) 2007 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_POPPLER_GLIB
+
+#include "../implementation/implementation.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+
+class PdfInputCairo: public Inkscape::Extension::Implementation::Implementation {
+ PdfInputCairo () { };
+public:
+ SPDocument *open( Inkscape::Extension::Input *mod,
+ const gchar *uri );
+ static void init( void );
+
+};
+
+} } } /* namespace Inkscape, Extension, Implementation */
+
+#endif /* HAVE_POPPLER_GLIB */
+
+#endif /* __EXTENSION_INTERNAL_PDFINPUTCAIRO_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :