diff options
-rw-r--r-- | include/mupdf/pdf/page.h | 8 | ||||
-rw-r--r-- | source/pdf/pdf-clean-file.c | 11 | ||||
-rw-r--r-- | source/pdf/pdf-page.c | 17 | ||||
-rw-r--r-- | source/tools/pdfmerge.c | 1 | ||||
-rw-r--r-- | source/tools/pdfposter.c | 13 |
5 files changed, 35 insertions, 15 deletions
diff --git a/include/mupdf/pdf/page.h b/include/mupdf/pdf/page.h index f1caf936..43634d46 100644 --- a/include/mupdf/pdf/page.h +++ b/include/mupdf/pdf/page.h @@ -14,6 +14,14 @@ pdf_obj *pdf_lookup_page_obj(fz_context *ctx, pdf_document *doc, int needle); int pdf_lookup_anchor(fz_context *ctx, pdf_document *doc, const char *name); /* + pdf_flatten_inheritable_page_items: Make page self sufficient. + + Copy any inheritable page keys into the actual page object, removing + any dependencies on the page tree parents. +*/ +void pdf_flatten_inheritable_page_items(fz_context *ctx, pdf_document *doc, pdf_obj *page); + +/* pdf_load_page: Load a page and its resources. Locates the page in the PDF document and loads the page and its 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); |