diff options
author | Jay Berkenbilt <ejb@ql.org> | 2021-03-04 20:46:07 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2021-03-04 21:08:37 +0100 |
commit | 9fb174b9e9ff3d715091d435942de1e2d9db72ef (patch) | |
tree | eb7672195f80e38914766d9821c564fd2a34c3e6 /qpdf/qpdf.cc | |
parent | c46137432e19c0701624eb3bcb954b4cf39ec6f5 (diff) | |
download | qpdf-9fb174b9e9ff3d715091d435942de1e2d9db72ef.tar.zst |
Major rework of handling form fields when copying pages (fixes #509)
Diffstat (limited to 'qpdf/qpdf.cc')
-rw-r--r-- | qpdf/qpdf.cc | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 9d489d44..c75bafc1 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -5636,6 +5636,23 @@ static bool should_remove_unreferenced_resources(QPDF& pdf, Options& o) return false; } +static QPDFObjectHandle added_page(QPDF& pdf, QPDFObjectHandle page) +{ + QPDFObjectHandle result = page; + if (page.getOwningQPDF() != &pdf) + { + // Calling copyForeignObject on an object we already copied + // will give us the already existing copy. + result = pdf.copyForeignObject(page); + } + return result; +} + +static QPDFObjectHandle added_page(QPDF& pdf, QPDFPageObjectHelper page) +{ + return added_page(pdf, page.getObjectHandle()); +} + static void handle_page_specs(QPDF& pdf, Options& o, bool& warnings) { // Parse all page specifications and translate them into lists of @@ -5903,17 +5920,15 @@ static void handle_page_specs(QPDF& pdf, Options& o, bool& warnings) // This is a page from the original file. Keep track // of the fact that we are using it. selected_from_orig.insert(pageno); + } - else if (other_afdh->hasAcroForm()) + auto new_page = added_page(pdf, to_copy); + if (other_afdh->hasAcroForm()) { QTC::TC("qpdf", "qpdf copy form fields in pages"); - std::vector<QPDFObjectHandle> copied_fields; - this_afdh->copyFieldsFromForeignPage( - to_copy, *other_afdh, &copied_fields); - for (auto const& cf: copied_fields) - { - referenced_fields.insert(cf.getObjGen()); - } + this_afdh->fixCopiedAnnotations( + new_page, to_copy.getObjectHandle(), *other_afdh, + &referenced_fields); } } if (page_data.qpdf->anyWarnings()) @@ -6361,11 +6376,11 @@ static void do_split_pages(QPDF& pdf, Options& o, bool& warnings) { QPDFObjectHandle page = pages.at(pageno - 1); outpdf.addPage(page, false); + auto new_page = added_page(outpdf, page); if (out_afdh.getPointer()) { QTC::TC("qpdf", "qpdf copy form fields in split_pages"); - out_afdh->copyFieldsFromForeignPage( - QPDFPageObjectHelper(page), afdh); + out_afdh->fixCopiedAnnotations(new_page, page, afdh); } } if (pldh.hasPageLabels()) |