Guest User

Untitled

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