Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. /*
  2. Compile+link:
  3. gcc -o test1 test1.c `pkg-config --cflags --libs gtk+-3.0 poppler-glib` -lm
  4.  
  5. Run:
  6. ./test1
  7.  
  8. */
  9.  
  10. #include <gtk/gtk.h>
  11. #include <math.h>
  12. #include <cairo.h>
  13. #include <poppler.h>
  14.  
  15. #define WIDTH 640
  16. #define HEIGHT 480
  17.  
  18. #define ZOOM_X 100.0
  19. #define ZOOM_Y 100.0
  20.  
  21. #define PDF_DOC "/home/moma/TT/doc1.pdf"
  22. #define FIND_TEXT "New"
  23.  
  24. #define SWAP(x, y) do {x = x + y;y = x - y;x = x - y;} while (0)
  25.  
  26. GtkWidget *window;
  27. GtkWidget *draw_area;
  28. PopplerDocument *pdf_doc;
  29.  
  30. static PopplerDocument *open_page(char *filename);
  31.  
  32. static GList *find_text(PopplerPage *page, gchar *text);
  33. static void mark_text(PopplerPage *page, cairo_t *cr, GList *list);
  34.  
  35. static gboolean on_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data) {
  36.  
  37. GdkWindow *window = gtk_widget_get_window(widget);
  38.  
  39. //GdkRectangle da;
  40. //gdk_window_get_geometry (window, &da.x, &da.y, &da.width, &da.height);
  41.  
  42. #define PAGE 0
  43. PopplerPage *page;
  44. page = poppler_document_get_page(pdf_doc , PAGE);
  45.  
  46. double page_w, page_h;
  47. poppler_page_get_size(page, &page_w, &page_h);
  48.  
  49. cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
  50. cairo_rectangle(cr, 0.0, 0.0, page_w, page_h);
  51. cairo_fill(cr);
  52.  
  53. poppler_page_render(page, cr);
  54.  
  55. GList *list = find_text(page, FIND_TEXT);
  56.  
  57. mark_text(page, cr, list);
  58.  
  59. g_list_free(list);
  60.  
  61. return FALSE;
  62. }
  63.  
  64.  
  65. int main (int argc, char **argv) {
  66.  
  67. gtk_init (&argc, &argv);
  68.  
  69. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  70. gtk_window_set_default_size (GTK_WINDOW (window), WIDTH, HEIGHT);
  71. gtk_window_set_title (GTK_WINDOW (window), "Graph drawing");
  72. g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
  73.  
  74. draw_area = gtk_drawing_area_new();
  75. gtk_container_add (GTK_CONTAINER (window), draw_area);
  76.  
  77. g_signal_connect (G_OBJECT(draw_area), "draw", G_CALLBACK (on_draw), NULL);
  78.  
  79. pdf_doc = open_page(PDF_DOC);
  80.  
  81. if (!pdf_doc) {
  82. g_print("Cannot open pdf doc...\n");
  83. return -1;
  84. }
  85.  
  86. // Call this to trigger a re-draw "draw" event
  87. // gtk_widget_queue_draw(draw_are);
  88.  
  89. gtk_widget_show_all (window);
  90. gtk_main ();
  91.  
  92. return 0;
  93. }
  94.  
  95.  
  96. static PopplerDocument *open_page(char *filename) {
  97. // File name to file:/// uri
  98. gchar *uri = g_filename_to_uri(filename, NULL, NULL);
  99.  
  100. PopplerDocument *doc = poppler_document_new_from_file(uri, NULL, NULL);
  101.  
  102. g_free(uri);
  103.  
  104. return doc;
  105. }
  106.  
  107. static GList *find_text(PopplerPage *page, gchar *text) {
  108. GList *list = poppler_page_find_text(page, text);
  109. return list;
  110. }
  111.  
  112. static void mark_text(PopplerPage *page, cairo_t *cr, GList *list) {
  113.  
  114. PopplerColor fg, bg;
  115.  
  116. fg.red = 0xffff;
  117. fg.blue = 0xffff;
  118. fg.green = 0xffff;
  119.  
  120. bg.red = 0x0;
  121. bg.blue = 0x0;
  122. bg.green = 0x0;
  123.  
  124. if (!list) {
  125. return;
  126. }
  127.  
  128. double page_w, page_h;
  129. poppler_page_get_size(page, &page_w, &page_h);
  130.  
  131. for (GList *item = list;item != NULL;item = item->next) {
  132. PopplerRectangle *rectangle = (PopplerRectangle *) item->data;
  133.  
  134. gdouble y1 = rectangle->y1;
  135.  
  136. rectangle->y1 = page_h - rectangle->y2;
  137. rectangle->y2 = page_h - y1;
  138.  
  139. //SWAP(rectangle->x1, rectangle->x2);
  140. //SWAP(rectangle->y1, rectangle->y2);
  141. //rectangle->y1 = page_h - rectangle->y1;
  142. //rectangle->y2 = page_h - rectangle->y2;
  143.  
  144. poppler_page_render_selection(page, cr, rectangle, NULL, POPPLER_SELECTION_WORD, &fg, &bg);
  145. }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement