diff options
| author | miklosh <miklosh@users.sourceforge.net> | 2007-07-04 00:05:18 +0000 |
|---|---|---|
| committer | miklosh <miklosh@users.sourceforge.net> | 2007-07-04 00:05:18 +0000 |
| commit | 7914003efc7fced33da77ff0f4f33390127b7275 (patch) | |
| tree | ceaf54450971212af97836f17b7a07258c6ee23a /src | |
| parent | Replaced blending modes example with a more detailed example (diff) | |
| download | inkscape-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.cpp | 2 | ||||
| -rw-r--r-- | src/extension/internal/Makefile_insert | 2 | ||||
| -rw-r--r-- | src/extension/internal/pdf-input-cairo.cpp | 110 | ||||
| -rw-r--r-- | src/extension/internal/pdf-input-cairo.h | 51 |
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 : |
