From 368f41429bd8478e4d22f20c54523c6a28ee5bce Mon Sep 17 00:00:00 2001 From: miklosh Date: Wed, 4 Jul 2007 00:05:18 +0000 Subject: [PATCH] Initial commit of Cairo-based PDF import using libpoppler --- configure.ac | 32 ++++++ src/extension/init.cpp | 2 + src/extension/internal/Makefile_insert | 2 + src/extension/internal/pdf-input-cairo.cpp | 110 +++++++++++++++++++++ src/extension/internal/pdf-input-cairo.h | 51 ++++++++++ 5 files changed, 197 insertions(+) create mode 100644 src/extension/internal/pdf-input-cairo.cpp create mode 100644 src/extension/internal/pdf-input-cairo.h diff --git a/configure.ac b/configure.ac index 6dab04287..bae3fb78c 100644 --- a/configure.ac +++ b/configure.ac @@ -494,6 +494,38 @@ AM_CONDITIONAL(USE_LCMS, test "x$lcms" = "xyes") AC_SUBST(LCMS_CFLAGS) AC_SUBST(LCMS_LIBS) +dnl ****************************** +dnl Libpoppler checking +dnl ****************************** + +POPPLER_CFLAGS="" +PKG_CHECK_MODULES(POPPLER, poppler >= 0.5, poppler=yes, poppler=no) + +if test "x$poppler" = "xyes"; then + dnl Working libpoppler + POPPLER_LIBS="-lpoppler " + dnl Have to test libpoppler-glib presence + PKG_CHECK_MODULES(POPPLER_GLIB, poppler-glib >= 0.5, poppler_glib=yes, poppler_glib=no) + if test "x$poppler_glib" = "xyes"; then + dnl Working libpoppler-glib found + dnl Check whether the Cairo SVG backend is available + PKG_CHECK_MODULES(CAIRO_SVG, cairo-svg, cairo_svg=yes, cairo_svg=no) + if test "x$cairo_svg" = "xyes"; then + POPPLER_LIBS="$POPPLER_LIBS -lpoppler-glib " + fi + fi +fi + +if test "x$poppler" = "xyes"; then + LIBS="$LIBS $POPPLER_LIBS" + AC_DEFINE(HAVE_POPPLER, 1, [Use libpoppler for direct PDF import]) +fi +if test "x$poppler_glib" = "xyes" -a "x$cairo_svg" = "xyes"; then + AC_DEFINE(HAVE_POPPLER_GLIB, 1, [Use libpoppler-glib and Cairo-SVG for PDF import]) +fi +AC_SUBST(POPPLER_CFLAGS) +AC_SUBST(POPPLER_LIBS) + dnl ****************************** dnl Inkboard dependency checking dnl ****************************** 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 +#endif + +#ifdef HAVE_POPPLER_GLIB + +#include "pdf-input-cairo.h" +#include "extension/system.h" +#include "extension/input.h" +#include "document.h" + +#include +#include +#include +#include + +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( + "\n" + "PDF Input\n" + "org.inkscape.input.pdf\n" + "\n" + ".pdf\n" + "application/pdf\n" + "Adobe PDF (*.pdf)\n" + "PDF Document\n" + "\n" + "", 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 +#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 : -- 2.30.2