/* * pdfdrawbb.c * * draw the bounding box of each page */ #include #include #include #include #include #include #include /* * 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; }