summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2024-01-17 13:32:59 +0100
committerTor Andersson <tor.andersson@artifex.com>2024-01-18 11:46:07 +0100
commitcb3eb907b89ef85ff9229cb4538652f5270f7a18 (patch)
treeb011d5c82e36aff48640ccffde0c5b7c84082969
parenta3432d9826d3cae79306981b76303342b4aed41d (diff)
Add pdf_set_page_box to modify page boxes using fitz coordinates.
-rw-r--r--include/mupdf/pdf/page.h2
-rw-r--r--platform/java/jni/pdfpage.c16
-rw-r--r--platform/java/mupdf_native.h8
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/PDFPage.java6
-rw-r--r--source/pdf/pdf-page.c36
-rw-r--r--source/tools/murun.c20
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");