X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=pdf%2Fev-poppler.cc;h=1599f2f24906ad9af5336f45514bb36e5d8757fe;hb=847c9a92060b6b1936066136d43f7cf2f06ca34e;hp=7fcc9c0d630ebe8607d4b2c03b1dc46933772703;hpb=5e6728daa9b09a76f2537f7c848123639165cd70;p=evince.git diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 7fcc9c0d..1599f2f2 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -58,6 +58,7 @@ struct _PdfDocument GObject parent_instance; PopplerDocument *document; + PopplerPSFile *ps_file; gchar *password; PdfDocumentSearch *search; @@ -68,6 +69,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,17 +90,11 @@ 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, @@ -328,7 +324,31 @@ pdf_document_set_password (EvDocumentSecurity *document_security, document->password = g_strdup (password); } +static gboolean +pdf_document_can_get_text (EvDocument *document) +{ + return TRUE; +} + +static char * +pdf_document_get_text (EvDocument *document, int page, EvRectangle *rect) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerPage *poppler_page; + PopplerRectangle r; + double height; + + poppler_page = poppler_document_get_page (pdf_document->document, page); + g_return_val_if_fail (poppler_page != NULL, NULL); + + poppler_page_get_size (poppler_page, NULL, &height); + r.x1 = rect->x1; + r.y1 = height - rect->y2; + r.x2 = rect->x2; + r.y2 = height - rect->y1; + return poppler_page_get_text (poppler_page, &r); +} static void pdf_document_document_iface_init (EvDocumentIface *iface) @@ -340,6 +360,8 @@ pdf_document_document_iface_init (EvDocumentIface *iface) iface->get_page_label = pdf_document_get_page_label; 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; }; static void @@ -703,7 +725,7 @@ pdf_document_find_get_result (EvDocumentFind *document_find, PopplerPage *poppler_page; PopplerRectangle *r; int current_page; - double scale, height; + double height; if (search == NULL) return FALSE; @@ -780,6 +802,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)