summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/tools/pdfposter.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/source/tools/pdfposter.c b/source/tools/pdfposter.c
index 1fa077c2..9a58909e 100644
--- a/source/tools/pdfposter.c
+++ b/source/tools/pdfposter.c
@@ -17,6 +17,38 @@ static void usage(void)
exit(1);
}
+static void
+intersect_box(fz_context *ctx, pdf_document *doc, pdf_obj *page, pdf_obj *box_name, const fz_rect *mb)
+{
+ pdf_obj *box = pdf_dict_get(ctx, page, box_name);
+ pdf_obj *newbox;
+ fz_rect old_rect;
+
+ if (box == NULL)
+ return;
+
+ old_rect.x0 = pdf_to_real(ctx, pdf_array_get(ctx, box, 0));
+ old_rect.y0 = pdf_to_real(ctx, pdf_array_get(ctx, box, 1));
+ old_rect.x1 = pdf_to_real(ctx, pdf_array_get(ctx, box, 2));
+ old_rect.y1 = pdf_to_real(ctx, pdf_array_get(ctx, box, 3));
+
+ if (old_rect.x0 < mb->x0)
+ old_rect.x0 = mb->x0;
+ if (old_rect.y0 < mb->y0)
+ old_rect.y0 = mb->y0;
+ if (old_rect.x1 > mb->x1)
+ old_rect.x1 = mb->x1;
+ if (old_rect.y1 > mb->y1)
+ old_rect.y1 = mb->y1;
+
+ newbox = pdf_new_array(ctx, doc, 4);
+ pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.x0));
+ pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.y0));
+ pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.x1));
+ pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.y1));
+ pdf_dict_put(ctx, page, box_name, newbox);
+}
+
/*
* Recreate page tree with our posterised pages in.
*/
@@ -98,6 +130,11 @@ static void decimatepages(fz_context *ctx, pdf_document *doc)
pdf_dict_put(ctx, newpageobj, PDF_NAME_Parent, parent);
pdf_dict_put(ctx, newpageobj, PDF_NAME_MediaBox, newmediabox);
+ intersect_box(ctx, doc, newpageobj, PDF_NAME_CropBox, &mb);
+ intersect_box(ctx, doc, newpageobj, PDF_NAME_BleedBox, &mb);
+ intersect_box(ctx, doc, newpageobj, PDF_NAME_TrimBox, &mb);
+ intersect_box(ctx, doc, newpageobj, PDF_NAME_ArtBox, &mb);
+
/* Store page object in new kids array */
pdf_array_push(ctx, kids, newpageref);