diff options
Diffstat (limited to 'source/pdf/pdf-clean.c')
-rw-r--r-- | source/pdf/pdf-clean.c | 159 |
1 files changed, 78 insertions, 81 deletions
diff --git a/source/pdf/pdf-clean.c b/source/pdf/pdf-clean.c index 51a8b6de..89926832 100644 --- a/source/pdf/pdf-clean.c +++ b/source/pdf/pdf-clean.c @@ -1,9 +1,8 @@ #include "pdf-interpret-imp.h" static void -pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res) +pdf_clean_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res) { - fz_context *ctx = doc->ctx; pdf_process process, process2; fz_buffer *buffer; int num; @@ -22,33 +21,33 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c { if (own_res) { - pdf_obj *r = pdf_dict_gets(obj, "Resources"); + pdf_obj *r = pdf_dict_gets(ctx, obj, "Resources"); if (r) orig_res = r; } - res = pdf_new_dict(doc, 1); + res = pdf_new_dict(ctx, doc, 1); - pdf_process_buffer(&process2, ctx, buffer); - pdf_process_filter(&process, ctx, &process2, res); + pdf_init_process_buffer(ctx, &process2, buffer); + pdf_init_process_filter(ctx, &process, &process2, res); - pdf_process_stream_object(doc, obj, &process, orig_res, cookie); + pdf_process_stream_object(ctx, doc, obj, &process, orig_res, cookie); - num = pdf_to_num(obj); - pdf_dict_dels(obj, "Filter"); - pdf_update_stream(doc, num, buffer); + num = pdf_to_num(ctx, obj); + pdf_dict_dels(ctx, obj, "Filter"); + pdf_update_stream(ctx, doc, num, buffer); if (own_res) { - ref = pdf_new_ref(doc, res); - pdf_dict_puts(obj, "Resources", ref); + ref = pdf_new_ref(ctx, doc, res); + pdf_dict_puts(ctx, obj, "Resources", ref); } } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(res); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { @@ -57,9 +56,8 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c } static void -pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie) +pdf_clean_type3(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; pdf_process process, process2; fz_buffer *buffer; int num, i, l; @@ -72,46 +70,46 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c fz_try(ctx) { - res = pdf_dict_gets(obj, "Resources"); + res = pdf_dict_gets(ctx, obj, "Resources"); if (res) orig_res = res; res = NULL; - res = pdf_new_dict(doc, 1); + res = pdf_new_dict(ctx, doc, 1); - charprocs = pdf_dict_gets(obj, "CharProcs"); - l = pdf_dict_len(charprocs); + charprocs = pdf_dict_gets(ctx, obj, "CharProcs"); + l = pdf_dict_len(ctx, charprocs); for (i = 0; i < l; i++) { - pdf_obj *key = pdf_dict_get_key(charprocs, i); - pdf_obj *val = pdf_dict_get_val(charprocs, i); + pdf_obj *key = pdf_dict_get_key(ctx, charprocs, i); + pdf_obj *val = pdf_dict_get_val(ctx, charprocs, i); buffer = fz_new_buffer(ctx, 1024); - pdf_process_buffer(&process2, ctx, buffer); - pdf_process_filter(&process, ctx, &process2, res); + pdf_init_process_buffer(ctx, &process2, buffer); + pdf_init_process_filter(ctx, &process, &process2, res); - pdf_process_stream_object(doc, val, &process, orig_res, cookie); + pdf_process_stream_object(ctx, doc, val, &process, orig_res, cookie); - num = pdf_to_num(val); - pdf_dict_dels(val, "Filter"); - pdf_update_stream(doc, num, buffer); - pdf_dict_put(charprocs, key, val); + num = pdf_to_num(ctx, val); + pdf_dict_dels(ctx, val, "Filter"); + pdf_update_stream(ctx, doc, num, buffer); + pdf_dict_put(ctx, charprocs, key, val); fz_drop_buffer(ctx, buffer); buffer = NULL; } /* ProcSet - no cleaning possible. Inherit this from the old dict. */ - pdf_dict_puts(res, "ProcSet", pdf_dict_gets(orig_res, "ProcSet")); + pdf_dict_puts(ctx, res, "ProcSet", pdf_dict_gets(ctx, orig_res, "ProcSet")); - ref = pdf_new_ref(doc, res); - pdf_dict_puts(obj, "Resources", ref); + ref = pdf_new_ref(ctx, doc, res); + pdf_dict_puts(ctx, obj, "Resources", ref); } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(res); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { @@ -119,9 +117,8 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c } } -void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cookie) +void pdf_clean_page_contents(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; pdf_process process, process2; fz_buffer *buffer = fz_new_buffer(ctx, 1024); int num; @@ -139,37 +136,37 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki fz_try(ctx) { - res = pdf_new_dict(doc, 1); + res = pdf_new_dict(ctx, doc, 1); - pdf_process_buffer(&process2, ctx, buffer); - pdf_process_filter(&process, ctx, &process2, res); + pdf_init_process_buffer(ctx, &process2, buffer); + pdf_init_process_filter(ctx, &process, &process2, res); - pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie); + pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie); contents = page->contents; - if (pdf_is_array(contents)) + if (pdf_is_array(ctx, contents)) { - int n = pdf_array_len(contents); + int n = pdf_array_len(ctx, contents); int i; for (i = n-1; i > 0; i--) - pdf_array_delete(contents, i); + pdf_array_delete(ctx, contents, i); /* We cannot rewrite the 0th entry of contents * directly as it may occur in other pages content * dictionaries too. We therefore clone it and make * a new object reference. */ - new_obj = pdf_copy_dict(pdf_array_get(contents, 0)); - new_ref = pdf_new_ref(doc, new_obj); - num = pdf_to_num(new_ref); - pdf_array_put(contents, 0, new_ref); - pdf_dict_dels(new_obj, "Filter"); + new_obj = pdf_copy_dict(ctx, pdf_array_get(ctx, contents, 0)); + new_ref = pdf_new_ref(ctx, doc, new_obj); + num = pdf_to_num(ctx, new_ref); + pdf_array_put(ctx, contents, 0, new_ref); + pdf_dict_dels(ctx, new_obj, "Filter"); } else { - num = pdf_to_num(contents); - pdf_dict_dels(contents, "Filter"); + num = pdf_to_num(ctx, contents); + pdf_dict_dels(ctx, contents, "Filter"); } - pdf_update_stream(doc, num, buffer); + pdf_update_stream(ctx, doc, num, buffer); /* Now deal with resources. The spec allows for Type3 fonts and form * XObjects to omit a resource dictionary and look in the parent. @@ -177,104 +174,104 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki * conceivably cause changes in rendering, but we don't care. */ /* ExtGState */ - obj = pdf_dict_gets(res, "ExtGState"); + obj = pdf_dict_gets(ctx, res, "ExtGState"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *o = pdf_dict_gets(pdf_dict_get_val(obj, i), "SMask"); + pdf_obj *o = pdf_dict_gets(ctx, pdf_dict_get_val(ctx, obj, i), "SMask"); if (!o) continue; - o = pdf_dict_gets(o, "G"); + o = pdf_dict_gets(ctx, o, "G"); if (!o) continue; /* Transparency group XObject */ - pdf_clean_stream_object(doc, o, page->resources, cookie, 1); + pdf_clean_stream_object(ctx, doc, o, page->resources, cookie, 1); } } /* ColorSpace - no cleaning possible */ /* Pattern */ - obj = pdf_dict_gets(res, "Pattern"); + obj = pdf_dict_gets(ctx, res, "Pattern"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *pat = pdf_dict_get_val(obj, i); + pdf_obj *pat = pdf_dict_get_val(ctx, obj, i); if (!pat) continue; - if (pdf_to_int(pdf_dict_gets(pat, "PatternType")) == 1) - pdf_clean_stream_object(doc, pat, page->resources, cookie, 0); + if (pdf_to_int(ctx, pdf_dict_gets(ctx, pat, "PatternType")) == 1) + pdf_clean_stream_object(ctx, doc, pat, page->resources, cookie, 0); } } /* Shading - no cleaning possible */ /* XObject */ - obj = pdf_dict_gets(res, "XObject"); + obj = pdf_dict_gets(ctx, res, "XObject"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *xobj = pdf_dict_get_val(obj, i); + pdf_obj *xobj = pdf_dict_get_val(ctx, obj, i); - if (strcmp(pdf_to_name(pdf_dict_gets(xobj, "Subtype")), "Form")) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, xobj, "Subtype")), "Form")) continue; - pdf_clean_stream_object(doc, xobj, page->resources, cookie, 1); + pdf_clean_stream_object(ctx, doc, xobj, page->resources, cookie, 1); } } /* Font */ - obj = pdf_dict_gets(res, "Font"); + obj = pdf_dict_gets(ctx, res, "Font"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *o = pdf_dict_get_val(obj, i); + pdf_obj *o = pdf_dict_get_val(ctx, obj, i); - if (!strcmp(pdf_to_name(pdf_dict_gets(o, "Subtype")), "Type3")) + if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, o, "Subtype")), "Type3")) { - pdf_clean_type3(doc, o, page->resources, cookie); + pdf_clean_type3(ctx, doc, o, page->resources, cookie); } } } /* ProcSet - no cleaning possible. Inherit this from the old dict. */ - obj = pdf_dict_gets(page->resources, "ProcSet"); + obj = pdf_dict_gets(ctx, page->resources, "ProcSet"); if (obj) - pdf_dict_puts(res, "ProcSet", obj); + pdf_dict_puts(ctx, res, "ProcSet", obj); /* Properties - no cleaning possible. */ - pdf_drop_obj(page->resources); - ref = pdf_new_ref(doc, res); - page->resources = pdf_keep_obj(ref); - pdf_dict_puts(page->me, "Resources", ref); + pdf_drop_obj(ctx, page->resources); + ref = pdf_new_ref(ctx, doc, res); + page->resources = pdf_keep_obj(ctx, ref); + pdf_dict_puts(ctx, page->me, "Resources", ref); } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(new_obj); - pdf_drop_obj(new_ref); - pdf_drop_obj(res); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, new_obj); + pdf_drop_obj(ctx, new_ref); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { |