| /* |
| * pdfdrawbb.c |
| * |
| * draw the bounding box of each page |
| */ |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <string.h> |
| |
| #include <poppler.h> |
| #include <cairo.h> |
| #include <cairo-pdf.h> |
| |
| /* |
| * add suffix to a pdf filename |
| */ |
| char *pdfaddsuffix(char *infile, char *suffix) |
| { |
| char *basename; |
| char *outfile; |
| char *pos; |
| |
| basename = g_path_get_basename(infile); |
| |
| outfile = malloc(strlen(infile) + strlen(suffix) + 10); |
| strcpy(outfile, basename); |
| g_free(basename); |
| |
| pos = strrchr(outfile, '.'); |
| if (pos != NULL && (!strcmp(pos, ".pdf") || !strcmp(pos, ".PDF"))) |
| *pos = '\0'; |
| |
| strcat(outfile, "-"); |
| strcat(outfile, suffix); |
| strcat(outfile, ".pdf"); |
| return outfile; |
| } |
| |
| /* |
| * main |
| */ |
| int main(int argc, char *argv[]) |
| { |
| int opt; |
| gboolean usage = FALSE; |
| char *infilename, *outfilename; |
| |
| GError *err = NULL; |
| GFile *infile; |
| PopplerDocument *doc; |
| PopplerPage *page; |
| int npages, n; |
| PopplerRectangle bb; |
| gboolean hg; |
| |
| gdouble width, height; |
| cairo_surface_t *surface; |
| cairo_t *cr; |
| |
| /* arguments */ |
| |
| while ((opt = getopt(argc, argv, "h")) != -1) |
| switch (opt) { |
| case 'h': |
| usage = TRUE; |
| break; |
| } |
| |
| if (!usage && argc - 1 < optind) { |
| g_print("input file name missing\n"); |
| usage = TRUE; |
| } |
| if (usage) { |
| g_print("usage:\n"); |
| g_print("\tpdfdrawbb"); |
| g_print("[-h] file.pdf\n"); |
| g_print("\t\t-h\t\tthis help\n"); |
| exit(EXIT_FAILURE); |
| } |
| infilename = argv[optind]; |
| if (!infilename) |
| exit(EXIT_FAILURE); |
| outfilename = pdfaddsuffix(argv[optind], "bb"); |
| |
| /* open file */ |
| |
| infile = g_file_new_for_path(infilename); |
| if (infile == NULL) |
| exit(EXIT_FAILURE); |
| |
| doc = poppler_document_new_from_gfile(infile, NULL, NULL, &err); |
| if (doc == NULL) { |
| g_printerr("error opening pdf file: %s\n", err->message); |
| g_error_free(err); |
| exit(EXIT_FAILURE); |
| } |
| |
| /* pages */ |
| |
| npages = poppler_document_get_n_pages(doc); |
| if (npages < 1) { |
| g_print("no page in document\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| /* copy to destination */ |
| |
| surface = cairo_pdf_surface_create(outfilename, 1.0, 1.0); |
| |
| g_print("infile: %s\n", infilename); |
| g_print("outfile: %s\n", outfilename); |
| |
| for (n = 0; n < npages; n++) { |
| g_print("page %d:\n", n); |
| page = poppler_document_get_page(doc, n); |
| poppler_page_get_size(page, &width, &height); |
| cairo_pdf_surface_set_size(surface, width, height); |
| |
| hg = poppler_page_get_bounding_box(page, &bb); |
| if (hg) |
| g_print("bounding box %g,%g - %g,%g", bb.x1, bb.y1, bb.x2, bb.y2); |
| g_print("\n"); |
| |
| cr = cairo_create(surface); |
| poppler_page_render_for_printing(page, cr); |
| if (hg) { |
| cairo_set_source_rgb(cr, 0.6, 0.6, 1.0); |
| cairo_rectangle(cr, bb.x1, bb.y1, bb.x2 - bb.x1, bb.y2 - bb.y1); |
| cairo_stroke(cr); |
| } |
| cairo_destroy(cr); |
| cairo_surface_show_page(surface); |
| |
| g_object_unref(page); |
| } |
| |
| cairo_surface_destroy(surface); |
| |
| return EXIT_SUCCESS; |
| } |