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