Commit e64965e31be2e3b7059a9b8fe31bb345bddb4e2f

Authored by m-holger
1 parent 79a9701f

Refactor `QPDF`: centralize access to `QPDFAcroFormDocumentHelper` using a dedic…

…ated `acroform()` method and update related references for improved performance, consistency and maintainability.
include/qpdf/QPDF.hh
@@ -57,6 +57,7 @@ class BitWriter; @@ -57,6 +57,7 @@ class BitWriter;
57 class BufferInputSource; 57 class BufferInputSource;
58 class QPDFLogger; 58 class QPDFLogger;
59 class QPDFParser; 59 class QPDFParser;
  60 +class QPDFAcroFormDocumentHelper;
60 61
61 class QPDF 62 class QPDF
62 { 63 {
@@ -792,6 +793,7 @@ class QPDF @@ -792,6 +793,7 @@ class QPDF
792 class JobSetter; 793 class JobSetter;
793 794
794 inline bool reconstructed_xref() const; 795 inline bool reconstructed_xref() const;
  796 + inline QPDFAcroFormDocumentHelper& acroform();
795 797
796 // For testing only -- do not add to DLL 798 // For testing only -- do not add to DLL
797 static bool test_json_validators(); 799 static bool test_json_validators();
libqpdf/QPDFFormFieldObjectHelper.cc
@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
5 #include <qpdf/QPDFAcroFormDocumentHelper.hh> 5 #include <qpdf/QPDFAcroFormDocumentHelper.hh>
6 #include <qpdf/QPDFAnnotationObjectHelper.hh> 6 #include <qpdf/QPDFAnnotationObjectHelper.hh>
7 #include <qpdf/QPDFObjectHandle_private.hh> 7 #include <qpdf/QPDFObjectHandle_private.hh>
  8 +#include <qpdf/QPDF_private.hh>
8 #include <qpdf/QTC.hh> 9 #include <qpdf/QTC.hh>
9 #include <qpdf/QUtil.hh> 10 #include <qpdf/QUtil.hh>
10 #include <cstdlib> 11 #include <cstdlib>
@@ -337,7 +338,7 @@ QPDFFormFieldObjectHelper::setV(QPDFObjectHandle value, bool need_appearances) @@ -337,7 +338,7 @@ QPDFFormFieldObjectHelper::setV(QPDFObjectHandle value, bool need_appearances)
337 QPDF& qpdf = oh().getQPDF( 338 QPDF& qpdf = oh().getQPDF(
338 "QPDFFormFieldObjectHelper::setV called with need_appearances = " 339 "QPDFFormFieldObjectHelper::setV called with need_appearances = "
339 "true on an object that is not associated with an owning QPDF"); 340 "true on an object that is not associated with an owning QPDF");
340 - QPDFAcroFormDocumentHelper(qpdf).setNeedAppearances(true); 341 + qpdf.acroform().setNeedAppearances(true);
341 } 342 }
342 } 343 }
343 344
libqpdf/QPDFJob.cc
@@ -1180,7 +1180,7 @@ void @@ -1180,7 +1180,7 @@ void
1180 QPDFJob::doJSONAcroform(Pipeline* p, bool& first, QPDF& pdf) 1180 QPDFJob::doJSONAcroform(Pipeline* p, bool& first, QPDF& pdf)
1181 { 1181 {
1182 JSON j_acroform = JSON::makeDictionary(); 1182 JSON j_acroform = JSON::makeDictionary();
1183 - QPDFAcroFormDocumentHelper afdh(pdf); 1183 + auto& afdh = pdf.acroform();
1184 j_acroform.addDictionaryMember("hasacroform", JSON::makeBool(afdh.hasAcroForm())); 1184 j_acroform.addDictionaryMember("hasacroform", JSON::makeBool(afdh.hasAcroForm()));
1185 j_acroform.addDictionaryMember("needappearances", JSON::makeBool(afdh.getNeedAppearances())); 1185 j_acroform.addDictionaryMember("needappearances", JSON::makeBool(afdh.getNeedAppearances()));
1186 JSON j_fields = j_acroform.addDictionaryMember("fields", JSON::makeArray()); 1186 JSON j_fields = j_acroform.addDictionaryMember("fields", JSON::makeArray());
@@ -3013,7 +3013,7 @@ QPDFJob::doSplitPages(QPDF&amp; pdf) @@ -3013,7 +3013,7 @@ QPDFJob::doSplitPages(QPDF&amp; pdf)
3013 dh.removeUnreferencedResources(); 3013 dh.removeUnreferencedResources();
3014 } 3014 }
3015 QPDFPageLabelDocumentHelper pldh(pdf); 3015 QPDFPageLabelDocumentHelper pldh(pdf);
3016 - QPDFAcroFormDocumentHelper afdh(pdf); 3016 + auto& afdh = pdf.acroform();
3017 std::vector<QPDFObjectHandle> const& pages = pdf.getAllPages(); 3017 std::vector<QPDFObjectHandle> const& pages = pdf.getAllPages();
3018 size_t pageno_len = std::to_string(pages.size()).length(); 3018 size_t pageno_len = std::to_string(pages.size()).length();
3019 size_t num_pages = pages.size(); 3019 size_t num_pages = pages.size();
libqpdf/QPDFPageDocumentHelper.cc
1 #include <qpdf/QPDFPageDocumentHelper.hh> 1 #include <qpdf/QPDFPageDocumentHelper.hh>
2 2
3 #include <qpdf/QPDFAcroFormDocumentHelper.hh> 3 #include <qpdf/QPDFAcroFormDocumentHelper.hh>
  4 +#include <qpdf/QPDF_private.hh>
4 #include <qpdf/QTC.hh> 5 #include <qpdf/QTC.hh>
5 #include <qpdf/QUtil.hh> 6 #include <qpdf/QUtil.hh>
6 7
@@ -55,7 +56,7 @@ QPDFPageDocumentHelper::removePage(QPDFPageObjectHelper page) @@ -55,7 +56,7 @@ QPDFPageDocumentHelper::removePage(QPDFPageObjectHelper page)
55 void 56 void
56 QPDFPageDocumentHelper::flattenAnnotations(int required_flags, int forbidden_flags) 57 QPDFPageDocumentHelper::flattenAnnotations(int required_flags, int forbidden_flags)
57 { 58 {
58 - QPDFAcroFormDocumentHelper afdh(qpdf); 59 + auto& afdh = qpdf.acroform();
59 if (afdh.getNeedAppearances()) { 60 if (afdh.getNeedAppearances()) {
60 qpdf.getRoot() 61 qpdf.getRoot()
61 .getKey("/AcroForm") 62 .getKey("/AcroForm")
libqpdf/qpdf/QPDF_private.hh
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 3
4 #include <qpdf/QPDF.hh> 4 #include <qpdf/QPDF.hh>
5 5
  6 +#include <qpdf/QPDFAcroFormDocumentHelper.hh>
6 #include <qpdf/QPDFObject_private.hh> 7 #include <qpdf/QPDFObject_private.hh>
7 #include <qpdf/QPDFTokenizer_private.hh> 8 #include <qpdf/QPDFTokenizer_private.hh>
8 9
@@ -547,6 +548,9 @@ class QPDF::Members @@ -547,6 +548,9 @@ class QPDF::Members
547 // Optimization data 548 // Optimization data
548 std::map<ObjUser, std::set<QPDFObjGen>> obj_user_to_objects; 549 std::map<ObjUser, std::set<QPDFObjGen>> obj_user_to_objects;
549 std::map<QPDFObjGen, std::set<ObjUser>> object_to_obj_users; 550 std::map<QPDFObjGen, std::set<ObjUser>> object_to_obj_users;
  551 +
  552 + // Document Helpers;
  553 + std::unique_ptr<QPDFAcroFormDocumentHelper> acroform;
550 }; 554 };
551 555
552 // JobSetter class is restricted to QPDFJob. 556 // JobSetter class is restricted to QPDFJob.
@@ -569,4 +573,13 @@ QPDF::reconstructed_xref() const @@ -569,4 +573,13 @@ QPDF::reconstructed_xref() const
569 return m->reconstructed_xref; 573 return m->reconstructed_xref;
570 } 574 }
571 575
  576 +inline QPDFAcroFormDocumentHelper&
  577 +QPDF::acroform()
  578 +{
  579 + if (!m->acroform) {
  580 + m->acroform = std::make_unique<QPDFAcroFormDocumentHelper>(*this);
  581 + }
  582 + return *m->acroform;
  583 +}
  584 +
572 #endif // QPDF_PRIVATE_HH 585 #endif // QPDF_PRIVATE_HH