summaryrefslogtreecommitdiff
path: root/source/pdf
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2013-08-05 14:25:20 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2013-08-13 16:35:58 +0100
commit8d5ef1952803d060c8042de274fa7f59f1cdb66e (patch)
treed71f1f0cb302ca914c35ca4cb83b4f146dd0e818 /source/pdf
parent861f5f95873f79a564e7146662c3aa600bb07513 (diff)
downloadmupdf-8d5ef1952803d060c8042de274fa7f59f1cdb66e.tar.xz
Insert the extra layers required for a signature-appearance stream
Diffstat (limited to 'source/pdf')
-rw-r--r--source/pdf/pdf-appearance.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index e7d8a65b..e91b699e 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -1873,6 +1873,67 @@ static void center_rect_within_rect(const fz_rect *tofit, const fz_rect *within,
fz_pre_translate(mat, -tofit_center.x, -tofit_center.y);
}
+static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *annot)
+{
+ fz_context *ctx = doc->ctx;
+ pdf_obj *ap = pdf_dict_getp(annot->obj, "AP/N");
+ pdf_obj *main = NULL;
+ pdf_obj *frm = NULL;
+ pdf_obj *n0 = NULL;
+ fz_rect bbox;
+ fz_buffer *fzbuf = NULL;
+
+ pdf_to_rect(ctx, pdf_dict_gets(ap, "BBox"), &bbox);
+
+ fz_var(main);
+ fz_var(frm);
+ fz_var(n0);
+ fz_var(fzbuf);
+ fz_try(ctx)
+ {
+ main = pdf_new_xobject(doc, &bbox, &fz_identity);
+ frm = pdf_new_xobject(doc, &bbox, &fz_identity);
+ n0 = pdf_new_xobject(doc, &bbox, &fz_identity);
+
+ pdf_dict_putp(main, "Resources/XObject/FRM", frm);
+ fzbuf = fz_new_buffer(ctx, 8);
+ fz_buffer_printf(ctx, fzbuf, "/FRM Do");
+ pdf_update_stream(doc, pdf_to_num(main), fzbuf);
+ pdf_dict_puts_drop(main, "Length", pdf_new_int(doc, fzbuf->len));
+ fz_drop_buffer(ctx, fzbuf);
+ fzbuf = NULL;
+
+ pdf_dict_putp(frm, "Resources/XObject/n0", n0);
+ pdf_dict_putp(frm, "Resources/XObject/n2", ap);
+ fzbuf = fz_new_buffer(ctx, 8);
+ fz_buffer_printf(ctx, fzbuf, "q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Q");
+ pdf_update_stream(doc, pdf_to_num(frm), fzbuf);
+ pdf_dict_puts_drop(frm, "Length", pdf_new_int(doc, fzbuf->len));
+ fz_drop_buffer(ctx, fzbuf);
+ fzbuf = NULL;
+
+ fzbuf = fz_new_buffer(ctx, 8);
+ fz_buffer_printf(ctx, fzbuf, "%% DSBlank");
+ pdf_update_stream(doc, pdf_to_num(n0), fzbuf);
+ pdf_dict_puts_drop(n0, "Length", pdf_new_int(doc, fzbuf->len));
+ fz_drop_buffer(ctx, fzbuf);
+ fzbuf = NULL;
+
+ pdf_dict_putp(annot->obj, "AP/N", main);
+ }
+ fz_always(ctx)
+ {
+ pdf_drop_obj(main);
+ pdf_drop_obj(frm);
+ pdf_drop_obj(n0);
+ }
+ fz_catch(ctx)
+ {
+ fz_drop_buffer(ctx, fzbuf);
+ fz_rethrow(ctx);
+ }
+}
+
static float logo_color[3] = {1.0f, 0.85f, 0.85f};
void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date)
@@ -1956,6 +2017,8 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
* force a redraw on next pdf_update_page call */
pdf_drop_xobject(ctx, annot->ap);
annot->ap = NULL;
+
+ insert_signature_appearance_layers(doc, annot);
}
fz_always(ctx)
{