summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/pdf/annot.h14
-rw-r--r--platform/java/mupdf_native.c55
-rw-r--r--platform/java/mupdf_native.h16
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/PDFAnnotation.java2
-rw-r--r--source/pdf/pdf-annot-edit.c55
-rw-r--r--source/tools/murun.c48
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");