diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2024-01-17 13:32:59 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2024-01-18 11:46:07 +0100 |
commit | cb3eb907b89ef85ff9229cb4538652f5270f7a18 (patch) | |
tree | b011d5c82e36aff48640ccffde0c5b7c84082969 | |
parent | a3432d9826d3cae79306981b76303342b4aed41d (diff) |
Add pdf_set_page_box to modify page boxes using fitz coordinates.
-rw-r--r-- | include/mupdf/pdf/page.h | 2 | ||||
-rw-r--r-- | platform/java/jni/pdfpage.c | 16 | ||||
-rw-r--r-- | platform/java/mupdf_native.h | 8 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/PDFPage.java | 6 | ||||
-rw-r--r-- | source/pdf/pdf-page.c | 36 | ||||
-rw-r--r-- | source/tools/murun.c | 20 |
6 files changed, 88 insertions, 0 deletions
diff --git a/include/mupdf/pdf/page.h b/include/mupdf/pdf/page.h index e52f1bd07..0ec1aebc8 100644 --- a/include/mupdf/pdf/page.h +++ b/include/mupdf/pdf/page.h @@ -80,6 +80,8 @@ pdf_obj *pdf_page_resources(fz_context *ctx, pdf_page *page); pdf_obj *pdf_page_contents(fz_context *ctx, pdf_page *page); pdf_obj *pdf_page_group(fz_context *ctx, pdf_page *page); +void pdf_set_page_box(fz_context *ctx, pdf_page *page, fz_box_type box, fz_rect rect); + /* Get the separation details for a page. */ diff --git a/platform/java/jni/pdfpage.c b/platform/java/jni/pdfpage.c index cbce8ec1e..b6d18f547 100644 --- a/platform/java/jni/pdfpage.c +++ b/platform/java/jni/pdfpage.c @@ -253,3 +253,19 @@ FUN(PDFPage_getObject)(JNIEnv *env, jobject self) return to_PDFObject_safe_own(ctx, env, pdf_keep_obj(ctx, page->obj)); } + +JNIEXPORT void JNICALL +FUN(PDFPage_setPageBox)(JNIEnv *env, jobject self, jint box, jobject jrect) +{ + fz_context *ctx = get_context(env); + pdf_page *page = from_PDFPage(env, self); + fz_rect rect = from_Rect(env, jrect); + + if (!ctx || !page) + return; + + fz_try(ctx) + pdf_set_page_box(ctx, page, box, rect); + fz_catch(ctx) + jni_rethrow_void(env, ctx); +} diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index 5002cabc7..7d33c1c33 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -4894,6 +4894,14 @@ JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_PDFPage_createSignature JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_PDFPage_getTransform (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_PDFPage + * Method: setPageBox + * Signature: (ILcom/artifex/mupdf/fitz/Rect;)V + */ +JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_PDFPage_setPageBox + (JNIEnv *, jobject, jint, jobject); + #ifdef __cplusplus } #endif diff --git a/platform/java/src/com/artifex/mupdf/fitz/PDFPage.java b/platform/java/src/com/artifex/mupdf/fitz/PDFPage.java index d9ece0f8b..c2d208682 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/PDFPage.java +++ b/platform/java/src/com/artifex/mupdf/fitz/PDFPage.java @@ -93,5 +93,11 @@ public class PDFPage extends Page return createLink(bbox, LinkDestination.FitBH(0, page, y)); } + public native void setPageBox(int box, Rect rect); + + public void setCropBox(Rect rect) { + setPageBox(Page.CROP_BOX, rect); + } + // TODO: toPixmap with usage and page box } diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c index b87d98e52..a74e77e10 100644 --- a/source/pdf/pdf-page.c +++ b/source/pdf/pdf-page.c @@ -629,6 +629,42 @@ pdf_bound_page(fz_context *ctx, pdf_page *page, fz_box_type box) return fz_transform_rect(rect, page_ctm); } +/* + * Modify the page boxes (using fitz space coordinates). + * Note that changing the CropBox will change the fitz coordinate space mapping, + * invalidating all bounding boxes previously acquired. + */ +void +pdf_set_page_box(fz_context *ctx, pdf_page *page, fz_box_type box, fz_rect rect) +{ + fz_matrix page_ctm, inv_page_ctm; + fz_rect page_rect; + pdf_page_transform_box(ctx, page, NULL, &page_ctm, box); + inv_page_ctm = fz_invert_matrix(page_ctm); + page_rect = fz_transform_rect(rect, inv_page_ctm); + + switch (box) + { + case FZ_MEDIA_BOX: + pdf_dict_put_rect(ctx, page->obj, PDF_NAME(MediaBox), page_rect); + break; + case FZ_CROP_BOX: + pdf_dict_put_rect(ctx, page->obj, PDF_NAME(CropBox), page_rect); + break; + case FZ_BLEED_BOX: + pdf_dict_put_rect(ctx, page->obj, PDF_NAME(BleedBox), page_rect); + break; + case FZ_TRIM_BOX: + pdf_dict_put_rect(ctx, page->obj, PDF_NAME(TrimBox), page_rect); + break; + case FZ_ART_BOX: + pdf_dict_put_rect(ctx, page->obj, PDF_NAME(ArtBox), page_rect); + break; + case FZ_UNKNOWN_BOX: + fz_throw(ctx, FZ_ERROR_UNSUPPORTED, "unknown page box type: %d", box); + } +} + fz_link * pdf_load_links(fz_context *ctx, pdf_page *page) { diff --git a/source/tools/murun.c b/source/tools/murun.c index 327568e90..6c7f8bf69 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -7934,6 +7934,25 @@ static void ffi_PDFPage_getTransform(js_State *J) ffi_pushmatrix(J, ctm); } +static void ffi_PDFPage_setPageBox(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_page *page = js_touserdata(J, 0, "pdf_page"); + const char *box_name = js_tostring(J, 1); + fz_rect rect = ffi_torect(J, 2); + int box; + + box = fz_box_type_from_string(box_name); + if (box == FZ_UNKNOWN_BOX) + js_error(J, "invalid page box name"); + + fz_try(ctx) + pdf_set_page_box(ctx, page, box, rect); + fz_catch(ctx) + rethrow(J); +} + + static void ffi_PDFAnnotation_getBounds(js_State *J) { fz_context *ctx = js_getcontext(J); @@ -10392,6 +10411,7 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "PDFPage.process", ffi_PDFPage_process, 1); jsB_propfun(J, "PDFPage.toPixmap", ffi_PDFPage_toPixmap, 6); jsB_propfun(J, "PDFPage.getTransform", ffi_PDFPage_getTransform, 0); + jsB_propfun(J, "PDFPage.setPageBox", ffi_PDFPage_setPageBox, 2); } js_setregistry(J, "pdf_page"); |