From 2c6fe1805a2fa5fae719224dff44f41a823466b8 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 12 Aug 2017 12:08:23 -0400 Subject: Support groups of pages in --split-pages (fixes #30) --- qpdf/qpdf.cc | 33 +++++++++++++++++++++--------- qpdf/qtest/qpdf.test | 16 +++++++++++++-- qpdf/qtest/qpdf/split-exp-group-01-05.pdf | Bin 0 -> 2050 bytes qpdf/qtest/qpdf/split-exp-group-06-10.pdf | Bin 0 -> 2051 bytes qpdf/qtest/qpdf/split-exp-group-11-11.pdf | Bin 0 -> 756 bytes 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 qpdf/qtest/qpdf/split-exp-group-01-05.pdf create mode 100644 qpdf/qtest/qpdf/split-exp-group-06-10.pdf create mode 100644 qpdf/qtest/qpdf/split-exp-group-11-11.pdf diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 54e1b652..f3051eb4 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -43,7 +43,7 @@ struct Options password(0), linearize(false), decrypt(false), - split_pages(false), + split_pages(0), copy_encryption(false), encryption_file(0), encryption_file_password(0), @@ -98,7 +98,7 @@ struct Options char const* password; bool linearize; bool decrypt; - bool split_pages; + int split_pages; bool copy_encryption; char const* encryption_file; char const* encryption_file_password; @@ -1338,7 +1338,8 @@ static void parse_options(int argc, char* argv[], Options& o) } else if (strcmp(arg, "split-pages") == 0) { - o.split_pages = true; // XXX + int n = ((parameter == 0) ? 1 : atoi(parameter)); + o.split_pages = n; } else if (strcmp(arg, "deterministic-id") == 0) { @@ -2007,16 +2008,28 @@ static void write_outfile(QPDF& pdf, Options& o) std::vector const& pages = pdf.getAllPages(); int pageno_len = QUtil::int_to_string(pages.size()).length(); - int pageno = 0; - for (std::vector::const_iterator iter = pages.begin(); - iter != pages.end(); ++iter) + unsigned int num_pages = pages.size(); + for (unsigned int i = 0; i < num_pages; i += o.split_pages) { - QPDFObjectHandle page = *iter; - std::string outfile = - before + QUtil::int_to_string(++pageno, pageno_len) + after; + unsigned int first = i + 1; + unsigned int last = i + o.split_pages; + if (last > num_pages) + { + last = num_pages; + } QPDF outpdf; outpdf.emptyPDF(); - outpdf.addPage(page, false); + for (unsigned int pageno = first; pageno <= last; ++pageno) + { + QPDFObjectHandle page = pages.at(pageno - 1); + outpdf.addPage(page, false); + } + std::string page_range = QUtil::int_to_string(first, pageno_len); + if (o.split_pages > 1) + { + page_range += "-" + QUtil::int_to_string(last, pageno_len); + } + std::string outfile = before + page_range + after; QPDFWriter w(outpdf, outfile.c_str()); set_writer_options(outpdf, o, w); w.write(); diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index c86e290f..e5a97058 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -713,7 +713,7 @@ foreach my $d ( } show_ntests(); # ---------- -$td->notify("--- Split Pages ---"); # XXXX +$td->notify("--- Split Pages ---"); # sp = split-pages my @sp_cases = ( [11, '%d at beginning', '', '%d_split-out.zdf'], @@ -722,12 +722,24 @@ my @sp_cases = ( [11, 'pdf extension', '', 'split-out.Pdf'], [4, 'fallback', '--pages 11-pages.pdf 1-3 minimal.pdf --', 'split-out'], ); -$n_tests += 1; +$n_tests += 5; for (@sp_cases) { $n_tests += 1 + $_->[0]; } +$td->runtest("split page group > 1", + {$td->COMMAND => "qpdf --static-id --split-pages=5 11-pages.pdf" . + " split-out-group.pdf"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +foreach my $f ('01-05', '06-10', '11-11') +{ + $td->runtest("checkout group $f", + {$td->FILE => "split-out-group-$f.pdf"}, + {$td->FILE => "split-exp-group-$f.pdf"}); +} + $td->runtest("no split-pages to stdout", {$td->COMMAND => "qpdf --split-pages 11-pages.pdf -"}, {$td->FILE => "split-pages-stdout.out", $td->EXIT_STATUS => 2}, diff --git a/qpdf/qtest/qpdf/split-exp-group-01-05.pdf b/qpdf/qtest/qpdf/split-exp-group-01-05.pdf new file mode 100644 index 00000000..318b3814 Binary files /dev/null and b/qpdf/qtest/qpdf/split-exp-group-01-05.pdf differ diff --git a/qpdf/qtest/qpdf/split-exp-group-06-10.pdf b/qpdf/qtest/qpdf/split-exp-group-06-10.pdf new file mode 100644 index 00000000..7f8b652f Binary files /dev/null and b/qpdf/qtest/qpdf/split-exp-group-06-10.pdf differ diff --git a/qpdf/qtest/qpdf/split-exp-group-11-11.pdf b/qpdf/qtest/qpdf/split-exp-group-11-11.pdf new file mode 100644 index 00000000..158f9c78 Binary files /dev/null and b/qpdf/qtest/qpdf/split-exp-group-11-11.pdf differ -- cgit v1.2.3-54-g00ecf