aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFFormFieldObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-02-26 20:47:52 +0100
committerJay Berkenbilt <ejb@ql.org>2021-03-03 23:05:19 +0100
commitfa2516df712aa59eb414933a912d30bb6fa1606e (patch)
tree776307a8d4e513e0a8bcd6fdb586a1b8b722fcd1 /libqpdf/QPDFFormFieldObjectHelper.cc
parent5207c3da713f242506aeb4889b97ced362b13bdf (diff)
downloadqpdf-fa2516df712aa59eb414933a912d30bb6fa1606e.tar.zst
Fix behavior for finding /Q, /DA, and /DR for form fields
If not found in the field hierarchy, /Q and /DA are supposed to be looked up in the document-level form dictionary. /DR is supposed to only come from the document dictionary.
Diffstat (limited to 'libqpdf/QPDFFormFieldObjectHelper.cc')
-rw-r--r--libqpdf/QPDFFormFieldObjectHelper.cc53
1 files changed, 49 insertions, 4 deletions
diff --git a/libqpdf/QPDFFormFieldObjectHelper.cc b/libqpdf/QPDFFormFieldObjectHelper.cc
index 6933cb54..c88934a8 100644
--- a/libqpdf/QPDFFormFieldObjectHelper.cc
+++ b/libqpdf/QPDFFormFieldObjectHelper.cc
@@ -63,6 +63,24 @@ QPDFFormFieldObjectHelper::getTopLevelField(bool* is_different)
}
QPDFObjectHandle
+QPDFFormFieldObjectHelper::getFieldFromAcroForm(std::string const& name)
+{
+ QPDFObjectHandle result = QPDFObjectHandle::newNull();
+ // Fields are supposed to be indirect, so this should work.
+ QPDF* q = this->oh.getOwningQPDF();
+ if (! q)
+ {
+ return result;
+ }
+ auto acroform = q->getRoot().getKey("/AcroForm");
+ if (! acroform.isDictionary())
+ {
+ return result;
+ }
+ return acroform.getKey(name);
+}
+
+QPDFObjectHandle
QPDFFormFieldObjectHelper::getInheritableFieldValue(std::string const& name)
{
QPDFObjectHandle node = this->oh;
@@ -203,20 +221,47 @@ QPDFFormFieldObjectHelper::getDefaultValueAsString()
return getInheritableFieldValueAsString("/DV");
}
+QPDFObjectHandle
+QPDFFormFieldObjectHelper::getDefaultResources()
+{
+ return getFieldFromAcroForm("/DR");
+}
+
std::string
QPDFFormFieldObjectHelper::getDefaultAppearance()
{
- return getInheritableFieldValueAsString("/DA");
+ auto value = getInheritableFieldValue("/DA");
+ bool looked_in_acroform = false;
+ if (! value.isString())
+ {
+ value = getFieldFromAcroForm("/DA");
+ looked_in_acroform = true;
+ }
+ std::string result;
+ if (value.isString())
+ {
+ QTC::TC("qpdf", "QPDFFormFieldObjectHelper DA present",
+ looked_in_acroform ? 0 : 1);
+ result = value.getUTF8Value();
+ }
+ return result;
}
int
QPDFFormFieldObjectHelper::getQuadding()
{
- int result = 0;
QPDFObjectHandle fv = getInheritableFieldValue("/Q");
+ bool looked_in_acroform = false;
+ if (! fv.isInteger())
+ {
+ fv = getFieldFromAcroForm("/Q");
+ looked_in_acroform = true;
+ }
+ int result = 0;
if (fv.isInteger())
{
- QTC::TC("qpdf", "QPDFFormFieldObjectHelper Q present");
+ QTC::TC("qpdf", "QPDFFormFieldObjectHelper Q present",
+ looked_in_acroform ? 0 : 1);
result = QIntC::to_int(fv.getIntValue());
}
return result;
@@ -920,7 +965,7 @@ QPDFFormFieldObjectHelper::generateTextAppearance(
QPDFObjectHandle font = getFontFromResource(resources, font_name);
if (! font.isInitialized())
{
- QPDFObjectHandle dr = getInheritableFieldValue("/DR");
+ QPDFObjectHandle dr = getDefaultResources();
font = getFontFromResource(dr, font_name);
}
if (font.isInitialized() &&