From 74627fe0ccb279638f82472048311097b39741d5 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 30 Jun 2016 15:09:59 +0200 Subject: pdf: Flatten inheritable page properties when copying pages. Affects pdfclean, pdfmerge, and pdfposter. --- source/pdf/pdf-clean-file.c | 11 +++++------ source/pdf/pdf-page.c | 17 +++++++++++++++++ source/tools/pdfmerge.c | 1 + source/tools/pdfposter.c | 13 ++++--------- 4 files changed, 27 insertions(+), 15 deletions(-) (limited to 'source') diff --git a/source/pdf/pdf-clean-file.c b/source/pdf/pdf-clean-file.c index e886dc5f..94433eb2 100644 --- a/source/pdf/pdf-clean-file.c +++ b/source/pdf/pdf-clean-file.c @@ -30,6 +30,8 @@ static void retainpage(fz_context *ctx, pdf_document *doc, pdf_obj *parent, pdf_ pdf_obj *pageref = pdf_lookup_page_obj(ctx, doc, page-1); pdf_obj *pageobj = pdf_resolve_indirect(ctx, pageref); + pdf_flatten_inheritable_page_items(ctx, doc, pageobj); + pdf_dict_put(ctx, pageobj, PDF_NAME_Parent, parent); /* Store page object in new kids array */ @@ -170,7 +172,7 @@ static int strip_outlines(fz_context *ctx, pdf_document *doc, pdf_obj *outlines, static void retainpages(fz_context *ctx, globals *glo, int argc, char **argv) { - pdf_obj *oldroot, *root, *pages, *kids, *countobj, *parent, *olddests; + pdf_obj *oldroot, *root, *pages, *kids, *countobj, *olddests; pdf_document *doc = glo->doc; int argidx = 0; pdf_obj *names_list = NULL; @@ -199,7 +201,6 @@ static void retainpages(fz_context *ctx, globals *glo, int argc, char **argv) pdf_update_object(ctx, doc, pdf_to_num(ctx, oldroot), root); /* Create a new kids array with only the pages we want to keep */ - 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 */ @@ -214,17 +215,15 @@ static void retainpages(fz_context *ctx, globals *glo, int argc, char **argv) { if (spage < epage) for (page = spage; page <= epage; ++page) - retainpage(ctx, doc, parent, kids, page); + retainpage(ctx, doc, pages, kids, page); else for (page = spage; page >= epage; --page) - retainpage(ctx, doc, parent, kids, page); + retainpage(ctx, doc, pages, kids, page); } argidx++; } - pdf_drop_obj(ctx, parent); - /* Update page count and kids array */ countobj = pdf_new_int(ctx, doc, pdf_array_len(ctx, kids)); pdf_dict_put(ctx, pages, PDF_NAME_Count, countobj); diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c index 9fa96261..8ba02562 100644 --- a/source/pdf/pdf-page.c +++ b/source/pdf/pdf-page.c @@ -258,6 +258,23 @@ pdf_lookup_inherited_page_item(fz_context *ctx, pdf_document *doc, pdf_obj *node return val; } +static void +pdf_flatten_inheritable_page_item(fz_context *ctx, pdf_document *doc, pdf_obj *page, pdf_obj *key) +{ + pdf_obj *val = pdf_lookup_inherited_page_item(ctx, doc, page, key); + if (val) + pdf_dict_put(ctx, page, key, val); +} + +void +pdf_flatten_inheritable_page_items(fz_context *ctx, pdf_document *doc, pdf_obj *page) +{ + pdf_flatten_inheritable_page_item(ctx, doc, page, PDF_NAME_MediaBox); + pdf_flatten_inheritable_page_item(ctx, doc, page, PDF_NAME_CropBox); + pdf_flatten_inheritable_page_item(ctx, doc, page, PDF_NAME_Rotate); + pdf_flatten_inheritable_page_item(ctx, doc, page, PDF_NAME_Resources); +} + /* We need to know whether to install a page-level transparency group */ static int pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb); diff --git a/source/tools/pdfmerge.c b/source/tools/pdfmerge.c index bffcf541..bda2ffb7 100644 --- a/source/tools/pdfmerge.c +++ b/source/tools/pdfmerge.c @@ -41,6 +41,7 @@ static void page_merge(int page_from, int page_to, pdf_graft_map *graft_map) fz_try(ctx) { page_ref = pdf_lookup_page_obj(ctx, doc_src, page_from - 1); + pdf_flatten_inheritable_page_items(ctx, doc_src, page_ref); /* Make a new page object dictionary to hold the items we copy from the source page. */ page_dict = pdf_new_dict(ctx, doc_des, 4); diff --git a/source/tools/pdfposter.c b/source/tools/pdfposter.c index 92735386..81ca0d75 100644 --- a/source/tools/pdfposter.c +++ b/source/tools/pdfposter.c @@ -55,7 +55,7 @@ intersect_box(fz_context *ctx, pdf_document *doc, pdf_obj *page, pdf_obj *box_na static void decimatepages(fz_context *ctx, pdf_document *doc) { - pdf_obj *oldroot, *root, *pages, *kids, *parent; + pdf_obj *oldroot, *root, *pages, *kids; int num_pages = pdf_count_pages(ctx, doc); int page, kidcount; @@ -71,7 +71,6 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) pdf_drop_obj(ctx, root); /* Create a new kids array with our new pages in */ - parent = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, pages), pdf_to_gen(ctx, pages)); kids = pdf_new_array(ctx, doc, 1); kidcount = 0; @@ -102,12 +101,10 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) { pdf_obj *newpageobj, *newpageref, *newmediabox; fz_rect mb; - int num; newpageobj = pdf_copy_dict(ctx, pdf_lookup_page_obj(ctx, doc, page)); - num = pdf_create_object(ctx, doc); - pdf_update_object(ctx, doc, num, newpageobj); - newpageref = pdf_new_indirect(ctx, doc, num, 0); + pdf_flatten_inheritable_page_items(ctx, doc, newpageobj); + newpageref = pdf_add_object(ctx, doc, newpageobj); newmediabox = pdf_new_array(ctx, doc, 4); @@ -127,7 +124,7 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.x1)); pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.y1)); - pdf_dict_put(ctx, newpageobj, PDF_NAME_Parent, parent); + pdf_dict_put(ctx, newpageobj, PDF_NAME_Parent, pages); pdf_dict_put_drop(ctx, newpageobj, PDF_NAME_MediaBox, newmediabox); intersect_box(ctx, doc, newpageobj, PDF_NAME_CropBox, &mb); @@ -143,8 +140,6 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) } } - pdf_drop_obj(ctx, parent); - /* Update page count and kids array */ pdf_dict_put_drop(ctx, pages, PDF_NAME_Count, pdf_new_int(ctx, doc, kidcount)); pdf_dict_put_drop(ctx, pages, PDF_NAME_Kids, kids); -- cgit v1.2.3