From 2e6e1204a51b4aba4657712a34e9447d928b5fc6 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 18 Jun 2018 15:06:51 -0400 Subject: [PATCH] Convert examples to use new page helper classes --- ChangeLog | 4 +++- examples/pdf-bookmarks.cc | 8 +++++--- examples/pdf-count-strings.cc | 13 ++++++++----- examples/pdf-create.cc | 18 ++++++++++++------ examples/pdf-double-page-size.cc | 13 +++++++++---- examples/pdf-filter-tokens.cc | 9 ++++++--- examples/pdf-invert-images.cc | 9 ++++++--- examples/pdf-parse-content.cc | 7 +++++-- examples/pdf-split-pages.cc | 10 ++++++---- 9 files changed, 60 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5157a1b3..6156a59a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,7 +7,9 @@ of structural features of PDF while still staying true to qpdf's philosophy of not isolating the user from the underlying structure. Please see the chapter in the documentation entitled - "Design and Library Notes" for additional discussion. + "Design and Library Notes" for additional discussion. The examples + have also been updated to use QPDFPageDocumentHelper and + QPDFPageObjctHelper when performing page-level operations. 2018-06-19 Jay Berkenbilt diff --git a/examples/pdf-bookmarks.cc b/examples/pdf-bookmarks.cc index 23b7f0cf..ed5b8029 100644 --- a/examples/pdf-bookmarks.cc +++ b/examples/pdf-bookmarks.cc @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -44,12 +45,13 @@ void print_lines(std::vector& numbers) void generate_page_map(QPDF& qpdf) { - std::vector pages = qpdf.getAllPages(); + QPDFPageDocumentHelper dh(qpdf); + std::vector pages = dh.getAllPages(); int n = 0; - for (std::vector::iterator iter = pages.begin(); + for (std::vector::iterator iter = pages.begin(); iter != pages.end(); ++iter) { - QPDFObjectHandle& oh = *iter; + QPDFObjectHandle oh = (*iter).getObjectHandle(); page_map[oh.getObjGen()] = ++n; } } diff --git a/examples/pdf-count-strings.cc b/examples/pdf-count-strings.cc index 072f8b5c..b5091a86 100644 --- a/examples/pdf-count-strings.cc +++ b/examples/pdf-count-strings.cc @@ -10,6 +10,8 @@ #include #include +#include +#include #include #include #include @@ -90,12 +92,13 @@ int main(int argc, char* argv[]) { QPDF pdf; pdf.processFile(infilename); - std::vector pages = pdf.getAllPages(); + std::vector pages = + QPDFPageDocumentHelper(pdf).getAllPages(); int pageno = 0; - for (std::vector::iterator iter = pages.begin(); + for (std::vector::iterator iter = pages.begin(); iter != pages.end(); ++iter) { - QPDFObjectHandle page = *iter; + QPDFPageObjectHelper& ph(*iter); ++pageno; // Pass the contents of a page through our string counter. // If it's an even page, capture the output. This @@ -105,14 +108,14 @@ int main(int argc, char* argv[]) if (pageno % 2) { // Ignore output for odd pages. - page.filterPageContents(&counter); + ph.filterPageContents(&counter); } else { // Write output to stdout for even pages. Pl_StdioFile out("stdout", stdout); std::cout << "% Contents of page " << pageno << std::endl; - page.filterPageContents(&counter, &out); + ph.filterPageContents(&counter, &out); std::cout << "\n% end " << pageno << std::endl; } std::cout << "Page " << pageno diff --git a/examples/pdf-create.cc b/examples/pdf-create.cc index 0cbf6f14..1c787e2e 100644 --- a/examples/pdf-create.cc +++ b/examples/pdf-create.cc @@ -6,6 +6,8 @@ // #include +#include +#include #include #include #include @@ -158,10 +160,12 @@ QPDFObjectHandle newInteger(int val) return QPDFObjectHandle::newInteger(val); } -void add_page(QPDF& pdf, QPDFObjectHandle font, +void add_page(QPDFPageDocumentHelper& dh, QPDFObjectHandle font, std::string const& color_space, std::string const& filter) { + QPDF& pdf(dh.getQPDF()); + // Create a stream to encode our image. QPDFWriter will fill in // the length and will respect our filters based on stream data // mode. Since we are not specifying, QPDFWriter will compress @@ -222,7 +226,7 @@ void add_page(QPDF& pdf, QPDFObjectHandle font, page.replaceKey("/Resources", resources); // Add the page to the PDF file - pdf.addPage(page, false); + dh.addPage(page, false); } static void check(char const* filename, @@ -249,18 +253,19 @@ static void check(char const* filename, QPDF pdf; pdf.processFile(filename); - std::vector const& pages = pdf.getAllPages(); + QPDFPageDocumentHelper dh(pdf); + std::vector pages = dh.getAllPages(); if (n_color_spaces * n_filters != pages.size()) { throw std::logic_error("incorrect number of pages"); } size_t pageno = 1; bool errors = false; - for (std::vector::const_iterator page_iter = + for (std::vector::iterator page_iter = pages.begin(); page_iter != pages.end(); ++page_iter) { - QPDFObjectHandle page = *page_iter; + QPDFPageObjectHelper& page(*page_iter); std::map images = page.getPageImages(); if (images.size() != 1) { @@ -391,13 +396,14 @@ static void create_pdf(char const* filename) filters.push_back("null"); filters.push_back("/DCTDecode"); filters.push_back("/RunLengthDecode"); + QPDFPageDocumentHelper dh(pdf); for (std::vector::iterator c_iter = color_spaces.begin(); c_iter != color_spaces.end(); ++c_iter) { for (std::vector::iterator f_iter = filters.begin(); f_iter != filters.end(); ++f_iter) { - add_page(pdf, font, *c_iter, *f_iter); + add_page(dh, font, *c_iter, *f_iter); } } diff --git a/examples/pdf-double-page-size.cc b/examples/pdf-double-page-size.cc index 30365b8d..06c98921 100644 --- a/examples/pdf-double-page-size.cc +++ b/examples/pdf-double-page-size.cc @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include @@ -77,14 +79,17 @@ int main(int argc, char* argv[]) QPDF qpdf; qpdf.processFile(infilename, password); - std::vector pages = qpdf.getAllPages(); - for (std::vector::iterator iter = pages.begin(); + std::vector pages = + QPDFPageDocumentHelper(qpdf).getAllPages(); + for (std::vector::iterator iter = + pages.begin(); iter != pages.end(); ++iter) { - QPDFObjectHandle& page = *iter; + QPDFPageObjectHelper& ph(*iter); + QPDFObjectHandle page = ph.getObjectHandle(); // Prepend the buffer to the page's contents - page.addPageContents( + ph.addPageContents( QPDFObjectHandle::newStream(&qpdf, content), true); // Double the size of each of the content boxes diff --git a/examples/pdf-filter-tokens.cc b/examples/pdf-filter-tokens.cc index ec6fac12..d3ebf54c 100644 --- a/examples/pdf-filter-tokens.cc +++ b/examples/pdf-filter-tokens.cc @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include #include @@ -207,8 +209,9 @@ int main(int argc, char* argv[]) { QPDF pdf; pdf.processFile(infilename); - std::vector pages = pdf.getAllPages(); - for (std::vector::iterator iter = pages.begin(); + std::vector pages = + QPDFPageDocumentHelper(pdf).getAllPages(); + for (std::vector::iterator iter = pages.begin(); iter != pages.end(); ++iter) { // Attach two token filters to each page of this file. @@ -216,7 +219,7 @@ int main(int argc, char* argv[]) // are retrieved in any other way, the filters will be // applied. See comments on the filters for additional // details. - QPDFObjectHandle page = *iter; + QPDFPageObjectHelper& page(*iter); page.addContentTokenFilter(new StringReverser); page.addContentTokenFilter(new ColorToGray); } diff --git a/examples/pdf-invert-images.cc b/examples/pdf-invert-images.cc index 537fd35e..1469d9cc 100644 --- a/examples/pdf-invert-images.cc +++ b/examples/pdf-invert-images.cc @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include @@ -97,11 +99,12 @@ int main(int argc, char* argv[]) PointerHolder p = inv; // For each page... - std::vector pages = qpdf.getAllPages(); - for (std::vector::iterator iter = pages.begin(); + std::vector pages = + QPDFPageDocumentHelper(qpdf).getAllPages(); + for (std::vector::iterator iter = pages.begin(); iter != pages.end(); ++iter) { - QPDFObjectHandle& page = *iter; + QPDFPageObjectHelper& page(*iter); // Get all images on the page. std::map images = page.getPageImages(); diff --git a/examples/pdf-parse-content.cc b/examples/pdf-parse-content.cc index 620c1bb6..8659fbe3 100644 --- a/examples/pdf-parse-content.cc +++ b/examples/pdf-parse-content.cc @@ -3,6 +3,8 @@ #include #include +#include +#include #include static char const* whoami = 0; @@ -68,13 +70,14 @@ int main(int argc, char* argv[]) { QPDF pdf; pdf.processFile(filename); - std::vector pages = pdf.getAllPages(); + std::vector pages = + QPDFPageDocumentHelper(pdf).getAllPages(); if ((pageno < 1) || (static_cast(pageno) > pages.size())) { usage(); } - QPDFObjectHandle page = pages.at(pageno-1); + QPDFPageObjectHelper& page = pages.at(pageno-1); ParserCallbacks cb; page.parsePageContents(&cb); } diff --git a/examples/pdf-split-pages.cc b/examples/pdf-split-pages.cc index f062691a..b65f96ee 100644 --- a/examples/pdf-split-pages.cc +++ b/examples/pdf-split-pages.cc @@ -5,6 +5,7 @@ // #include +#include #include #include #include @@ -20,18 +21,19 @@ static void process(char const* whoami, { QPDF inpdf; inpdf.processFile(infile); - std::vector const& pages = inpdf.getAllPages(); + std::vector pages = + QPDFPageDocumentHelper(inpdf).getAllPages(); int pageno_len = QUtil::int_to_string(pages.size()).length(); int pageno = 0; - for (std::vector::const_iterator iter = pages.begin(); + for (std::vector::iterator iter = pages.begin(); iter != pages.end(); ++iter) { - QPDFObjectHandle page = *iter; + QPDFPageObjectHelper& page(*iter); std::string outfile = outprefix + QUtil::int_to_string(++pageno, pageno_len) + ".pdf"; QPDF outpdf; outpdf.emptyPDF(); - outpdf.addPage(page, false); + QPDFPageDocumentHelper(outpdf).addPage(page, false); QPDFWriter outpdfw(outpdf, outfile.c_str()); if (static_id) {