diff options
Diffstat (limited to 'source/tools/pdfclean.c')
-rw-r--r-- | source/tools/pdfclean.c | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/source/tools/pdfclean.c b/source/tools/pdfclean.c index d7d5ac97..07ca7e5a 100644 --- a/source/tools/pdfclean.c +++ b/source/tools/pdfclean.c @@ -36,15 +36,15 @@ static void usage(void) } static int -string_in_names_list(pdf_obj *p, pdf_obj *names_list) +string_in_names_list(fz_context *ctx, pdf_obj *p, pdf_obj *names_list) { - int n = pdf_array_len(names_list); + int n = pdf_array_len(ctx, names_list); int i; - char *str = pdf_to_str_buf(p); + char *str = pdf_to_str_buf(ctx, p); for (i = 0; i < n ; i += 2) { - if (!strcmp(pdf_to_str_buf(pdf_array_get(names_list, i)), str)) + if (!strcmp(pdf_to_str_buf(ctx, pdf_array_get(ctx, names_list, i)), str)) return 1; } return 0; @@ -54,18 +54,18 @@ string_in_names_list(pdf_obj *p, pdf_obj *names_list) * Recreate page tree to only retain specified pages. */ -static void retainpage(pdf_document *doc, pdf_obj *parent, pdf_obj *kids, int page) +static void retainpage(fz_context *ctx, pdf_document *doc, pdf_obj *parent, pdf_obj *kids, int page) { - pdf_obj *pageref = pdf_lookup_page_obj(doc, page-1); - pdf_obj *pageobj = pdf_resolve_indirect(pageref); + pdf_obj *pageref = pdf_lookup_page_obj(ctx, doc, page-1); + pdf_obj *pageobj = pdf_resolve_indirect(ctx, pageref); - pdf_dict_puts(pageobj, "Parent", parent); + pdf_dict_puts(ctx, pageobj, "Parent", parent); /* Store page object in new kids array */ - pdf_array_push(kids, pageref); + pdf_array_push(ctx, kids, pageref); } -static void retainpages(globals *glo, int argc, char **argv) +static void retainpages(fz_context *ctx, globals *glo, int argc, char **argv) { pdf_obj *oldroot, *root, *pages, *kids, *countobj, *parent, *olddests; pdf_document *doc = glo->doc; @@ -76,21 +76,21 @@ static void retainpages(globals *glo, int argc, char **argv) /* Keep only pages/type and (reduced) dest entries to avoid * references to unretained pages */ - oldroot = pdf_dict_gets(pdf_trailer(doc), "Root"); - pages = pdf_dict_gets(oldroot, "Pages"); - olddests = pdf_load_name_tree(doc, "Dests"); + oldroot = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pages = pdf_dict_gets(ctx, oldroot, "Pages"); + olddests = pdf_load_name_tree(ctx, doc, "Dests"); - root = pdf_new_dict(doc, 2); - pdf_dict_puts(root, "Type", pdf_dict_gets(oldroot, "Type")); - pdf_dict_puts(root, "Pages", pdf_dict_gets(oldroot, "Pages")); + root = pdf_new_dict(ctx, doc, 2); + pdf_dict_puts(ctx, root, "Type", pdf_dict_gets(ctx, oldroot, "Type")); + pdf_dict_puts(ctx, root, "Pages", pdf_dict_gets(ctx, oldroot, "Pages")); - pdf_update_object(doc, pdf_to_num(oldroot), root); + pdf_update_object(ctx, doc, pdf_to_num(ctx, oldroot), root); - pdf_drop_obj(root); + pdf_drop_obj(ctx, root); /* Create a new kids array with only the pages we want to keep */ - parent = pdf_new_indirect(doc, pdf_to_num(pages), pdf_to_gen(pages)); - kids = pdf_new_array(doc, 1); + parent = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, pages), pdf_to_gen(ctx, pages)); + kids = pdf_new_array(ctx, doc, 1); /* Retain pages specified */ while (argc - argidx) @@ -99,7 +99,7 @@ static void retainpages(globals *glo, int argc, char **argv) char *spec, *dash; char *pagelist = argv[argidx]; - pagecount = pdf_count_pages(doc); + pagecount = pdf_count_pages(ctx, doc); spec = fz_strsep(&pagelist, ","); while (spec) { @@ -123,10 +123,10 @@ static void retainpages(globals *glo, int argc, char **argv) if (spage < epage) for (page = spage; page <= epage; ++page) - retainpage(doc, parent, kids, page); + retainpage(ctx, doc, parent, kids, page); else for (page = spage; page >= epage; --page) - retainpage(doc, parent, kids, page); + retainpage(ctx, doc, parent, kids, page); spec = fz_strsep(&pagelist, ","); } @@ -134,49 +134,49 @@ static void retainpages(globals *glo, int argc, char **argv) argidx++; } - pdf_drop_obj(parent); + pdf_drop_obj(ctx, parent); /* Update page count and kids array */ - countobj = pdf_new_int(doc, pdf_array_len(kids)); - pdf_dict_puts(pages, "Count", countobj); - pdf_drop_obj(countobj); - pdf_dict_puts(pages, "Kids", kids); - pdf_drop_obj(kids); + countobj = pdf_new_int(ctx, doc, pdf_array_len(ctx, kids)); + pdf_dict_puts(ctx, pages, "Count", countobj); + pdf_drop_obj(ctx, countobj); + pdf_dict_puts(ctx, pages, "Kids", kids); + pdf_drop_obj(ctx, kids); /* Also preserve the (partial) Dests name tree */ if (olddests) { - pdf_obj *names = pdf_new_dict(doc, 1); - pdf_obj *dests = pdf_new_dict(doc, 1); - int len = pdf_dict_len(olddests); + pdf_obj *names = pdf_new_dict(ctx, doc, 1); + pdf_obj *dests = pdf_new_dict(ctx, doc, 1); + int len = pdf_dict_len(ctx, olddests); - names_list = pdf_new_array(doc, 32); + names_list = pdf_new_array(ctx, doc, 32); for (i = 0; i < len; i++) { - pdf_obj *key = pdf_dict_get_key(olddests, i); - pdf_obj *val = pdf_dict_get_val(olddests, i); - pdf_obj *dest = pdf_dict_gets(val, "D"); + pdf_obj *key = pdf_dict_get_key(ctx, olddests, i); + pdf_obj *val = pdf_dict_get_val(ctx, olddests, i); + pdf_obj *dest = pdf_dict_gets(ctx, val, "D"); - dest = pdf_array_get(dest ? dest : val, 0); - if (pdf_array_contains(pdf_dict_gets(pages, "Kids"), dest)) + dest = pdf_array_get(ctx, dest ? dest : val, 0); + if (pdf_array_contains(ctx, pdf_dict_gets(ctx, pages, "Kids"), dest)) { - pdf_obj *key_str = pdf_new_string(doc, pdf_to_name(key), strlen(pdf_to_name(key))); - pdf_array_push(names_list, key_str); - pdf_array_push(names_list, val); - pdf_drop_obj(key_str); + pdf_obj *key_str = pdf_new_string(ctx, doc, pdf_to_name(ctx, key), strlen(pdf_to_name(ctx, key))); + pdf_array_push(ctx, names_list, key_str); + pdf_array_push(ctx, names_list, val); + pdf_drop_obj(ctx, key_str); } } - root = pdf_dict_gets(pdf_trailer(doc), "Root"); - pdf_dict_puts(dests, "Names", names_list); - pdf_dict_puts(names, "Dests", dests); - pdf_dict_puts(root, "Names", names); + root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pdf_dict_puts(ctx, dests, "Names", names_list); + pdf_dict_puts(ctx, names, "Dests", dests); + pdf_dict_puts(ctx, root, "Names", names); - pdf_drop_obj(names); - pdf_drop_obj(dests); - pdf_drop_obj(names_list); - pdf_drop_obj(olddests); + pdf_drop_obj(ctx, names); + pdf_drop_obj(ctx, dests); + pdf_drop_obj(ctx, names_list); + pdf_drop_obj(ctx, olddests); } /* Force the next call to pdf_count_pages to recount */ @@ -184,36 +184,36 @@ static void retainpages(globals *glo, int argc, char **argv) /* Edit each pages /Annot list to remove any links that point to * nowhere. */ - pagecount = pdf_count_pages(doc); + pagecount = pdf_count_pages(ctx, doc); for (i = 0; i < pagecount; i++) { - pdf_obj *pageref = pdf_lookup_page_obj(doc, i); - pdf_obj *pageobj = pdf_resolve_indirect(pageref); + pdf_obj *pageref = pdf_lookup_page_obj(ctx, doc, i); + pdf_obj *pageobj = pdf_resolve_indirect(ctx, pageref); - pdf_obj *annots = pdf_dict_gets(pageobj, "Annots"); + pdf_obj *annots = pdf_dict_gets(ctx, pageobj, "Annots"); - int len = pdf_array_len(annots); + int len = pdf_array_len(ctx, annots); int j; for (j = 0; j < len; j++) { - pdf_obj *o = pdf_array_get(annots, j); + pdf_obj *o = pdf_array_get(ctx, annots, j); pdf_obj *p; - if (strcmp(pdf_to_name(pdf_dict_gets(o, "Subtype")), "Link")) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, o, "Subtype")), "Link")) continue; - p = pdf_dict_gets(o, "A"); - if (strcmp(pdf_to_name(pdf_dict_gets(p, "S")), "GoTo")) + p = pdf_dict_gets(ctx, o, "A"); + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, p, "S")), "GoTo")) continue; - if (string_in_names_list(pdf_dict_gets(p, "D"), names_list)) + if (string_in_names_list(ctx, pdf_dict_gets(ctx, p, "D"), names_list)) continue; /* FIXME: Should probably look at Next too */ /* Remove this annotation */ - pdf_array_delete(annots, j); + pdf_array_delete(ctx, annots, j); j--; } } @@ -228,19 +228,19 @@ void pdfclean_clean(fz_context *ctx, char *infile, char *outfile, char *password fz_try(ctx) { glo.doc = pdf_open_document_no_run(ctx, infile); - if (pdf_needs_password(glo.doc)) - if (!pdf_authenticate_password(glo.doc, password)) + if (pdf_needs_password(ctx, glo.doc)) + if (!pdf_authenticate_password(ctx, glo.doc, password)) fz_throw(glo.ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", infile); /* Only retain the specified subset of the pages */ if (argc) - retainpages(&glo, argc, argv); + retainpages(ctx, &glo, argc, argv); - pdf_write_document(glo.doc, outfile, opts); + pdf_write_document(ctx, glo.doc, outfile, opts); } fz_always(ctx) { - pdf_close_document(glo.doc); + pdf_close_document(ctx, glo.doc); } fz_catch(ctx) { @@ -310,7 +310,7 @@ int pdfclean_main(int argc, char **argv) { errors++; } - fz_free_context(ctx); + fz_drop_context(ctx); return errors == 0; } |