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

Reply via email to