diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-06-15 13:46:10 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2018-06-22 16:48:45 +0100 |
commit | 072703ee156c94cd951cf2c406f4ff64e2ed094f (patch) | |
tree | 7005be8fc2b81dac3d553bb37e7d8e820bbd1eab | |
parent | 23cc78236960753e6157d5038db9e960670f0c64 (diff) | |
download | mupdf-072703ee156c94cd951cf2c406f4ff64e2ed094f.tar.xz |
Call AA/F formatting when synthesizing appearance stream.
-rw-r--r-- | include/mupdf/pdf/event.h | 2 | ||||
-rw-r--r-- | source/pdf/pdf-appearance.c | 25 | ||||
-rw-r--r-- | source/pdf/pdf-form.c | 24 |
3 files changed, 32 insertions, 19 deletions
diff --git a/include/mupdf/pdf/event.h b/include/mupdf/pdf/event.h index 176ba71f..8c6709a7 100644 --- a/include/mupdf/pdf/event.h +++ b/include/mupdf/pdf/event.h @@ -213,4 +213,6 @@ void pdf_event_issue_exec_dialog(fz_context *ctx, pdf_document *doc); void pdf_event_issue_launch_url(fz_context *ctx, pdf_document *doc, const char *url, int new_frame); void pdf_event_issue_mail_doc(fz_context *ctx, pdf_document *doc, pdf_mail_doc_event *event); +void pdf_execute_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *a); + #endif diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index 5693fe3d..c3e94baa 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -990,7 +990,30 @@ pdf_write_widget_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf, int ff = pdf_get_field_flags(ctx, annot->page->doc, annot->obj); if (pdf_name_eq(ctx, ft, PDF_NAME(Tx))) { - char *text = pdf_field_value(ctx, annot->page->doc, annot->obj); + pdf_document *doc = annot->page->doc; + pdf_obj *f = pdf_dict_getl(ctx, annot->obj, PDF_NAME(AA), PDF_NAME(F), NULL); + char *text = NULL; + if (f && doc->js) + { + pdf_js_event e; + e.target = annot->obj; + e.value = pdf_field_value(ctx, doc, annot->obj); + fz_try(ctx) + pdf_js_setup_event(doc->js, &e); + fz_always(ctx) + fz_free(ctx, e.value); + fz_catch(ctx) + fz_rethrow(ctx); + pdf_execute_action(ctx, doc, annot->obj, f); + if (pdf_js_get_event(doc->js)->rc) + text = fz_strdup(ctx, pdf_js_get_event(doc->js)->value); + else + text = pdf_field_value(ctx, doc, annot->obj); + } + else + { + text = pdf_field_value(ctx, doc, annot->obj); + } fz_try(ctx) pdf_write_tx_widget_appearance(ctx, annot, buf, rect, bbox, matrix, res, text, ff); fz_always(ctx) diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index 167e1729..54cb1472 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -292,7 +292,7 @@ static void reset_form(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int } } -static void execute_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *a) +void pdf_execute_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *a) { if (a) { @@ -343,7 +343,7 @@ static void execute_action_chain(fz_context *ctx, pdf_document *doc, pdf_obj *ob while (a) { - execute_action(ctx, doc, obj, a); + pdf_execute_action(ctx, doc, obj, a); a = pdf_dict_get(ctx, a, PDF_NAME(Next)); } } @@ -359,7 +359,7 @@ static void execute_additional_action(fz_context *ctx, pdf_document *doc, pdf_ob e.target = obj; e.value = ""; pdf_js_setup_event(doc->js, &e); - execute_action(ctx, doc, obj, a); + pdf_execute_action(ctx, doc, obj, a); } } @@ -428,7 +428,7 @@ static void recalculate(fz_context *ctx, pdf_document *doc) e.target = field; e.value = pdf_field_value(ctx, doc, field); pdf_js_setup_event(doc->js, &e); - execute_action(ctx, doc, field, calc); + pdf_execute_action(ctx, doc, field, calc); /* A calculate action, updates event.value. We need * to place the value in the field */ update_field_value(ctx, doc, field, pdf_js_get_event(doc->js)->value); @@ -716,7 +716,6 @@ int pdf_widget_type(fz_context *ctx, pdf_widget *widget) static int set_text_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, const char *text) { pdf_obj *v = pdf_dict_getp(ctx, field, "AA/V"); - pdf_obj *f = pdf_dict_getp(ctx, field, "AA/F"); if (v && doc->js) { @@ -724,18 +723,7 @@ static int set_text_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *fie e.target = field; e.value = fz_strdup(ctx, text); pdf_js_setup_event(doc->js, &e); - execute_action(ctx, doc, field, v); - if (!pdf_js_get_event(doc->js)->rc) - return 0; - text = pdf_js_get_event(doc->js)->value; - } - if (f && doc->js) - { - pdf_js_event e; - e.target = field; - e.value = fz_strdup(ctx, text); - pdf_js_setup_event(doc->js, &e); - execute_action(ctx, doc, field, f); + pdf_execute_action(ctx, doc, field, v); if (!pdf_js_get_event(doc->js)->rc) return 0; text = pdf_js_get_event(doc->js)->value; @@ -1083,7 +1071,7 @@ static int run_keystroke(fz_context *ctx, pdf_document *doc, pdf_obj *field, cha e.target = field; e.value = *text; pdf_js_setup_event(doc->js, &e); - execute_action(ctx, doc, field, k); + pdf_execute_action(ctx, doc, field, k); if (!pdf_js_get_event(doc->js)->rc) return 0; |