From 41b5c46497997d45ba2e7521b66a262ea7a1afd4 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 31 Aug 2019 15:02:32 -0400 Subject: refactor: split write_outfile and do_split_pages --- qpdf/qpdf.cc | 170 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 86 insertions(+), 84 deletions(-) diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 467db2fc..4b28f73a 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -5024,107 +5024,105 @@ static void set_writer_options(QPDF& pdf, Options& o, QPDFWriter& w) } } -static void write_outfile(QPDF& pdf, Options& o) +static void do_split_pages(QPDF& pdf, Options& o) { - if (o.split_pages) + // Generate output file pattern + std::string before; + std::string after; + size_t len = strlen(o.outfilename); + char* num_spot = strstr(const_cast(o.outfilename), "%d"); + if (num_spot != 0) { - // Generate output file pattern - std::string before; - std::string after; - size_t len = strlen(o.outfilename); - char* num_spot = strstr(const_cast(o.outfilename), "%d"); - if (num_spot != 0) - { - QTC::TC("qpdf", "qpdf split-pages %d"); - before = std::string(o.outfilename, - QIntC::to_size(num_spot - o.outfilename)); - after = num_spot + 2; - } - else if ((len >= 4) && - (QUtil::str_compare_nocase( - o.outfilename + len - 4, ".pdf") == 0)) - { - QTC::TC("qpdf", "qpdf split-pages .pdf"); - before = std::string(o.outfilename, len - 4) + "-"; - after = o.outfilename + len - 4; - } - else + QTC::TC("qpdf", "qpdf split-pages %d"); + before = std::string(o.outfilename, + QIntC::to_size(num_spot - o.outfilename)); + after = num_spot + 2; + } + else if ((len >= 4) && + (QUtil::str_compare_nocase( + o.outfilename + len - 4, ".pdf") == 0)) + { + QTC::TC("qpdf", "qpdf split-pages .pdf"); + before = std::string(o.outfilename, len - 4) + "-"; + after = o.outfilename + len - 4; + } + else + { + QTC::TC("qpdf", "qpdf split-pages other"); + before = std::string(o.outfilename) + "-"; + } + + if (! o.preserve_unreferenced_page_resources) + { + QPDFPageDocumentHelper dh(pdf); + dh.removeUnreferencedResources(); + } + QPDFPageLabelDocumentHelper pldh(pdf); + std::vector const& pages = pdf.getAllPages(); + size_t pageno_len = QUtil::uint_to_string(pages.size()).length(); + size_t num_pages = pages.size(); + for (size_t i = 0; i < num_pages; i += QIntC::to_size(o.split_pages)) + { + size_t first = i + 1; + size_t last = i + QIntC::to_size(o.split_pages); + if (last > num_pages) { - QTC::TC("qpdf", "qpdf split-pages other"); - before = std::string(o.outfilename) + "-"; + last = num_pages; } - - if (! o.preserve_unreferenced_page_resources) + QPDF outpdf; + outpdf.emptyPDF(); + for (size_t pageno = first; pageno <= last; ++pageno) { - QPDFPageDocumentHelper dh(pdf); - dh.removeUnreferencedResources(); + QPDFObjectHandle page = pages.at(pageno - 1); + outpdf.addPage(page, false); } - QPDFPageLabelDocumentHelper pldh(pdf); - std::vector const& pages = pdf.getAllPages(); - size_t pageno_len = QUtil::uint_to_string(pages.size()).length(); - size_t num_pages = pages.size(); - for (size_t i = 0; i < num_pages; i += QIntC::to_size(o.split_pages)) + if (pldh.hasPageLabels()) { - size_t first = i + 1; - size_t last = i + QIntC::to_size(o.split_pages); - if (last > num_pages) - { - last = num_pages; - } - QPDF outpdf; - outpdf.emptyPDF(); - for (size_t pageno = first; pageno <= last; ++pageno) - { - QPDFObjectHandle page = pages.at(pageno - 1); - outpdf.addPage(page, false); - } - if (pldh.hasPageLabels()) - { - std::vector labels; - pldh.getLabelsForPageRange( - QIntC::to_longlong(first - 1), - QIntC::to_longlong(last - 1), - 0, labels); - QPDFObjectHandle page_labels = - QPDFObjectHandle::newDictionary(); - page_labels.replaceKey( - "/Nums", QPDFObjectHandle::newArray(labels)); - outpdf.getRoot().replaceKey("/PageLabels", page_labels); - } - std::string page_range = - QUtil::uint_to_string(first, QIntC::to_int(pageno_len)); - if (o.split_pages > 1) - { - page_range += "-" + - QUtil::uint_to_string(last, QIntC::to_int(pageno_len)); - } - std::string outfile = before + page_range + after; - QPDFWriter w(outpdf, outfile.c_str()); - set_writer_options(outpdf, o, w); - w.write(); - if (o.verbose) - { - std::cout << whoami << ": wrote file " << outfile << std::endl; - } + std::vector labels; + pldh.getLabelsForPageRange( + QIntC::to_longlong(first - 1), + QIntC::to_longlong(last - 1), + 0, labels); + QPDFObjectHandle page_labels = + QPDFObjectHandle::newDictionary(); + page_labels.replaceKey( + "/Nums", QPDFObjectHandle::newArray(labels)); + outpdf.getRoot().replaceKey("/PageLabels", page_labels); } - } - else - { - if (strcmp(o.outfilename, "-") == 0) + std::string page_range = + QUtil::uint_to_string(first, QIntC::to_int(pageno_len)); + if (o.split_pages > 1) { - o.outfilename = 0; + page_range += "-" + + QUtil::uint_to_string(last, QIntC::to_int(pageno_len)); } - QPDFWriter w(pdf, o.outfilename); - set_writer_options(pdf, o, w); + std::string outfile = before + page_range + after; + QPDFWriter w(outpdf, outfile.c_str()); + set_writer_options(outpdf, o, w); w.write(); if (o.verbose) { - std::cout << whoami << ": wrote file " - << o.outfilename << std::endl; + std::cout << whoami << ": wrote file " << outfile << std::endl; } } } +static void write_outfile(QPDF& pdf, Options& o) +{ + if (strcmp(o.outfilename, "-") == 0) + { + o.outfilename = 0; + } + QPDFWriter w(pdf, o.outfilename); + set_writer_options(pdf, o, w); + w.write(); + if (o.verbose) + { + std::cout << whoami << ": wrote file " + << o.outfilename << std::endl; + } +} + int realmain(int argc, char* argv[]) { whoami = QUtil::getWhoami(argv[0]); @@ -5162,6 +5160,10 @@ int realmain(int argc, char* argv[]) { do_inspection(pdf, o); } + else if (o.split_pages) + { + do_split_pages(pdf, o); + } else { write_outfile(pdf, o); -- cgit v1.2.3-70-g09d2