diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 60f846b..deabeff 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -2127,9 +2127,8 @@ void QPDFWriter::Members::initializeSpecialStreams() { // Mark all page content streams in case we are filtering or normalizing. - std::vector pages = qpdf.getAllPages(); int num = 0; - for (auto& page: pages) { + for (auto& page: pages.all()) { page_object_to_seq[page.getObjGen()] = ++num; QPDFObjectHandle contents = page.getKey("/Contents"); std::vector contents_objects; @@ -2381,7 +2380,7 @@ QPDFWriter::Members::doWriteSetup() if (!obj.streams_empty) { if (linearized) { // Page dictionaries are not allowed to be compressed objects. - for (auto& page: qpdf.getAllPages()) { + for (auto& page: qpdf.doc().pages().all()) { if (obj[page].object_stream > 0) { obj[page].object_stream = 0; } @@ -2911,14 +2910,11 @@ QPDFWriter::Members::writeLinearized() openObject(lindict_id); write("<<"); if (pass == 2) { - std::vector const& pages = qpdf.getAllPages(); - int first_page_object = obj[pages.at(0)].renumber; - write(" /Linearized 1 /L ").write(file_size + hint_length); // Implementation note 121 states that a space is mandatory after this open bracket. write(" /H [ ").write(new_obj[hint_id].xref.getOffset()).write(" "); write(hint_length); - write(" ] /O ").write(first_page_object); + write(" ] /O ").write(obj[pages.all().at(0)].renumber); write(" /E ").write(part6_end_offset + hint_length); write(" /N ").write(pages.size()); write(" /T ").write(space_before_zero + hint_length); @@ -3137,17 +3133,15 @@ QPDFWriter::Members::enqueueObjectsPCLm() std::string image_transform_content = "q /image Do Q\n"; // enqueue all pages first - std::vector all = qpdf.getAllPages(); - for (auto& page: all) { + for (auto& page: pages.all()) { // enqueue page enqueueObject(page); // enqueue page contents stream - enqueueObject(page.getKey("/Contents")); + enqueueObject(page["/Contents"]); // enqueue all the strips for each page - QPDFObjectHandle strips = page.getKey("/Resources").getKey("/XObject"); - for (auto& image: strips.as_dictionary()) { + for (auto& image: Dictionary(page["/Resources"]["/XObject"])) { if (!image.second.null()) { enqueueObject(image.second); enqueueObject(QPDFObjectHandle::newStream(&qpdf, image_transform_content)); diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index d2f5fc1..42801dd 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -316,11 +316,7 @@ class QPDF::Doc Common& operator=(Common&&) = delete; ~Common() = default; - Common(QPDF& qpdf, QPDF::Members* m) : - qpdf(qpdf), - m(m) - { - } + inline Common(QPDF& qpdf, QPDF::Members* m); void stopOnError(std::string const& message); void warn(QPDFExc const& e); @@ -355,6 +351,8 @@ class QPDF::Doc protected: QPDF& qpdf; QPDF::Members* m; + + QPDF::Doc::Pages& pages; }; Doc() = delete; @@ -1001,6 +999,13 @@ class QPDF::Doc::Resolver } }; +inline QPDF::Doc::Common::Common(QPDF& qpdf, QPDF::Members* m) : + qpdf(qpdf), + m(m), + pages(m->pages) +{ +} + inline QPDF::Doc::Linearization& QPDF::Doc::linearization() {