aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2017-08-12 18:08:23 +0200
committerJay Berkenbilt <ejb@ql.org>2017-08-12 18:08:23 +0200
commit2c6fe1805a2fa5fae719224dff44f41a823466b8 (patch)
tree1e6a0713e042fbd73140ecfb2bbc46217c9ec76f
parentdf33c368b472b6e2c2f011fc111c637b3dfca720 (diff)
downloadqpdf-2c6fe1805a2fa5fae719224dff44f41a823466b8.tar.zst
Support groups of pages in --split-pages (fixes #30)
-rw-r--r--qpdf/qpdf.cc33
-rw-r--r--qpdf/qtest/qpdf.test16
-rw-r--r--qpdf/qtest/qpdf/split-exp-group-01-05.pdfbin0 -> 2050 bytes
-rw-r--r--qpdf/qtest/qpdf/split-exp-group-06-10.pdfbin0 -> 2051 bytes
-rw-r--r--qpdf/qtest/qpdf/split-exp-group-11-11.pdfbin0 -> 756 bytes
5 files changed, 37 insertions, 12 deletions
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<QPDFObjectHandle> const& pages = pdf.getAllPages();
int pageno_len = QUtil::int_to_string(pages.size()).length();
- int pageno = 0;
- for (std::vector<QPDFObjectHandle>::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
--- /dev/null
+++ b/qpdf/qtest/qpdf/split-exp-group-01-05.pdf
Binary files 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
--- /dev/null
+++ b/qpdf/qtest/qpdf/split-exp-group-06-10.pdf
Binary files 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
--- /dev/null
+++ b/qpdf/qtest/qpdf/split-exp-group-11-11.pdf
Binary files differ