summaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFFormFieldObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-01-21 03:52:44 +0100
committerJay Berkenbilt <ejb@ql.org>2019-01-21 05:05:58 +0100
commit930eade6d36060b1bdc5934e74952fa6bcfdb07f (patch)
tree85657220073fc798ed15a94730c784b25527bada /libqpdf/QPDFFormFieldObjectHelper.cc
parent65ef0bf3130b69c8d48181ab27688567535f2d9f (diff)
downloadqpdf-930eade6d36060b1bdc5934e74952fa6bcfdb07f.tar.zst
Fix omissions in text appearance generation
When generating appearance streams for variable text annotations, properly handle the cases of there being no appearance dictionary, no appearance stream, or an appearance stream with no BMC..EMC marker.
Diffstat (limited to 'libqpdf/QPDFFormFieldObjectHelper.cc')
-rw-r--r--libqpdf/QPDFFormFieldObjectHelper.cc44
1 files changed, 42 insertions, 2 deletions
diff --git a/libqpdf/QPDFFormFieldObjectHelper.cc b/libqpdf/QPDFFormFieldObjectHelper.cc
index f7c37132..ccc19cb5 100644
--- a/libqpdf/QPDFFormFieldObjectHelper.cc
+++ b/libqpdf/QPDFFormFieldObjectHelper.cc
@@ -506,6 +506,7 @@ class ValueSetter: public QPDFObjectHandle::TokenFilter
{
}
virtual void handleToken(QPDFTokenizer::Token const&);
+ virtual void handleEOF();
void writeAppearance();
private:
@@ -515,6 +516,7 @@ class ValueSetter: public QPDFObjectHandle::TokenFilter
double tf;
QPDFObjectHandle::Rectangle bbox;
enum { st_top, st_bmc, st_emc, st_end } state;
+ bool replaced;
};
ValueSetter::ValueSetter(std::string const& DA, std::string const& V,
@@ -525,7 +527,8 @@ ValueSetter::ValueSetter(std::string const& DA, std::string const& V,
opt(opt),
tf(tf),
bbox(bbox),
- state(st_top)
+ state(st_top),
+ replaced(false)
{
}
@@ -575,8 +578,22 @@ ValueSetter::handleToken(QPDFTokenizer::Token const& token)
}
}
-void ValueSetter::writeAppearance()
+void
+ValueSetter::handleEOF()
{
+ if (! this->replaced)
+ {
+ QTC::TC("qpdf", "QPDFFormFieldObjectHelper replaced BMC at EOF");
+ write("/Tx BMC\n");
+ writeAppearance();
+ }
+}
+
+void
+ValueSetter::writeAppearance()
+{
+ this->replaced = true;
+
// This code does not take quadding into consideration because
// doing so requires font metric information, which we don't
// have in many cases.
@@ -768,6 +785,29 @@ QPDFFormFieldObjectHelper::generateTextAppearance(
QPDFAnnotationObjectHelper& aoh)
{
QPDFObjectHandle AS = aoh.getAppearanceStream("/N");
+ if (AS.isNull())
+ {
+ QTC::TC("qpdf", "QPDFFormFieldObjectHelper create AS from scratch");
+ QPDFObjectHandle::Rectangle rect = aoh.getRect();
+ QPDFObjectHandle::Rectangle bbox(
+ 0, 0, rect.urx - rect.llx, rect.ury - rect.lly);
+ QPDFObjectHandle dict = QPDFObjectHandle::parse(
+ "<< /Resources << /ProcSet [ /PDF /Text ] >>"
+ " /Type /XObject /Subtype /Form >>");
+ dict.replaceKey("/BBox", QPDFObjectHandle::newFromRectangle(bbox));
+ AS = QPDFObjectHandle::newStream(
+ this->oh.getOwningQPDF(), "/Tx BMC\nEMC\n");
+ AS.replaceDict(dict);
+ QPDFObjectHandle AP = aoh.getAppearanceDictionary();
+ if (AP.isNull())
+ {
+ QTC::TC("qpdf", "QPDFFormFieldObjectHelper create AP from scratch");
+ aoh.getObjectHandle().replaceKey(
+ "/AP", QPDFObjectHandle::newDictionary());
+ AP = aoh.getAppearanceDictionary();
+ }
+ AP.replaceKey("/N", AS);
+ }
if (! AS.isStream())
{
aoh.getObjectHandle().warnIfPossible(