X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=pdf%2Fev-poppler.cc;h=7b55b08cbdbc2ec286351c20349c15741ff6d3fa;hb=ead6ec8b0cbdafc334fff0b3b5f9f79067af1e86;hp=4ca7d01798921e3600a00134479ab457d0a2a2d7;hpb=067a8759e04f2c657eb49c26263b75e3ac26a706;p=evince.git diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 4ca7d017..7b55b08c 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -32,13 +32,6 @@ #include "ev-document-security.h" #include "ev-document-thumbnails.h" - -enum { - PROP_0, - PROP_TITLE -}; - - typedef struct { PdfDocument *document; char *text; @@ -58,6 +51,7 @@ struct _PdfDocument GObject parent_instance; PopplerDocument *document; + PopplerPSFile *ps_file; gchar *password; PdfDocumentSearch *search; @@ -68,6 +62,7 @@ static void pdf_document_security_iface_init (EvDocumentSecurityIface static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface); static void pdf_document_find_iface_init (EvDocumentFindIface *iface); +static void pdf_document_ps_exporter_iface_init (EvPSExporterIface *iface); static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, gint page, gint size, @@ -88,44 +83,13 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, pdf_document_document_links_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, pdf_document_find_iface_init); -#if 0 G_IMPLEMENT_INTERFACE (EV_TYPE_PS_EXPORTER, pdf_document_ps_exporter_iface_init); -#endif }); - - - - - -static void -pdf_document_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - PdfDocument *pdf_document = PDF_DOCUMENT (object); - - switch (prop_id) - { - case PROP_TITLE: - if (pdf_document->document == NULL) - g_value_set_string (value, NULL); - else - g_object_get_property (G_OBJECT (pdf_document->document), "title", value); - break; - } -} - static void pdf_document_class_init (PdfDocumentClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->get_property = pdf_document_get_property; - - g_object_class_override_property (gobject_class, PROP_TITLE, "title"); } static void @@ -228,7 +192,7 @@ pdf_document_get_page_label (EvDocument *document, poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document, page); - g_object_get (poppler_page, + g_object_get (G_OBJECT (poppler_page), "label", &label, NULL); @@ -328,6 +292,111 @@ pdf_document_set_password (EvDocumentSecurity *document_security, document->password = g_strdup (password); } +static gboolean +pdf_document_can_get_text (EvDocument *document) +{ + return TRUE; +} + +static EvDocumentInfo * +pdf_document_get_info (EvDocument *document) +{ + EvDocumentInfo *info; + PopplerPageLayout layout; + PopplerPageMode mode; + PopplerViewerPreferences view_prefs; + + info = g_new0 (EvDocumentInfo, 1); + + info->fields_mask = EV_DOCUMENT_INFO_TITLE | + EV_DOCUMENT_INFO_FORMAT | + EV_DOCUMENT_INFO_AUTHOR | + EV_DOCUMENT_INFO_SUBJECT | + EV_DOCUMENT_INFO_KEYWORDS | + EV_DOCUMENT_INFO_LAYOUT | + EV_DOCUMENT_INFO_START_MODE | + /* Missing EV_DOCUMENT_INFO_CREATION_DATE | */ + EV_DOCUMENT_INFO_UI_HINTS; + + + g_object_get (PDF_DOCUMENT (document)->document, + "title", &(info->title), + "format", &(info->format), + "author", &(info->author), + "subject", &(info->subject), + "keywords", &(info->keywords), + "page-mode", &mode, + "page-layout", &layout, + "viewer-preferences", &view_prefs, + NULL); + + switch (layout) { + case POPPLER_PAGE_LAYOUT_SINGLE_PAGE: + info->layout = EV_DOCUMENT_LAYOUT_SINGLE_PAGE; + break; + case POPPLER_PAGE_LAYOUT_ONE_COLUMN: + info->layout = EV_DOCUMENT_LAYOUT_ONE_COLUMN; + break; + case POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT: + info->layout = EV_DOCUMENT_LAYOUT_TWO_COLUMN_LEFT; + break; + case POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT: + info->layout = EV_DOCUMENT_LAYOUT_TWO_COLUMN_RIGHT; + case POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT: + info->layout = EV_DOCUMENT_LAYOUT_TWO_PAGE_LEFT; + break; + case POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT: + info->layout = EV_DOCUMENT_LAYOUT_TWO_PAGE_RIGHT; + break; + default: + break; + } + + switch (mode) { + case POPPLER_PAGE_MODE_NONE: + info->mode = EV_DOCUMENT_MODE_NONE; + break; + case POPPLER_PAGE_MODE_USE_THUMBS: + info->mode = EV_DOCUMENT_MODE_USE_THUMBS; + break; + case POPPLER_PAGE_MODE_USE_OC: + info->mode = EV_DOCUMENT_MODE_USE_OC; + break; + case POPPLER_PAGE_MODE_FULL_SCREEN: + info->mode = EV_DOCUMENT_MODE_FULL_SCREEN; + break; + case POPPLER_PAGE_MODE_USE_ATTACHMENTS: + info->mode = EV_DOCUMENT_MODE_USE_ATTACHMENTS; + default: + break; + } + + info->ui_hints = 0; + if (view_prefs & POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_HIDE_TOOLBAR; + } + if (view_prefs & POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_HIDE_MENUBAR; + } + if (view_prefs & POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_HIDE_WINDOWUI; + } + if (view_prefs & POPPLER_VIEWER_PREFERENCES_FIT_WINDOW) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_FIT_WINDOW; + } + if (view_prefs & POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_CENTER_WINDOW; + } + if (view_prefs & POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_DISPLAY_DOC_TITLE; + } + if (view_prefs & POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL) { + info->ui_hints |= EV_DOCUMENT_UI_HINT_DIRECTION_RTL; + } + + return info; +} + static char * pdf_document_get_text (EvDocument *document, int page, EvRectangle *rect) { @@ -345,8 +414,6 @@ pdf_document_get_text (EvDocument *document, int page, EvRectangle *rect) r.x2 = rect->x2; r.y2 = height - rect->y1; - g_print ("%f %f %f %f\n", r.x1, r.y1, r.x2, r.y2); - return poppler_page_get_text (poppler_page, &r); } @@ -361,6 +428,8 @@ pdf_document_document_iface_init (EvDocumentIface *iface) iface->get_links = pdf_document_get_links; iface->render_pixbuf = pdf_document_render_pixbuf; iface->get_text = pdf_document_get_text; + iface->can_get_text = pdf_document_can_get_text; + iface->get_info = pdf_document_get_info; }; static void @@ -590,21 +659,22 @@ pdf_document_search_idle_callback (void *data) { PdfDocumentSearch *search = (PdfDocumentSearch*) data; PdfDocument *pdf_document = search->document; - int n_pages, changed_page; + int n_pages; GList *matches; PopplerPage *page; page = poppler_document_get_page (search->document->document, search->search_page); - g_mutex_lock (EV_DOC_MUTEX); + ev_document_doc_mutex_lock (); matches = poppler_page_find_text (page, search->text); - g_mutex_unlock (EV_DOC_MUTEX); + ev_document_doc_mutex_unlock (); search->pages[search->search_page] = matches; - n_pages = pdf_document_get_n_pages (EV_DOCUMENT (search->document)); + ev_document_find_changed (EV_DOCUMENT_FIND (pdf_document), + search->search_page); - changed_page = search->search_page; + n_pages = pdf_document_get_n_pages (EV_DOCUMENT (search->document)); search->search_page += 1; if (search->search_page == n_pages) { /* wrap around */ @@ -612,8 +682,6 @@ pdf_document_search_idle_callback (void *data) } if (search->search_page != search->start_page) { - ev_document_find_changed (EV_DOCUMENT_FIND (pdf_document), - changed_page); return TRUE; } @@ -704,7 +772,6 @@ int pdf_document_find_get_n_results (EvDocumentFind *document_find, int page) { PdfDocumentSearch *search = PDF_DOCUMENT (document_find)->search; - int current_page; if (search) { return g_list_length (search->pages[page]); @@ -723,7 +790,6 @@ pdf_document_find_get_result (EvDocumentFind *document_find, PdfDocumentSearch *search = pdf_document->search; PopplerPage *poppler_page; PopplerRectangle *r; - int current_page; double height; if (search == NULL) @@ -801,6 +867,45 @@ pdf_document_find_iface_init (EvDocumentFindIface *iface) iface->cancel = pdf_document_find_cancel; } +static void +pdf_document_ps_exporter_begin (EvPSExporter *exporter, const char *filename) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (exporter); + int n_pages; + + n_pages = pdf_document_get_n_pages (EV_DOCUMENT (exporter)); + pdf_document->ps_file = poppler_ps_file_new (pdf_document->document, + filename, n_pages); +} + +static void +pdf_document_ps_exporter_do_page (EvPSExporter *exporter, int page) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (exporter); + PopplerPage *poppler_page; + + g_return_if_fail (pdf_document->ps_file != NULL); + + poppler_page = poppler_document_get_page (pdf_document->document, page); + poppler_page_render_to_ps (poppler_page, pdf_document->ps_file); +} + +static void +pdf_document_ps_exporter_end (EvPSExporter *exporter) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (exporter); + + poppler_ps_file_free (pdf_document->ps_file); + pdf_document->ps_file = NULL; +} + +static void +pdf_document_ps_exporter_iface_init (EvPSExporterIface *iface) +{ + iface->begin = pdf_document_ps_exporter_begin; + iface->do_page = pdf_document_ps_exporter_do_page; + iface->end = pdf_document_ps_exporter_end; +} PdfDocument * pdf_document_new (void)