diff options
Diffstat (limited to 'qpdf/qpdf.cc')
-rw-r--r-- | qpdf/qpdf.cc | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 0935e4f8..2080a44a 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -5143,6 +5143,19 @@ static void get_uo_pagenos(UnderOverlay& uo, } } +static QPDFAcroFormDocumentHelper* get_afdh_for_qpdf( + std::map<unsigned long long, + PointerHolder<QPDFAcroFormDocumentHelper>>& afdh_map, + QPDF* q) +{ + auto uid = q->getUniqueId(); + if (! afdh_map.count(uid)) + { + afdh_map[uid] = new QPDFAcroFormDocumentHelper(*q); + } + return afdh_map[uid].getPointer(); +} + static void do_under_overlay_for_page( QPDF& pdf, Options& o, @@ -5164,12 +5177,7 @@ static void do_under_overlay_for_page( PointerHolder<QPDFAcroFormDocumentHelper>> afdh; auto make_afdh = [&](QPDFPageObjectHelper& ph) { QPDF* q = ph.getObjectHandle().getOwningQPDF(); - auto uid = q->getUniqueId(); - if (! afdh.count(uid)) - { - afdh[uid] = new QPDFAcroFormDocumentHelper(*q); - } - return afdh[uid].getPointer(); + return get_afdh_for_qpdf(afdh, q); }; auto dest_afdh = make_afdh(dest_page); @@ -5835,6 +5843,9 @@ static void handle_page_specs(QPDF& pdf, Options& o, bool& warnings) std::vector<QPDFObjectHandle> new_labels; bool any_page_labels = false; int out_pageno = 0; + std::map<unsigned long long, + PointerHolder<QPDFAcroFormDocumentHelper>> afdh_map; + auto this_afdh = get_afdh_for_qpdf(afdh_map, &pdf); for (std::vector<QPDFPageData>::iterator iter = parsed_specs.begin(); iter != parsed_specs.end(); ++iter) @@ -5847,6 +5858,7 @@ static void handle_page_specs(QPDF& pdf, Options& o, bool& warnings) cis->stayOpen(true); } QPDFPageLabelDocumentHelper pldh(*page_data.qpdf); + auto other_afdh = get_afdh_for_qpdf(afdh_map, page_data.qpdf); if (pldh.hasPageLabels()) { any_page_labels = true; @@ -5891,6 +5903,11 @@ static void handle_page_specs(QPDF& pdf, Options& o, bool& warnings) // of the fact that we are using it. selected_from_orig.insert(pageno); } + else if (other_afdh->hasAcroForm()) + { + QTC::TC("qpdf", "qpdf copy form fields in pages"); + this_afdh->copyFieldsFromForeignPage(to_copy, *other_afdh); + } } if (page_data.qpdf->anyWarnings()) { @@ -6269,6 +6286,7 @@ static void do_split_pages(QPDF& pdf, Options& o, bool& warnings) dh.removeUnreferencedResources(); } QPDFPageLabelDocumentHelper pldh(pdf); + QPDFAcroFormDocumentHelper afdh(pdf); std::vector<QPDFObjectHandle> const& pages = pdf.getAllPages(); size_t pageno_len = QUtil::uint_to_string(pages.size()).length(); size_t num_pages = pages.size(); @@ -6282,6 +6300,11 @@ static void do_split_pages(QPDF& pdf, Options& o, bool& warnings) } QPDF outpdf; outpdf.emptyPDF(); + PointerHolder<QPDFAcroFormDocumentHelper> out_afdh; + if (afdh.hasAcroForm()) + { + out_afdh = new QPDFAcroFormDocumentHelper(outpdf); + } if (o.suppress_warnings) { outpdf.setSuppressWarnings(true); @@ -6290,6 +6313,12 @@ static void do_split_pages(QPDF& pdf, Options& o, bool& warnings) { QPDFObjectHandle page = pages.at(pageno - 1); outpdf.addPage(page, false); + if (out_afdh.getPointer()) + { + QTC::TC("qpdf", "qpdf copy form fields in split_pages"); + out_afdh->copyFieldsFromForeignPage( + QPDFPageObjectHelper(page), afdh); + } } if (pldh.hasPageLabels()) { |