diff options
Diffstat (limited to 'apps/mupdfextract.c')
-rw-r--r-- | apps/mupdfextract.c | 89 |
1 files changed, 37 insertions, 52 deletions
diff --git a/apps/mupdfextract.c b/apps/mupdfextract.c index f309f39a..a6a677cd 100644 --- a/apps/mupdfextract.c +++ b/apps/mupdfextract.c @@ -2,7 +2,6 @@ * pdfextract -- the ultimate way to extract images and fonts from pdfs */ -#include "fitz.h" #include "mupdf.h" static pdf_document *doc = NULL; @@ -17,96 +16,81 @@ static void usage(void) exit(1); } -static int isimage(fz_obj *obj) +static int isimage(pdf_obj *obj) { - fz_obj *type = fz_dict_gets(obj, "Subtype"); - return fz_is_name(type) && !strcmp(fz_to_name(type), "Image"); + pdf_obj *type = pdf_dict_gets(obj, "Subtype"); + return pdf_is_name(type) && !strcmp(pdf_to_name(type), "Image"); } -static int isfontdesc(fz_obj *obj) +static int isfontdesc(pdf_obj *obj) { - fz_obj *type = fz_dict_gets(obj, "Type"); - return fz_is_name(type) && !strcmp(fz_to_name(type), "FontDescriptor"); + pdf_obj *type = pdf_dict_gets(obj, "Type"); + return pdf_is_name(type) && !strcmp(pdf_to_name(type), "FontDescriptor"); } static void saveimage(int num) { + fz_image *image; fz_pixmap *img; - fz_obj *ref; - char name[1024]; + pdf_obj *ref; + char name[32]; - ref = fz_new_indirect(ctx, num, 0, doc); + ref = pdf_new_indirect(ctx, num, 0, doc); /* TODO: detect DCTD and save as jpeg */ - img = pdf_load_image(doc, ref); + image = pdf_load_image(doc, ref); + img = fz_image_to_pixmap(ctx, image, 0, 0); + fz_drop_image(ctx, image); - if (dorgb && img->colorspace && img->colorspace != fz_device_rgb) - { - fz_pixmap *temp; - 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; - } - - if (img->n <= 4) - { - sprintf(name, "img-%04d.png", num); - printf("extracting image %s\n", name); - fz_write_png(ctx, img, name, 0); - } - else - { - sprintf(name, "img-%04d.pam", num); - printf("extracting image %s\n", name); - fz_write_pam(ctx, img, name, 0); - } + sprintf(name, "img-%04d", num); + fz_write_pixmap(ctx, img, name, dorgb); fz_drop_pixmap(ctx, img); - fz_drop_obj(ref); + pdf_drop_obj(ref); } -static void savefont(fz_obj *dict, int num) +static void savefont(pdf_obj *dict, int num) { char name[1024]; char *subtype; fz_buffer *buf; - fz_obj *stream = NULL; - fz_obj *obj; + pdf_obj *stream = NULL; + pdf_obj *obj; char *ext = ""; FILE *f; char *fontname = "font"; - int n; + int n, len; + unsigned char *data; - obj = fz_dict_gets(dict, "FontName"); + obj = pdf_dict_gets(dict, "FontName"); if (obj) - fontname = fz_to_name(obj); + fontname = pdf_to_name(obj); - obj = fz_dict_gets(dict, "FontFile"); + obj = pdf_dict_gets(dict, "FontFile"); if (obj) { stream = obj; ext = "pfa"; } - obj = fz_dict_gets(dict, "FontFile2"); + obj = pdf_dict_gets(dict, "FontFile2"); if (obj) { stream = obj; ext = "ttf"; } - obj = fz_dict_gets(dict, "FontFile3"); + obj = pdf_dict_gets(dict, "FontFile3"); if (obj) { stream = obj; - obj = fz_dict_gets(obj, "Subtype"); - if (obj && !fz_is_name(obj)) + obj = pdf_dict_gets(obj, "Subtype"); + if (obj && !pdf_is_name(obj)) fz_throw(ctx, "Invalid font descriptor subtype"); - subtype = fz_to_name(obj); + subtype = pdf_to_name(obj); if (!strcmp(subtype, "Type1C")) ext = "cff"; else if (!strcmp(subtype, "CIDFontType0C")) @@ -121,7 +105,7 @@ static void savefont(fz_obj *dict, int num) return; } - buf = pdf_load_stream(doc, fz_to_num(stream), fz_to_gen(stream)); + buf = pdf_load_stream(doc, pdf_to_num(stream), pdf_to_gen(stream)); sprintf(name, "%s-%04d.%s", fontname, num, ext); printf("extracting font %s\n", name); @@ -130,8 +114,9 @@ static void savefont(fz_obj *dict, int num) if (!f) fz_throw(ctx, "Error creating font file"); - n = fwrite(buf->data, 1, buf->len, f); - if (n < buf->len) + len = fz_buffer_storage(ctx, buf, &data); + n = fwrite(data, 1, len, f); + if (n < len) fz_throw(ctx, "Error writing font file"); if (fclose(f) < 0) @@ -142,7 +127,7 @@ static void savefont(fz_obj *dict, int num) static void showobject(int num) { - fz_obj *obj; + pdf_obj *obj; if (!doc) fz_throw(ctx, "no file specified"); @@ -154,7 +139,7 @@ static void showobject(int num) else if (isfontdesc(obj)) savefont(obj, num); - fz_drop_obj(obj); + pdf_drop_obj(obj); } #ifdef MUPDF_COMBINED_EXE @@ -192,11 +177,11 @@ int main(int argc, char **argv) doc = pdf_open_document(ctx, infile); if (pdf_needs_password(doc)) if (!pdf_authenticate_password(doc, password)) - fz_throw(ctx, "cannot authenticate password: %s\n", infile); + fz_throw(ctx, "cannot authenticate password: %s", infile); if (fz_optind == argc) { - for (o = 0; o < doc->len; o++) + for (o = 0; o < pdf_count_objects(doc); o++) showobject(o); } else |