summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-06-15 13:46:10 +0200
committerRobin Watts <robin.watts@artifex.com>2018-06-22 16:48:45 +0100
commit072703ee156c94cd951cf2c406f4ff64e2ed094f (patch)
tree7005be8fc2b81dac3d553bb37e7d8e820bbd1eab /source
parent23cc78236960753e6157d5038db9e960670f0c64 (diff)
downloadmupdf-072703ee156c94cd951cf2c406f4ff64e2ed094f.tar.xz
Call AA/F formatting when synthesizing appearance stream.
Diffstat (limited to 'source')
-rw-r--r--source/pdf/pdf-appearance.c25
-rw-r--r--source/pdf/pdf-form.c24
2 files changed, 30 insertions, 19 deletions
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;