diff options
Diffstat (limited to 'qpdf/qpdf.cc')
-rw-r--r-- | qpdf/qpdf.cc | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index db3193d5..81ccdd0f 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -3731,6 +3731,7 @@ static void handle_page_specs(QPDF& pdf, Options& o) std::map<std::string, ClosedFileInputSource*> page_spec_cfis; page_spec_qpdfs[o.infilename] = &pdf; std::vector<QPDFPageData> parsed_specs; + std::map<unsigned long long, std::set<QPDFObjGen> > copied_pages; for (std::vector<PageSpec>::iterator iter = o.page_specs.begin(); iter != o.page_specs.end(); ++iter) { @@ -3905,7 +3906,20 @@ static void handle_page_specs(QPDF& pdf, Options& o) int pageno = *pageno_iter - 1; pldh.getLabelsForPageRange(pageno, pageno, out_pageno, new_labels); - dh.addPage(page_data.orig_pages.at(pageno), false); + QPDFPageObjectHelper to_copy = page_data.orig_pages.at(pageno); + QPDFObjGen to_copy_og = to_copy.getObjectHandle().getObjGen(); + unsigned long long from_uuid = page_data.qpdf->getUniqueId(); + if (copied_pages[from_uuid].count(to_copy_og)) + { + QTC::TC("qpdf", "qpdf copy same page more than once", + (page_data.qpdf == &pdf) ? 0 : 1); + to_copy = to_copy.shallowCopyPage(); + } + else + { + copied_pages[from_uuid].insert(to_copy_og); + } + dh.addPage(to_copy, false); if (page_data.qpdf == &pdf) { // This is a page from the original file. Keep track |