[poppler] poppler/Annot.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Oct 12 16:19:18 UTC 2021


 poppler/Annot.cc |   31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

New commits:
commit 8fc71482b4ef9ceabe6159708dd2747e2648dd7d
Author: Georgiy Sgibnev <georgiy at lab50.net>
Date:   Wed Oct 6 11:47:34 2021 +0300

    The field rendering logic should take into account not only AcroForm's DR but also field's DR

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index f31e1533..caf64f53 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -51,6 +51,7 @@
 // Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, <info at kdab.com>.
 // Copyright (C) 2021 Zachary Travis <ztravis at everlaw.com>
 // Copyright (C) 2021 Mahmoud Ahmed Khalil <mahmoudkhalil11 at gmail.com>
+// Copyright (C) 2021 Georgiy Sgibnev <georgiy at sgibnev.com>. Work sponsored by lab50.net.
 //
 // To see a description of the changes please see the Changelog file that
 // came with your tarball or type make ChangeLog if you are building from git
@@ -5101,13 +5102,31 @@ void AnnotWidget::generateFieldAppearance()
     if (!da && form)
         da = form->getDefaultAppearance();
 
-    const GfxResources *resources = form ? form->getDefaultResources() : nullptr;
     Dict *appearDict = new Dict(doc->getXRef());
 
+    // Let's init resourcesDictObj and resources.
+    // In PDF 1.2, an additional entry in the field dictionary, DR, was defined.
+    // Beginning with PDF 1.5, this entry is obsolete.
+    // And yet Acrobat Reader seems to be taking a field's DR into account.
     Object resourcesDictObj;
-    if (form && form->getDefaultResourcesObj()->isDict()) {
-        resourcesDictObj = form->getDefaultResourcesObj()->copy();
-    } else {
+    const GfxResources *resources = nullptr;
+    GfxResources *resourcesToFree = nullptr;
+    if (field && field->getObj() && field->getObj()->isDict()) {
+        // Let's use a field's resource dictionary.
+        resourcesDictObj = field->getObj()->dictLookup("DR");
+        if (resourcesDictObj.isDict()) {
+            resourcesToFree = new GfxResources(doc->getXRef(), resourcesDictObj.getDict(), form ? form->getDefaultResources() : nullptr);
+            resources = resourcesToFree;
+        }
+    }
+    if (!resourcesDictObj.isDict()) {
+        // No luck with a field's resource dictionary. Let's use an AcroForm's resource dictionary.
+        if (form && form->getDefaultResourcesObj()->isDict()) {
+            resourcesDictObj = form->getDefaultResourcesObj()->copy();
+            resources = form->getDefaultResources();
+        }
+    }
+    if (!resourcesDictObj.isDict()) {
         resourcesDictObj = Object(new Dict(doc->getXRef()));
     }
 
@@ -5136,6 +5155,10 @@ void AnnotWidget::generateFieldAppearance()
     // build the appearance stream
     Stream *appearStream = new AutoFreeMemStream(copyString(appearBuf->c_str()), 0, appearBuf->getLength(), Object(appearDict));
     appearance = Object(appearStream);
+
+    if (resourcesToFree) {
+        delete resourcesToFree;
+    }
 }
 
 void AnnotWidget::updateAppearanceStream()


More information about the poppler mailing list