Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Compile+link:
- gcc -o test1 test1.c `pkg-config --cflags --libs gtk+-3.0 poppler-glib` -lm
- Run:
- ./test1
- */
- #include <gtk/gtk.h>
- #include <math.h>
- #include <cairo.h>
- #include <poppler.h>
- #define WIDTH 640
- #define HEIGHT 480
- #define ZOOM_X 100.0
- #define ZOOM_Y 100.0
- #define PDF_DOC "/home/moma/TT/doc1.pdf"
- #define FIND_TEXT "New"
- #define SWAP(x, y) do {x = x + y;y = x - y;x = x - y;} while (0)
- GtkWidget *window;
- GtkWidget *draw_area;
- PopplerDocument *pdf_doc;
- static PopplerDocument *open_page(char *filename);
- static GList *find_text(PopplerPage *page, gchar *text);
- static void mark_text(PopplerPage *page, cairo_t *cr, GList *list);
- static gboolean on_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data) {
- GdkWindow *window = gtk_widget_get_window(widget);
- //GdkRectangle da;
- //gdk_window_get_geometry (window, &da.x, &da.y, &da.width, &da.height);
- #define PAGE 0
- PopplerPage *page;
- page = poppler_document_get_page(pdf_doc , PAGE);
- double page_w, page_h;
- poppler_page_get_size(page, &page_w, &page_h);
- cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
- cairo_rectangle(cr, 0.0, 0.0, page_w, page_h);
- cairo_fill(cr);
- poppler_page_render(page, cr);
- GList *list = find_text(page, FIND_TEXT);
- mark_text(page, cr, list);
- g_list_free(list);
- return FALSE;
- }
- int main (int argc, char **argv) {
- gtk_init (&argc, &argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size (GTK_WINDOW (window), WIDTH, HEIGHT);
- gtk_window_set_title (GTK_WINDOW (window), "Graph drawing");
- g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
- draw_area = gtk_drawing_area_new();
- gtk_container_add (GTK_CONTAINER (window), draw_area);
- g_signal_connect (G_OBJECT(draw_area), "draw", G_CALLBACK (on_draw), NULL);
- pdf_doc = open_page(PDF_DOC);
- if (!pdf_doc) {
- g_print("Cannot open pdf doc...\n");
- return -1;
- }
- // Call this to trigger a re-draw "draw" event
- // gtk_widget_queue_draw(draw_are);
- gtk_widget_show_all (window);
- gtk_main ();
- return 0;
- }
- static PopplerDocument *open_page(char *filename) {
- // File name to file:/// uri
- gchar *uri = g_filename_to_uri(filename, NULL, NULL);
- PopplerDocument *doc = poppler_document_new_from_file(uri, NULL, NULL);
- g_free(uri);
- return doc;
- }
- static GList *find_text(PopplerPage *page, gchar *text) {
- GList *list = poppler_page_find_text(page, text);
- return list;
- }
- static void mark_text(PopplerPage *page, cairo_t *cr, GList *list) {
- PopplerColor fg, bg;
- fg.red = 0xffff;
- fg.blue = 0xffff;
- fg.green = 0xffff;
- bg.red = 0x0;
- bg.blue = 0x0;
- bg.green = 0x0;
- if (!list) {
- return;
- }
- double page_w, page_h;
- poppler_page_get_size(page, &page_w, &page_h);
- for (GList *item = list;item != NULL;item = item->next) {
- PopplerRectangle *rectangle = (PopplerRectangle *) item->data;
- gdouble y1 = rectangle->y1;
- rectangle->y1 = page_h - rectangle->y2;
- rectangle->y2 = page_h - y1;
- //SWAP(rectangle->x1, rectangle->x2);
- //SWAP(rectangle->y1, rectangle->y2);
- //rectangle->y1 = page_h - rectangle->y1;
- //rectangle->y2 = page_h - rectangle->y2;
- poppler_page_render_selection(page, cr, rectangle, NULL, POPPLER_SELECTION_WORD, &fg, &bg);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement