diff options
Diffstat (limited to 'apps/pdfextract.c')
-rw-r--r-- | apps/pdfextract.c | 93 |
1 files changed, 56 insertions, 37 deletions
diff --git a/apps/pdfextract.c b/apps/pdfextract.c index 7e6e4ace..bf0a74ed 100644 --- a/apps/pdfextract.c +++ b/apps/pdfextract.c @@ -6,11 +6,12 @@ #include "mupdf.h" static pdf_xref *xref = NULL; +static fz_context *ctx = NULL; static int dorgb = 0; void die(fz_error error) { - fz_catch(error, "aborting"); + fz_error_handle(error, "aborting"); if (xref) pdf_free_xref(xref); exit(1); @@ -38,25 +39,29 @@ static int isfontdesc(fz_obj *obj) static void saveimage(int num) { - fz_error error; fz_pixmap *img; fz_obj *ref; char name[1024]; - ref = fz_new_indirect(num, 0, xref); + ref = fz_new_indirect(ctx, num, 0, xref); /* TODO: detect DCTD and save as jpeg */ - error = pdf_load_image(&img, xref, ref); - if (error) - die(error); + fz_try(ctx) + { + img = pdf_load_image(xref, ref); + } + fz_catch(ctx) + { + die(1); + } if (dorgb && img->colorspace && img->colorspace != fz_device_rgb) { fz_pixmap *temp; - temp = fz_new_pixmap_with_rect(fz_device_rgb, fz_bound_pixmap(img)); - fz_convert_pixmap(img, temp); - fz_drop_pixmap(img); + temp = fz_new_pixmap_with_rect(ctx, fz_device_rgb, fz_bound_pixmap(img)); + fz_convert_pixmap(ctx, img, temp); + fz_drop_pixmap(ctx, img); img = temp; } @@ -64,22 +69,21 @@ static void saveimage(int num) { sprintf(name, "img-%04d.png", num); printf("extracting image %s\n", name); - fz_write_png(img, name, 0); + fz_write_png(ctx, img, name, 0); } else { sprintf(name, "img-%04d.pam", num); printf("extracting image %s\n", name); - fz_write_pam(img, name, 0); + fz_write_pam(ctx, img, name, 0); } - fz_drop_pixmap(img); + fz_drop_pixmap(ctx, img); fz_drop_obj(ref); } static void savefont(fz_obj *dict, int num) { - fz_error error; char name[1024]; char *subtype; fz_buffer *buf; @@ -115,7 +119,7 @@ static void savefont(fz_obj *dict, int num) obj = fz_dict_gets(obj, "Subtype"); if (obj && !fz_is_name(obj)) - die(fz_throw("Invalid font descriptor subtype")); + die(fz_error_make("Invalid font descriptor subtype")); subtype = fz_to_name(obj); if (!strcmp(subtype, "Type1C")) @@ -123,49 +127,56 @@ static void savefont(fz_obj *dict, int num) else if (!strcmp(subtype, "CIDFontType0C")) ext = "cid"; else - die(fz_throw("Unhandled font type '%s'", subtype)); + die(fz_error_make("Unhandled font type '%s'", subtype)); } if (!stream) { - fz_warn("Unhandled font type"); + fz_warn(ctx, "Unhandled font type"); return; } - buf = fz_new_buffer(0); - - error = pdf_load_stream(&buf, xref, fz_to_num(stream), fz_to_gen(stream)); - if (error) - die(error); + fz_try(ctx) + { + buf = pdf_load_stream(xref, fz_to_num(stream), fz_to_gen(stream)); + } + fz_catch(ctx) + { + die(1); + } sprintf(name, "%s-%04d.%s", fontname, num, ext); printf("extracting font %s\n", name); f = fopen(name, "wb"); if (f == NULL) - die(fz_throw("Error creating font file")); + die(fz_error_make("Error creating font file")); n = fwrite(buf->data, 1, buf->len, f); if (n < buf->len) - die(fz_throw("Error writing font file")); + die(fz_error_make("Error writing font file")); if (fclose(f) < 0) - die(fz_throw("Error closing font file")); + die(fz_error_make("Error closing font file")); - fz_drop_buffer(buf); + fz_drop_buffer(ctx, buf); } static void showobject(int num) { - fz_error error; fz_obj *obj; if (!xref) - die(fz_throw("no file specified")); + die(fz_error_make("no file specified")); - error = pdf_load_object(&obj, xref, num, 0); - if (error) - die(error); + fz_try(ctx) + { + obj = pdf_load_object(xref, num, 0); + } + fz_catch(ctx) + { + die(1); + } if (isimage(obj)) saveimage(num); @@ -177,7 +188,6 @@ static void showobject(int num) int main(int argc, char **argv) { - fz_error error; char *infile; char *password = ""; int c, o; @@ -196,9 +206,19 @@ int main(int argc, char **argv) usage(); infile = argv[fz_optind++]; - error = pdf_open_xref(&xref, infile, password); - if (error) - die(fz_rethrow(error, "cannot open input file '%s'", infile)); + + ctx = fz_new_context(&fz_alloc_default); + if (ctx == NULL) + die(fz_error_note(1, "failed to initialise context")); + + fz_try(ctx) + { + xref = pdf_open_xref(ctx, infile, password); + } + fz_catch(ctx) + { + die(fz_error_note(1, "cannot open input file '%s'", infile)); + } if (fz_optind == argc) { @@ -215,8 +235,7 @@ int main(int argc, char **argv) } pdf_free_xref(xref); - - fz_flush_warnings(); - + fz_flush_warnings(ctx); + fz_free_context(ctx); return 0; } |