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:
parent
09ddce19e8
commit
e1ca10ccc4
@ -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);
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user