aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFFormFieldObjectHelper.cc
diff options
context:
space:
mode:
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(