On Monday, August 20, 2012 10:58:44 AM Alexander Finder wrote: > Hi Fabio, Hi Alexander,
> did you find out how to change the associated appearance stream meanwhile? > Is there any work in progress or how can I resolve that by myself, > respectively? I don't know of anyone working on this. I had written a proof-of-concept patch that seems to fix your document, but I remember there was some good reason why I didn't publish it, but I can't remember any more :D I'm attaching it here, in case it helps you. Of course I'll post when it comes back to my mind :) Fabio
From 25102ea630570524afda77a984a04c15e2605550 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso <[email protected]> Date: Wed, 13 Jun 2012 17:50:52 +0200 Subject: [PATCH] Update AP stream when contents of a form text field are changed --- poppler/Annot.cc | 22 ++++++++++++++++++++++ poppler/Annot.h | 1 + poppler/Form.cc | 15 +++++++++++++++ poppler/Form.h | 2 ++ 4 files changed, 40 insertions(+), 0 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index e55ddde..2028af3 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -4868,6 +4868,28 @@ void AnnotWidget::generateFieldAppearance() { appearStream->setNeedFree(gTrue); } +void AnnotWidget::regenerateAppearance() { + Object obj1, obj2; + Ref apRef; + + // Remove old appearance (if any) + invalidateAppearance(); + + // Generate new appearance and tell the xref + generateFieldAppearance(); + appearance.fetch(xref, &obj1); + apRef = xref->addIndirectObject(&obj1); + obj1.free(); + + // Set AP field in the annotation dictionary + obj1.initDict(xref); + obj1.dictAdd(copyString("N"), obj2.initRef(apRef.num, apRef.gen)); + update("AP", &obj1); + + // Update our internal pointers to the appearance dictionary + appearStreams = new AnnotAppearance(doc, &obj1); +} + void AnnotWidget::draw(Gfx *gfx, GBool printing) { Object obj; diff --git a/poppler/Annot.h b/poppler/Annot.h index 0d20cc7..3236ec0 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -1274,6 +1274,7 @@ public: void drawFormFieldText(GfxResources *resources, GooString *da); void drawFormFieldChoice(GfxResources *resources, GooString *da); void generateFieldAppearance (); + void regenerateAppearance(); AnnotWidgetHighlightMode getMode() { return mode; } AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } diff --git a/poppler/Form.cc b/poppler/Form.cc index 99d7bbb..73327cd 100644 --- a/poppler/Form.cc +++ b/poppler/Form.cc @@ -159,6 +159,10 @@ LinkAction *FormWidget::getActivationAction() { return widget ? widget->getAction() : NULL; } +void FormWidget::regenerateAppearance() { + widget->regenerateAppearance(); +} + FormWidgetButton::FormWidgetButton (PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) : FormWidget(docA, aobj, num, ref, p) { @@ -768,6 +772,16 @@ GooString* FormField::getFullyQualifiedName() { return fullyQualifiedName; } +void FormField::regenerateAppearance() { + if (terminal) { + for (int i = 0; i < numChildren; i++) + widgets[i]->regenerateAppearance(); + } else { + for (int i = 0; i < numChildren; i++) + children[i]->regenerateAppearance(); + } +} + //------------------------------------------------------------------------ // FormFieldButton //------------------------------------------------------------------------ @@ -1020,6 +1034,7 @@ void FormFieldText::setContentCopy (GooString* new_content) obj.getDict()->set("V", &obj1); xref->setModifiedObject(&obj, ref); modified = gTrue; + regenerateAppearance(); } FormFieldText::~FormFieldText() diff --git a/poppler/Form.h b/poppler/Form.h index fa3c718..17c53f1 100644 --- a/poppler/Form.h +++ b/poppler/Form.h @@ -108,6 +108,7 @@ public: void createWidgetAnnotation(); AnnotWidget *getWidgetAnnotation() const { return widget; } + void regenerateAppearance(); #ifdef DEBUG_FORMS void print(int indent = 0); @@ -297,6 +298,7 @@ public: protected: void _createWidget (Object *obj, Ref aref); void createChildren(std::set<int> *usedParents); + void regenerateAppearance(); FormFieldType type; // field type Ref ref; -- 1.7.6.5
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
