2
1
mirror of https://github.com/qpdf/qpdf.git synced 2025-02-03 20:38:25 +00:00

In QPDFJob::handleUnderOverlay flatten nested fo maps

This commit is contained in:
m-holger 2024-01-15 12:01:29 +00:00
parent 09ddce19e8
commit e1ca10ccc4
2 changed files with 12 additions and 12 deletions

View File

@ -523,7 +523,7 @@ class QPDFJob
UnderOverlay& uo,
std::map<std::pair<int, size_t>, std::vector<int>> const& pagenos,
std::pair<int, size_t> pageno_uo_idx,
std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
std::map<std::pair<int, size_t>, QPDFObjectHandle>& fo,
std::vector<QPDFPageObjectHelper>&& pages,
QPDFPageObjectHelper& dest_page);
void validateUnderOverlay(QPDF& pdf, UnderOverlay* uo);

View File

@ -1888,7 +1888,7 @@ QPDFJob::doUnderOverlayForPage(
UnderOverlay& uo,
std::map<std::pair<int, size_t>, std::vector<int>> const& pagenos,
std::pair<int, size_t> pageno_uo_idx,
std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
std::map<std::pair<int, size_t>, QPDFObjectHandle>& fo,
std::vector<QPDFPageObjectHelper>&& pages,
QPDFPageObjectHelper& dest_page)
{
@ -1910,9 +1910,12 @@ QPDFJob::doUnderOverlayForPage(
v << " " << uo.filename << " " << uo.which << " " << from_page.no << "\n";
});
auto from_page_ph = pages.at(from_page.idx);
if (fo[from_page.no].count(pageno_uo_idx.second) == 0) {
fo[from_page.no][pageno_uo_idx.second] =
pdf.copyForeignObject(from_page_ph.getFormXObjectForPage());
std::pair<int, size_t> fo_index = {from_page.no, pageno_uo_idx.second};
auto fo_it = fo.find(fo_index);
if (fo_it == fo.end()) {
fo_it =
fo.insert({fo_index, pdf.copyForeignObject(from_page_ph.getFormXObjectForPage())})
.first;
}
// If the same page is overlaid or underlaid multiple times, we'll generate multiple names
@ -1920,16 +1923,13 @@ QPDFJob::doUnderOverlayForPage(
std::string name = resources.getUniqueResourceName("/Fx", min_suffix);
QPDFMatrix cm;
std::string new_content = dest_page.placeFormXObject(
fo[from_page.no][pageno_uo_idx.second],
name,
dest_page.getTrimBox().getArrayAsRectangle(),
cm);
fo_it->second, name, dest_page.getTrimBox().getArrayAsRectangle(), cm);
dest_page.copyAnnotations(from_page_ph, cm, dest_afdh, make_afdh(from_page_ph));
if (!new_content.empty()) {
resources.mergeResources("<< /XObject << >> >>"_qpdf);
auto xobject = resources.getKey("/XObject");
if (xobject.isDictionary()) {
xobject.replaceKey(name, fo[from_page.no][pageno_uo_idx.second]);
xobject.replaceKey(name, fo_it->second);
}
++min_suffix;
content += new_content;
@ -1992,8 +1992,8 @@ QPDFJob::handleUnderOverlay(QPDF& pdf)
};
std::map<unsigned long long int, std::unique_ptr<QPDFAcroFormDocumentHelper>> afdh;
std::map<int, std::map<size_t, QPDFObjectHandle>> underlay_fo;
std::map<int, std::map<size_t, QPDFObjectHandle>> overlay_fo;
std::map<std::pair<int, size_t>, QPDFObjectHandle> underlay_fo;
std::map<std::pair<int, size_t>, QPDFObjectHandle> overlay_fo;
QPDFPageDocumentHelper main_pdh(pdf);
auto main_pages = main_pdh.getAllPages();
size_t main_npages = main_pages.size();