2
1
mirror of https://github.com/qpdf/qpdf.git synced 2025-02-09 15:18:29 +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, UnderOverlay& uo,
std::map<std::pair<int, size_t>, std::vector<int>> const& pagenos, std::map<std::pair<int, size_t>, std::vector<int>> const& pagenos,
std::pair<int, size_t> pageno_uo_idx, 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, std::vector<QPDFPageObjectHelper>&& pages,
QPDFPageObjectHelper& dest_page); QPDFPageObjectHelper& dest_page);
void validateUnderOverlay(QPDF& pdf, UnderOverlay* uo); void validateUnderOverlay(QPDF& pdf, UnderOverlay* uo);

View File

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