Commit 4d0ccbe46b9457e70a5c897af472657a56f7569c
1 parent
ed7f3d5e
Refactor AcroForm handling by introducing `AcroForm` class for better encapsulat…
…ion and leveraging shared components.
Showing
2 changed files
with
40 additions
and
17 deletions
libqpdf/QPDFAcroFormDocumentHelper.cc
| 1 | 1 | #include <qpdf/QPDFAcroFormDocumentHelper.hh> |
| 2 | 2 | |
| 3 | +#include <qpdf/FormField.hh> | |
| 4 | + | |
| 3 | 5 | #include <qpdf/Pl_Buffer.hh> |
| 4 | 6 | #include <qpdf/QPDFObjectHandle_private.hh> |
| 5 | 7 | #include <qpdf/QPDFPageDocumentHelper.hh> |
| ... | ... | @@ -14,29 +16,20 @@ |
| 14 | 16 | using namespace qpdf; |
| 15 | 17 | using namespace std::literals; |
| 16 | 18 | |
| 17 | -class QPDFAcroFormDocumentHelper::Members | |
| 19 | +using AcroForm = impl::AcroForm; | |
| 20 | + | |
| 21 | +class QPDFAcroFormDocumentHelper::Members: public AcroForm | |
| 18 | 22 | { |
| 19 | 23 | public: |
| 20 | - Members() = default; | |
| 21 | - Members(Members const&) = delete; | |
| 22 | - ~Members() = default; | |
| 23 | - | |
| 24 | - struct FieldData | |
| 24 | + Members(QPDF& qpdf) : | |
| 25 | + AcroForm(qpdf.doc()) | |
| 25 | 26 | { |
| 26 | - std::vector<QPDFAnnotationObjectHelper> annotations; | |
| 27 | - std::string name; | |
| 28 | - }; | |
| 29 | - | |
| 30 | - bool cache_valid{false}; | |
| 31 | - std::map<QPDFObjGen, FieldData> field_to; | |
| 32 | - std::map<QPDFObjGen, QPDFFormFieldObjectHelper> annotation_to_field; | |
| 33 | - std::map<std::string, std::set<QPDFObjGen>> name_to_fields; | |
| 34 | - std::set<QPDFObjGen> bad_fields; | |
| 27 | + } | |
| 35 | 28 | }; |
| 36 | 29 | |
| 37 | 30 | QPDFAcroFormDocumentHelper::QPDFAcroFormDocumentHelper(QPDF& qpdf) : |
| 38 | 31 | QPDFDocumentHelper(qpdf), |
| 39 | - m(std::make_shared<Members>()) | |
| 32 | + m(std::make_shared<Members>(qpdf)) | |
| 40 | 33 | { |
| 41 | 34 | // We have to analyze up front. Otherwise, when we are adding annotations and fields, we are in |
| 42 | 35 | // a temporarily unstable configuration where some widget annotations are not reachable. |
| ... | ... | @@ -62,6 +55,7 @@ QPDFAcroFormDocumentHelper::invalidateCache() |
| 62 | 55 | m->cache_valid = false; |
| 63 | 56 | m->field_to.clear(); |
| 64 | 57 | m->annotation_to_field.clear(); |
| 58 | + m->bad_fields.clear(); | |
| 65 | 59 | } |
| 66 | 60 | |
| 67 | 61 | bool | ... | ... |
libqpdf/qpdf/FormField.hh
| ... | ... | @@ -3,6 +3,7 @@ |
| 3 | 3 | |
| 4 | 4 | #include <qpdf/QPDFObjectHandle_private.hh> |
| 5 | 5 | #include <qpdf/QPDFObjectHelper.hh> |
| 6 | +#include <qpdf/QPDF_private.hh> | |
| 6 | 7 | |
| 7 | 8 | #include <vector> |
| 8 | 9 | |
| ... | ... | @@ -10,6 +11,34 @@ class QPDFAnnotationObjectHelper; |
| 10 | 11 | |
| 11 | 12 | namespace qpdf::impl |
| 12 | 13 | { |
| 14 | + class AcroForm: public Doc::Common | |
| 15 | + { | |
| 16 | + public: | |
| 17 | + AcroForm() = delete; | |
| 18 | + AcroForm(AcroForm const&) = delete; | |
| 19 | + AcroForm(AcroForm&&) = delete; | |
| 20 | + AcroForm& operator=(AcroForm const&) = delete; | |
| 21 | + AcroForm& operator=(AcroForm&&) = delete; | |
| 22 | + ~AcroForm() = default; | |
| 23 | + | |
| 24 | + AcroForm(impl::Doc& doc) : | |
| 25 | + Common(doc) | |
| 26 | + { | |
| 27 | + } | |
| 28 | + | |
| 29 | + struct FieldData | |
| 30 | + { | |
| 31 | + std::vector<QPDFAnnotationObjectHelper> annotations; | |
| 32 | + std::string name; | |
| 33 | + }; | |
| 34 | + | |
| 35 | + bool cache_valid{false}; | |
| 36 | + std::map<QPDFObjGen, FieldData> field_to; | |
| 37 | + std::map<QPDFObjGen, QPDFFormFieldObjectHelper> annotation_to_field; | |
| 38 | + std::map<std::string, std::set<QPDFObjGen>> name_to_fields; | |
| 39 | + std::set<QPDFObjGen> bad_fields; | |
| 40 | + }; // class AcroForm | |
| 41 | + | |
| 13 | 42 | /// @class FormNode |
| 14 | 43 | /// @brief Represents a node in the interactive forms tree of a PDF document. |
| 15 | 44 | /// |
| ... | ... | @@ -390,7 +419,7 @@ namespace qpdf::impl |
| 390 | 419 | getFontFromResource(QPDFObjectHandle resources, std::string const& font_name); |
| 391 | 420 | |
| 392 | 421 | static const QPDFObjectHandle null_oh; |
| 393 | - }; | |
| 422 | + }; // class FormNode | |
| 394 | 423 | } // namespace qpdf::impl |
| 395 | 424 | |
| 396 | 425 | #endif // FORMFIELD_HH | ... | ... |