diff options
-rw-r--r-- | include/mupdf/pdf/annot.h | 14 | ||||
-rw-r--r-- | platform/java/mupdf_native.c | 55 | ||||
-rw-r--r-- | platform/java/mupdf_native.h | 16 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/PDFAnnotation.java | 2 | ||||
-rw-r--r-- | source/pdf/pdf-annot-edit.c | 55 | ||||
-rw-r--r-- | source/tools/murun.c | 48 |
6 files changed, 172 insertions, 18 deletions
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h index df068bc1..e03ded3f 100644 --- a/include/mupdf/pdf/annot.h +++ b/include/mupdf/pdf/annot.h @@ -144,6 +144,7 @@ int pdf_annot_has_interior_color(fz_context *ctx, pdf_annot *annot); int pdf_annot_has_line_ending_styles(fz_context *ctx, pdf_annot *annot); int pdf_annot_has_icon_name(fz_context *ctx, pdf_annot *annot); int pdf_annot_has_open(fz_context *ctx, pdf_annot *annot); +int pdf_annot_has_author(fz_context *ctx, pdf_annot *annot); int pdf_annot_flags(fz_context *ctx, pdf_annot *annot); void pdf_annot_rect(fz_context *ctx, pdf_annot *annot, fz_rect *rect); @@ -184,19 +185,24 @@ void pdf_annot_vertex(fz_context *ctx, pdf_annot *annot, int i, float v[2]); void pdf_set_text_annot_position(fz_context *ctx, pdf_annot *annot, fz_point pt); /* + pdf_copy_annot_contents: return a copy of the contents of an annotation. +*/ +char *pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot); + +/* pdf_set_annot_contents: set the contents of an annotation. */ void pdf_set_annot_contents(fz_context *ctx, pdf_annot *annot, const char *text); /* - pdf_annot_contents: return the contents of an annotation. + pdf_copy_annot_author: return a copy of the author of an annotation. */ -const char *pdf_annot_contents(fz_context *ctx, pdf_annot *annot); +char *pdf_copy_annot_author(fz_context *ctx, pdf_annot *annot); /* - pdf_annot_author: return the author of an annotation. + pdf_set_annot_author: set the author of an annotation. */ -const char *pdf_annot_author(fz_context *ctx, pdf_annot *annot); +void pdf_set_annot_author(fz_context *ctx, pdf_annot *annot, const char *author); /* pdf_annot_author: return the date of an annotation. diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 95f6e9b6..890bc6b1 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -8213,19 +8213,22 @@ FUN(PDFAnnotation_getContents)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); pdf_annot *annot = from_PDFAnnotation(env, self); - const char *contents = NULL; + char *contents = NULL; + jstring result; if (!ctx || !annot) return NULL; fz_try(ctx) - contents = pdf_annot_contents(ctx, annot); + contents = pdf_copy_annot_contents(ctx, annot); fz_catch(ctx) { jni_rethrow(env, ctx); return NULL; } - return (*env)->NewStringUTF(env, contents); + result = (*env)->NewStringUTF(env, contents); + fz_free(ctx, contents); + return result; } JNIEXPORT void JNICALL @@ -8251,6 +8254,52 @@ FUN(PDFAnnotation_setContents)(JNIEnv *env, jobject self, jstring jcontents) jni_rethrow(env, ctx); } +JNIEXPORT jstring JNICALL +FUN(PDFAnnotation_getAuthor)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + pdf_annot *annot = from_PDFAnnotation(env, self); + char *author = NULL; + jstring result; + + if (!ctx || !annot) return NULL; + + fz_try(ctx) + author = pdf_copy_annot_author(ctx, annot); + fz_catch(ctx) + { + jni_rethrow(env, ctx); + return NULL; + } + + result = (*env)->NewStringUTF(env, author); + fz_free(ctx, author); + return result; +} + +JNIEXPORT void JNICALL +FUN(PDFAnnotation_setAuthor)(JNIEnv *env, jobject self, jstring jauthor) +{ + fz_context *ctx = get_context(env); + pdf_annot *annot = from_PDFAnnotation(env, self); + const char *author = NULL; + + if (!ctx || !annot) return; + if (jauthor) + { + author = (*env)->GetStringUTFChars(env, jauthor, NULL); + if (!author) return; + } + + fz_try(ctx) + pdf_set_annot_author(ctx, annot, author); + fz_always(ctx) + if (author) + (*env)->ReleaseStringUTFChars(env, jauthor, author); + fz_catch(ctx) + jni_rethrow(env, ctx); +} + JNIEXPORT jobject JNICALL FUN(PDFAnnotation_getRect)(JNIEnv *env, jobject self) { diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index 2a139e02..dfc62d85 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -1506,6 +1506,22 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_PDFAnnotation_setInteriorColo /* * Class: com_artifex_mupdf_fitz_PDFAnnotation + * Method: getAuthor + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_artifex_mupdf_fitz_PDFAnnotation_getAuthor + (JNIEnv *, jobject); + +/* + * Class: com_artifex_mupdf_fitz_PDFAnnotation + * Method: setAuthor + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_PDFAnnotation_setAuthor + (JNIEnv *, jobject, jstring); + +/* + * Class: com_artifex_mupdf_fitz_PDFAnnotation * Method: getLineEndingStyles * Signature: ()[I */ diff --git a/platform/java/src/com/artifex/mupdf/fitz/PDFAnnotation.java b/platform/java/src/com/artifex/mupdf/fitz/PDFAnnotation.java index 19ef815f..f836a601 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/PDFAnnotation.java +++ b/platform/java/src/com/artifex/mupdf/fitz/PDFAnnotation.java @@ -60,6 +60,8 @@ public class PDFAnnotation extends Annotation public native void setColor(float[] color); public native float[] getInteriorColor(); public native void setInteriorColor(float[] color); + public native String getAuthor(); + public native void setAuthor(String author); public native int[] getLineEndingStyles(); public native void setLineEndingStyles(int startStyle, int endStyle); diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c index 20aeff11..09e63002 100644 --- a/source/pdf/pdf-annot-edit.c +++ b/source/pdf/pdf-annot-edit.c @@ -259,17 +259,18 @@ pdf_set_annot_rect(fz_context *ctx, pdf_annot *annot, const fz_rect *rect) pdf_dirty_annot(ctx, annot); } -const char * -pdf_annot_contents(fz_context *ctx, pdf_annot *annot) +char * +pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot) { - return pdf_to_str_buf(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_Contents)); + return pdf_to_utf8(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_Contents)); } void pdf_set_annot_contents(fz_context *ctx, pdf_annot *annot, const char *text) { pdf_document *doc = annot->page->doc; - pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_Contents, pdf_new_string(ctx, doc, text, strlen(text))); + pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_Contents, + pdf_new_text_string(ctx, doc, text)); pdf_dirty_annot(ctx, annot); } @@ -842,11 +843,25 @@ pdf_set_text_annot_position(fz_context *ctx, pdf_annot *annot, fz_point pt) pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_F, pdf_new_int(ctx, doc, flags)); } -const char * -pdf_annot_author(fz_context *ctx, pdf_annot *annot) -{ - return pdf_to_str_buf(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_T)); -} +static pdf_obj *markup_subtypes[] = { + PDF_NAME_Text, + PDF_NAME_FreeText, + PDF_NAME_Line, + PDF_NAME_Square, + PDF_NAME_Circle, + PDF_NAME_Polygon, + PDF_NAME_PolyLine, + PDF_NAME_Highlight, + PDF_NAME_Underline, + PDF_NAME_Squiggly, + PDF_NAME_StrikeOut, + PDF_NAME_Stamp, + PDF_NAME_Caret, + PDF_NAME_Ink, + PDF_NAME_FileAttachment, + PDF_NAME_Sound, + NULL, +}; const char * pdf_annot_date(fz_context *ctx, pdf_annot *annot) @@ -855,6 +870,28 @@ pdf_annot_date(fz_context *ctx, pdf_annot *annot) return pdf_to_str_buf(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_CreationDate)); } +int +pdf_annot_has_author(fz_context *ctx, pdf_annot *annot) +{ + return is_allowed_subtype(ctx, annot, PDF_NAME_T, markup_subtypes); +} + +char * +pdf_copy_annot_author(fz_context *ctx, pdf_annot *annot) +{ + check_allowed_subtypes(ctx, annot, PDF_NAME_T, markup_subtypes); + return pdf_to_utf8(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_T)); +} + +void +pdf_set_annot_author(fz_context *ctx, pdf_annot *annot, const char *author) +{ + pdf_document *doc = annot->page->doc; + check_allowed_subtypes(ctx, annot, PDF_NAME_T, markup_subtypes); + pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_T, pdf_new_text_string(ctx, doc, author)); + pdf_dirty_annot(ctx, annot); +} + pdf_obj * pdf_annot_irt(fz_context *ctx, pdf_annot *annot) { diff --git a/source/tools/murun.c b/source/tools/murun.c index e90821c4..69765164 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -3988,12 +3988,21 @@ static void ffi_PDFAnnotation_getContents(js_State *J) { fz_context *ctx = js_getcontext(J); pdf_annot *annot = js_touserdata(J, 0, "pdf_annot"); - const char *contents = NULL; + char *contents = NULL; + fz_try(ctx) - contents = pdf_annot_contents(ctx, annot); + contents = pdf_copy_annot_contents(ctx, annot); fz_catch(ctx) rethrow(J); + + if (js_try(J)) { + fz_free(ctx, contents); + js_throw(J); + } js_pushstring(J, contents); + js_endtry(J); + + fz_free(ctx, contents); } static void ffi_PDFAnnotation_setContents(js_State *J) @@ -4270,6 +4279,39 @@ static void ffi_PDFAnnotation_setInkList(js_State *J) rethrow(J); } +static void ffi_PDFAnnotation_getAuthor(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_annot *annot = js_touserdata(J, 0, "pdf_annot"); + char *author = NULL; + + fz_try(ctx) + author = pdf_copy_annot_author(ctx, annot); + fz_catch(ctx) + rethrow(J); + + if (js_try(J)) { + fz_free(ctx, author); + js_throw(J); + } + js_pushstring(J, author); + js_endtry(J); + + fz_free(ctx, author); +} + +static void ffi_PDFAnnotation_setAuthor(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_annot *annot = js_touserdata(J, 0, "pdf_annot"); + const char *author = js_tostring(J, 1); + + fz_try(ctx) + pdf_set_annot_author(ctx, annot, author); + fz_catch(ctx) + rethrow(J); +} + static void ffi_PDFAnnotation_updateAppearance(js_State *J) { fz_context *ctx = js_getcontext(J); @@ -4599,6 +4641,8 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "PDFAnnotation.setQuadPoints", ffi_PDFAnnotation_setQuadPoints, 1); jsB_propfun(J, "PDFAnnotation.getInkList", ffi_PDFAnnotation_getInkList, 0); jsB_propfun(J, "PDFAnnotation.setInkList", ffi_PDFAnnotation_setInkList, 1); + jsB_propfun(J, "PDFAnnotation.getAuthor", ffi_PDFAnnotation_getAuthor, 0); + jsB_propfun(J, "PDFAnnotation.setAuthor", ffi_PDFAnnotation_setAuthor, 1); jsB_propfun(J, "PDFAnnotation.updateAppearance", ffi_PDFAnnotation_updateAppearance, 0); } js_setregistry(J, "pdf_annot"); |