diff --git a/ChangeLog b/ChangeLog index 3d1b6fd2..eacde282 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-08-12 Jay Berkenbilt + + * Change --single-pages to --split-pages and make it take an + optional argument specifying the number of pages per file. + 2017-08-11 Jay Berkenbilt * Fix --newline-before-endstream to always add a newline before diff --git a/manual/qpdf-manual.xml b/manual/qpdf-manual.xml index 06504d33..3f3415c8 100644 --- a/manual/qpdf-manual.xml +++ b/manual/qpdf-manual.xml @@ -350,57 +350,61 @@ make - + - Write each page to a separate output file. Output file names - are generated as follows: + Write each group of pages to a separate + output file. If is not specified, create + single pages. Output file names are generated as follows: If the string %d appears in the output - file name, it is replaced with a zero-padded page number - starting from 1. + file name, it is replaced with a range of zero-padded page + numbers starting from 1. Otherwise, if the output file name ends in .pdf (case insensitive), a zero-padded - page number, preceded by a dash, is inserted before the - file extension. + page range, preceded by a dash, is inserted before the file + extension. Otherwise, the file name is appended with a zero-padded - page number preceded by a dash. + page range preceded by a dash. + Page ranges are a single number in the case of single-page + groups or two numbers separated by a dash otherwise. For example, if infile.pdf has 12 pages - qpdf infile.pdf %d-out would generate - files 01-out through + qpdf --split-pages infile.pdf %d-out + would generate files 01-out through 12-out - qpdf infile.pdf outfile.pdf - --single-pages would generate files - outfile-01.pdf through - outfile-12.pdf + qpdf --split-pages=2 infile.pdf + outfile.pdf would generate files + outfile-01-02.pdf through + outfile-11-12.pdf - qpdf infile.pdf something.else would generate - files something.else-01 through + qpdf --split-pages infile.pdf + something.else would generate files + something.else-01 through something.else-12 @@ -413,7 +417,7 @@ make the output into it. If you require the global data, you will have to run qpdf with the option once for each file. Using - is much faster if you don't + is much faster if you don't require the global data. diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 604b8363..54e1b652 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -43,7 +43,7 @@ struct Options password(0), linearize(false), decrypt(false), - single_pages(false), + split_pages(false), copy_encryption(false), encryption_file(0), encryption_file_password(0), @@ -98,7 +98,7 @@ struct Options char const* password; bool linearize; bool decrypt; - bool single_pages; + bool split_pages; bool copy_encryption; char const* encryption_file; char const* encryption_file_password; @@ -206,7 +206,7 @@ Basic Options\n\ --encrypt options -- generate an encrypted file\n\ --decrypt remove any encryption on the file\n\ --pages options -- select specific pages from one or more files\n\ ---single-pages write each output page to a separate file\n\ +--split-pages=[n] write each output page to a separate file\n\ \n\ If none of --copy-encryption, --encrypt or --decrypt are given, qpdf will\n\ preserve any encryption data associated with a file.\n\ @@ -216,15 +216,17 @@ parameters will be copied, including both user and owner passwords, even\n\ if the user password is used to open the other file. This works even if\n\ the owner password is not known.\n\ \n\ -If --single-pages is specified, each page is written to a separate output\n\ +If --split-pages is specified, each page is written to a separate output\n\ file. File names are generated as follows:\n\ * If the string %d appears in the output file name, it is replaced with a\n\ - zero-padded page number starting from 1\n\ + zero-padded page range starting from 1\n\ * Otherwise, if the output file name ends in .pdf (case insensitive), a\n\ - zero-padded page number, preceded by a dash, is inserted before the file\n\ + zero-padded page range, preceded by a dash, is inserted before the file\n\ extension\n\ -* Otherwise, the file name is appended with a zero-padded page number\n\ +* Otherwise, the file name is appended with a zero-padded page range\n\ preceded by a dash.\n\ +Page ranges are single page numbers for single-page groups or first-last\n\ +for multipage groups.\n\ \n\ \n\ Encryption Options\n\ @@ -1334,9 +1336,9 @@ static void parse_options(int argc, char* argv[], Options& o) } o.force_version = parameter; } - else if (strcmp(arg, "single-pages") == 0) + else if (strcmp(arg, "split-pages") == 0) { - o.single_pages = true; + o.split_pages = true; // XXX } else if (strcmp(arg, "deterministic-id") == 0) { @@ -1451,9 +1453,9 @@ static void parse_options(int argc, char* argv[], Options& o) } if (o.require_outfile && (strcmp(o.outfilename, "-") == 0) && - o.single_pages) + o.split_pages) { - usage("--single-pages may not be used when writing to standard output"); + usage("--split-pages may not be used when writing to standard output"); } if (QUtil::same_file(o.infilename, o.outfilename)) @@ -1977,7 +1979,7 @@ static void set_writer_options(QPDF& pdf, Options& o, QPDFWriter& w) static void write_outfile(QPDF& pdf, Options& o) { - if (o.single_pages) + if (o.split_pages) { // Generate output file pattern std::string before; @@ -1986,20 +1988,20 @@ static void write_outfile(QPDF& pdf, Options& o) char* num_spot = strstr(const_cast(o.outfilename), "%d"); if (num_spot != 0) { - QTC::TC("qpdf", "qpdf single-pages %d"); + QTC::TC("qpdf", "qpdf split-pages %d"); before = std::string(o.outfilename, (num_spot - o.outfilename)); after = num_spot + 2; } else if ((len >= 4) && (QUtil::strcasecmp(o.outfilename + len - 4, ".pdf") == 0)) { - QTC::TC("qpdf", "qpdf single-pages .pdf"); + QTC::TC("qpdf", "qpdf split-pages .pdf"); before = std::string(o.outfilename, len - 4) + "-"; after = o.outfilename + len - 4; } else { - QTC::TC("qpdf", "qpdf single-pages other"); + QTC::TC("qpdf", "qpdf split-pages other"); before = std::string(o.outfilename) + "-"; } diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index f5b628b9..14ff9f6c 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -285,9 +285,9 @@ QPDF stream with non-space 0 qpdf same file error 0 qpdf read args from stdin 0 qpdf read args from file 0 -qpdf single-pages %d 0 -qpdf single-pages .pdf 0 -qpdf single-pages other 0 +qpdf split-pages %d 0 +qpdf split-pages .pdf 0 +qpdf split-pages other 0 QPDFTokenizer allowing bad token 0 QPDF ignore first space in xref entry 0 QPDF ignore first extra space in xref entry 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 3253ce65..c86e290f 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -713,14 +713,14 @@ foreach my $d ( } show_ntests(); # ---------- -$td->notify("--- Single Page ---"); -# sp = single-pages +$td->notify("--- Split Pages ---"); # XXXX +# sp = split-pages my @sp_cases = ( - [11, '%d at beginning', '', '%d_single-out.zdf'], - [11, '%d at end', '--qdf', 'single-out.zdf_%d'], - [11, '%d in middle', '--encrypt u o 128 --', 'a-%d-single-out.zdf'], - [11, 'pdf extension', '', 'single-out.Pdf'], - [4, 'fallback', '--pages 11-pages.pdf 1-3 minimal.pdf --', 'single-out'], + [11, '%d at beginning', '', '%d_split-out.zdf'], + [11, '%d at end', '--qdf', 'split-out.zdf_%d'], + [11, '%d in middle', '--encrypt u o 128 --', 'a-%d-split-out.zdf'], + [11, 'pdf extension', '', 'split-out.Pdf'], + [4, 'fallback', '--pages 11-pages.pdf 1-3 minimal.pdf --', 'split-out'], ); $n_tests += 1; for (@sp_cases) @@ -728,17 +728,17 @@ for (@sp_cases) $n_tests += 1 + $_->[0]; } -$td->runtest("no single-pages to stdout", - {$td->COMMAND => "qpdf --single-pages 11-pages.pdf -"}, - {$td->FILE => "single-pages-stdout.out", $td->EXIT_STATUS => 2}, +$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}, $td->NORMALIZE_NEWLINES); foreach my $d (@sp_cases) { my ($n, $description, $xargs, $out) = @$d; - $td->runtest("single pages " . $description, + $td->runtest("split pages " . $description, {$td->COMMAND => - "qpdf --static-id --single-pages 11-pages.pdf" . + "qpdf --static-id --split-pages 11-pages.pdf" . " $xargs $out"}, {$td->STRING => "", $td->EXIT_STATUS => 0}); my $pattern = $out; @@ -759,7 +759,7 @@ foreach my $d (@sp_cases) { my $actual = sprintf($pattern, $i); my $expected = $actual; - $expected =~ s/single-out/single-exp/; + $expected =~ s/split-out/split-exp/; $td->runtest("checkout output page $i", {$td->FILE => $actual}, {$td->FILE => $expected}); @@ -2497,5 +2497,5 @@ sub get_md5_checksum sub cleanup { system("rm -rf *.ps *.pnm ?.pdf ?.qdf *.enc* tif1 tif2 tiff-cache"); - system("rm -rf *single-out*"); + system("rm -rf *split-out*"); } diff --git a/qpdf/qtest/qpdf/01_single-exp.zdf b/qpdf/qtest/qpdf/01_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/01_single-exp.zdf rename to qpdf/qtest/qpdf/01_split-exp.zdf diff --git a/qpdf/qtest/qpdf/02_single-exp.zdf b/qpdf/qtest/qpdf/02_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/02_single-exp.zdf rename to qpdf/qtest/qpdf/02_split-exp.zdf diff --git a/qpdf/qtest/qpdf/03_single-exp.zdf b/qpdf/qtest/qpdf/03_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/03_single-exp.zdf rename to qpdf/qtest/qpdf/03_split-exp.zdf diff --git a/qpdf/qtest/qpdf/04_single-exp.zdf b/qpdf/qtest/qpdf/04_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/04_single-exp.zdf rename to qpdf/qtest/qpdf/04_split-exp.zdf diff --git a/qpdf/qtest/qpdf/05_single-exp.zdf b/qpdf/qtest/qpdf/05_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/05_single-exp.zdf rename to qpdf/qtest/qpdf/05_split-exp.zdf diff --git a/qpdf/qtest/qpdf/06_single-exp.zdf b/qpdf/qtest/qpdf/06_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/06_single-exp.zdf rename to qpdf/qtest/qpdf/06_split-exp.zdf diff --git a/qpdf/qtest/qpdf/07_single-exp.zdf b/qpdf/qtest/qpdf/07_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/07_single-exp.zdf rename to qpdf/qtest/qpdf/07_split-exp.zdf diff --git a/qpdf/qtest/qpdf/08_single-exp.zdf b/qpdf/qtest/qpdf/08_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/08_single-exp.zdf rename to qpdf/qtest/qpdf/08_split-exp.zdf diff --git a/qpdf/qtest/qpdf/09_single-exp.zdf b/qpdf/qtest/qpdf/09_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/09_single-exp.zdf rename to qpdf/qtest/qpdf/09_split-exp.zdf diff --git a/qpdf/qtest/qpdf/10_single-exp.zdf b/qpdf/qtest/qpdf/10_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/10_single-exp.zdf rename to qpdf/qtest/qpdf/10_split-exp.zdf diff --git a/qpdf/qtest/qpdf/11_single-exp.zdf b/qpdf/qtest/qpdf/11_split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/11_single-exp.zdf rename to qpdf/qtest/qpdf/11_split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-01-single-exp.zdf b/qpdf/qtest/qpdf/a-01-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-01-single-exp.zdf rename to qpdf/qtest/qpdf/a-01-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-02-single-exp.zdf b/qpdf/qtest/qpdf/a-02-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-02-single-exp.zdf rename to qpdf/qtest/qpdf/a-02-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-03-single-exp.zdf b/qpdf/qtest/qpdf/a-03-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-03-single-exp.zdf rename to qpdf/qtest/qpdf/a-03-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-04-single-exp.zdf b/qpdf/qtest/qpdf/a-04-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-04-single-exp.zdf rename to qpdf/qtest/qpdf/a-04-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-05-single-exp.zdf b/qpdf/qtest/qpdf/a-05-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-05-single-exp.zdf rename to qpdf/qtest/qpdf/a-05-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-06-single-exp.zdf b/qpdf/qtest/qpdf/a-06-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-06-single-exp.zdf rename to qpdf/qtest/qpdf/a-06-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-07-single-exp.zdf b/qpdf/qtest/qpdf/a-07-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-07-single-exp.zdf rename to qpdf/qtest/qpdf/a-07-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-08-single-exp.zdf b/qpdf/qtest/qpdf/a-08-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-08-single-exp.zdf rename to qpdf/qtest/qpdf/a-08-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-09-single-exp.zdf b/qpdf/qtest/qpdf/a-09-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-09-single-exp.zdf rename to qpdf/qtest/qpdf/a-09-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-10-single-exp.zdf b/qpdf/qtest/qpdf/a-10-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-10-single-exp.zdf rename to qpdf/qtest/qpdf/a-10-split-exp.zdf diff --git a/qpdf/qtest/qpdf/a-11-single-exp.zdf b/qpdf/qtest/qpdf/a-11-split-exp.zdf similarity index 100% rename from qpdf/qtest/qpdf/a-11-single-exp.zdf rename to qpdf/qtest/qpdf/a-11-split-exp.zdf diff --git a/qpdf/qtest/qpdf/single-exp-01.Pdf b/qpdf/qtest/qpdf/split-exp-01.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-01.Pdf rename to qpdf/qtest/qpdf/split-exp-01.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-02.Pdf b/qpdf/qtest/qpdf/split-exp-02.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-02.Pdf rename to qpdf/qtest/qpdf/split-exp-02.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-03.Pdf b/qpdf/qtest/qpdf/split-exp-03.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-03.Pdf rename to qpdf/qtest/qpdf/split-exp-03.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-04.Pdf b/qpdf/qtest/qpdf/split-exp-04.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-04.Pdf rename to qpdf/qtest/qpdf/split-exp-04.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-05.Pdf b/qpdf/qtest/qpdf/split-exp-05.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-05.Pdf rename to qpdf/qtest/qpdf/split-exp-05.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-06.Pdf b/qpdf/qtest/qpdf/split-exp-06.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-06.Pdf rename to qpdf/qtest/qpdf/split-exp-06.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-07.Pdf b/qpdf/qtest/qpdf/split-exp-07.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-07.Pdf rename to qpdf/qtest/qpdf/split-exp-07.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-08.Pdf b/qpdf/qtest/qpdf/split-exp-08.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-08.Pdf rename to qpdf/qtest/qpdf/split-exp-08.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-09.Pdf b/qpdf/qtest/qpdf/split-exp-09.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-09.Pdf rename to qpdf/qtest/qpdf/split-exp-09.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-1 b/qpdf/qtest/qpdf/split-exp-1 similarity index 100% rename from qpdf/qtest/qpdf/single-exp-1 rename to qpdf/qtest/qpdf/split-exp-1 diff --git a/qpdf/qtest/qpdf/single-exp-10.Pdf b/qpdf/qtest/qpdf/split-exp-10.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-10.Pdf rename to qpdf/qtest/qpdf/split-exp-10.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-11.Pdf b/qpdf/qtest/qpdf/split-exp-11.Pdf similarity index 100% rename from qpdf/qtest/qpdf/single-exp-11.Pdf rename to qpdf/qtest/qpdf/split-exp-11.Pdf diff --git a/qpdf/qtest/qpdf/single-exp-2 b/qpdf/qtest/qpdf/split-exp-2 similarity index 100% rename from qpdf/qtest/qpdf/single-exp-2 rename to qpdf/qtest/qpdf/split-exp-2 diff --git a/qpdf/qtest/qpdf/single-exp-3 b/qpdf/qtest/qpdf/split-exp-3 similarity index 100% rename from qpdf/qtest/qpdf/single-exp-3 rename to qpdf/qtest/qpdf/split-exp-3 diff --git a/qpdf/qtest/qpdf/single-exp-4 b/qpdf/qtest/qpdf/split-exp-4 similarity index 100% rename from qpdf/qtest/qpdf/single-exp-4 rename to qpdf/qtest/qpdf/split-exp-4 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_01 b/qpdf/qtest/qpdf/split-exp.zdf_01 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_01 rename to qpdf/qtest/qpdf/split-exp.zdf_01 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_02 b/qpdf/qtest/qpdf/split-exp.zdf_02 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_02 rename to qpdf/qtest/qpdf/split-exp.zdf_02 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_03 b/qpdf/qtest/qpdf/split-exp.zdf_03 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_03 rename to qpdf/qtest/qpdf/split-exp.zdf_03 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_04 b/qpdf/qtest/qpdf/split-exp.zdf_04 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_04 rename to qpdf/qtest/qpdf/split-exp.zdf_04 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_05 b/qpdf/qtest/qpdf/split-exp.zdf_05 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_05 rename to qpdf/qtest/qpdf/split-exp.zdf_05 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_06 b/qpdf/qtest/qpdf/split-exp.zdf_06 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_06 rename to qpdf/qtest/qpdf/split-exp.zdf_06 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_07 b/qpdf/qtest/qpdf/split-exp.zdf_07 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_07 rename to qpdf/qtest/qpdf/split-exp.zdf_07 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_08 b/qpdf/qtest/qpdf/split-exp.zdf_08 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_08 rename to qpdf/qtest/qpdf/split-exp.zdf_08 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_09 b/qpdf/qtest/qpdf/split-exp.zdf_09 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_09 rename to qpdf/qtest/qpdf/split-exp.zdf_09 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_10 b/qpdf/qtest/qpdf/split-exp.zdf_10 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_10 rename to qpdf/qtest/qpdf/split-exp.zdf_10 diff --git a/qpdf/qtest/qpdf/single-exp.zdf_11 b/qpdf/qtest/qpdf/split-exp.zdf_11 similarity index 100% rename from qpdf/qtest/qpdf/single-exp.zdf_11 rename to qpdf/qtest/qpdf/split-exp.zdf_11 diff --git a/qpdf/qtest/qpdf/single-pages-stdout.out b/qpdf/qtest/qpdf/split-pages-stdout.out similarity index 52% rename from qpdf/qtest/qpdf/single-pages-stdout.out rename to qpdf/qtest/qpdf/split-pages-stdout.out index 1efa16f1..fb14eaa9 100644 --- a/qpdf/qtest/qpdf/single-pages-stdout.out +++ b/qpdf/qtest/qpdf/split-pages-stdout.out @@ -1,5 +1,5 @@ -qpdf: --single-pages may not be used when writing to standard output +qpdf: --split-pages may not be used when writing to standard output Usage: qpdf [options] infile outfile For detailed help, run qpdf --help