thejagstudio's picture
Upload 714 files
5cee033 verified
/*
* 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;
}