diff options
author | Jay Berkenbilt <ejb@ql.org> | 2021-02-26 20:47:52 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2021-03-03 23:05:19 +0100 |
commit | fa2516df712aa59eb414933a912d30bb6fa1606e (patch) | |
tree | 776307a8d4e513e0a8bcd6fdb586a1b8b722fcd1 /libqpdf/QPDFFormFieldObjectHelper.cc | |
parent | 5207c3da713f242506aeb4889b97ced362b13bdf (diff) | |
download | qpdf-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.cc | 53 |
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() && |