Advertisement
Guest User

main.c

a guest
Nov 30th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.11 KB | None | 0 0
  1. /* OS: Arch Linux
  2.  * Kernel: Linux 4.19.4
  3.  * Compiler: GCC 8.2.1
  4.  * GUI toolkit: GTK+ 3.24
  5.  * PDF renderer: Poppler 0.71
  6.  *
  7.  * Compile with "gcc main.c `pkg-config --cflags --libs gtk+-3.0 poppler-glib`"
  8.  * Run with "a.out /absolute/path/to/file.pdf text-to-find"
  9.  */
  10.  
  11. #include <gtk/gtk.h>
  12. #include <poppler.h>
  13. #include <string.h>
  14. #define PAGE 0
  15. #define SWAP(x, y) do {x = x + y;y = x - y;x = x - y;} while (0)
  16.  
  17. struct Program
  18. {
  19.     GtkWidget *window;
  20.     GtkWidget *drawing_area;
  21.     PopplerDocument *doc;
  22.     PopplerPage *page;
  23.     GList *selections;
  24. };
  25.  
  26. // render page and found text onto drawing area
  27. static gboolean render_page(GtkWidget *drawing_area, cairo_t *cr, struct Program *program)
  28. {
  29.     PopplerColor fg, bg;
  30.  
  31.     fg.red = 0xffff;
  32.     fg.blue = 0xffff;
  33.     fg.green = 0xffff;
  34.  
  35.     bg.red = 0x0;
  36.     bg.blue = 0x0;
  37.     bg.green = 0x0;
  38.  
  39.     double page_width, page_height;
  40.     poppler_page_get_size(program->page, &page_width, &page_height);
  41.  
  42.     cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
  43.     cairo_rectangle(cr, 0.0, 0.0, page_width, page_height);
  44.     cairo_fill(cr);
  45.  
  46.     poppler_page_render(program->page, cr);
  47.  
  48.     for (GList *item = program->selections;item != NULL;item = item->next)
  49.     {
  50.         PopplerRectangle *rectangle = (PopplerRectangle *) item->data;
  51.  
  52.         // comment out these lines to get the right selection!
  53.         /*
  54.         SWAP(rectangle->x1, rectangle->x2);
  55.         SWAP(rectangle->y1, rectangle->y2);
  56.         rectangle->y1 = page_height - rectangle->y1;
  57.         rectangle->y2 = page_height - rectangle->y2;
  58.         */
  59.  
  60.         poppler_page_render_selection(program->page, cr, rectangle, NULL, POPPLER_SELECTION_GLYPH, &fg, &bg);
  61.     }
  62.  
  63.     return TRUE;
  64. }
  65.  
  66. // open document and page
  67. static gboolean open_page(struct Program *program, char *filename)
  68. {
  69.     char *filename_uri = (char *) g_malloc(sizeof(char) * (strlen(filename) + strlen("file://") + 1));
  70.     strcpy(filename_uri, "file://");
  71.     strcat(filename_uri, filename);
  72.  
  73.     program->doc = poppler_document_new_from_file(filename_uri, NULL, NULL);
  74.     if (program->doc == NULL)
  75.         return FALSE;
  76.  
  77.     program->page = poppler_document_get_page(program->doc , PAGE);
  78.  
  79.     g_free(filename_uri);
  80.  
  81.     return TRUE;
  82. }
  83.  
  84. // search for text
  85. static void find_text(struct Program *program, char *text)
  86. {
  87.     program->selections = poppler_page_find_text(program->page, text);
  88. }
  89.  
  90. // create and show window
  91. static void create_window(struct Program *program)
  92. {
  93.     program->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  94.     gtk_window_set_default_size(GTK_WINDOW(program->window), 400, 600);
  95.     g_signal_connect(program->window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
  96.  
  97.     program->drawing_area = gtk_drawing_area_new();
  98.     g_signal_connect(program->drawing_area, "draw", G_CALLBACK(render_page), program);
  99.  
  100.     gtk_container_add(GTK_CONTAINER(program->window), program->drawing_area);
  101.  
  102.     gtk_widget_show_all(program->window);
  103. }
  104.  
  105. int main(int argc, char **argv)
  106. {
  107.     if (argc != 3)
  108.         return -1;
  109.  
  110.     gtk_init(&argc, &argv);
  111.  
  112.     struct Program program;
  113.  
  114.     create_window(&program);
  115.  
  116.     if (!open_page(&program, argv[1]))
  117.         return -1;
  118.  
  119.     find_text(&program, argv[2]);
  120.  
  121.     gtk_widget_queue_draw(program.drawing_area);
  122.  
  123.     gtk_main();
  124.  
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement