aboutsummaryrefslogtreecommitdiffstats
path: root/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2024-01-02 00:55:45 +0100
committerJay Berkenbilt <ejb@ql.org>2024-01-02 00:57:32 +0100
commitd8d70ecca264fa5c681dca992a03cfa4c46b3f43 (patch)
treef9960a48f4550f6a9fc2d09cef27fba66852bdd5 /qpdf
parent9db5d75b2b40083f339525f7a59b4408cb1b5d2c (diff)
downloadqpdf-d8d70ecca264fa5c681dca992a03cfa4c46b3f43.tar.zst
Support comma-separated numeric values with --collate (fixes #505)
Diffstat (limited to 'qpdf')
-rw-r--r--qpdf/qtest/arg-parsing.test10
-rw-r--r--qpdf/qtest/collate.test8
-rw-r--r--qpdf/qtest/qpdf/three-files-2,3,4-collate-out.pdf988
3 files changed, 1002 insertions, 4 deletions
diff --git a/qpdf/qtest/arg-parsing.test b/qpdf/qtest/arg-parsing.test
index aca8c7ef..82594674 100644
--- a/qpdf/qtest/arg-parsing.test
+++ b/qpdf/qtest/arg-parsing.test
@@ -15,7 +15,7 @@ cleanup();
my $td = new TestDriver('arg-parsing');
-my $n_tests = 22;
+my $n_tests = 23;
$td->runtest("required argument",
{$td->COMMAND => "qpdf --password minimal.pdf"},
@@ -94,6 +94,14 @@ $td->runtest("v2-only qpdf json-key",
{$td->REGEXP => ".*\"qpdf\" is only valid for json version > 1.*",
$td->EXIT_STATUS => 2},
$td->NORMALIZE_NEWLINES);
+$td->runtest("wrong number of collate args",
+ {$td->COMMAND =>
+ "qpdf --collate=2,3 collate-odd.pdf" .
+ " --pages . minimal.pdf collate-even.pdf -- a.pdf"},
+ {$td->REGEXP => ".*--collate has more than one value.*",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+
# Ignoring -- at the top level was never intended but turned out to
# have been there for a long time so that people relied on it. It is
# intentionally not documented.
diff --git a/qpdf/qtest/collate.test b/qpdf/qtest/collate.test
index fbbea641..fb296e29 100644
--- a/qpdf/qtest/collate.test
+++ b/qpdf/qtest/collate.test
@@ -17,9 +17,11 @@ my $td = new TestDriver('collate');
my @collate = (
["", "three-files", "collate-odd",
"collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
- [1, "three-files", "collate-odd",
+ ["1", "three-files", "collate-odd",
"collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
- [2, "three-files-2", "collate-odd",
+ ["2", "three-files-2", "collate-odd",
+ "collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
+ ["2,3,4", "three-files-2,3,4", "collate-odd",
"collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
);
my $n_tests = 2 * scalar(@collate);
@@ -28,7 +30,7 @@ foreach my $d (@collate)
{
my ($n, $description, $first, $args) = @$d;
my $collate = '--collate';
- if ($n)
+ if ($n ne "")
{
$collate .= "=$n";
}
diff --git a/qpdf/qtest/qpdf/three-files-2,3,4-collate-out.pdf b/qpdf/qtest/qpdf/three-files-2,3,4-collate-out.pdf
new file mode 100644
index 00000000..8be9c056
--- /dev/null
+++ b/qpdf/qtest/qpdf/three-files-2,3,4-collate-out.pdf
@@ -0,0 +1,988 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+%% Original object ID: 1 0
+1 0 obj
+<<
+ /Outlines 2 0 R
+ /PageLabels <<
+ /Nums [
+ 0
+ <<
+ /P ()
+ /St 1
+ >>
+ 1
+ <<
+ /S /r
+ /St 1
+ >>
+ 2
+ <<
+ /St 3
+ >>
+ 3
+ <<
+ /S /D
+ /St 3
+ >>
+ 4
+ <<
+ /P ()
+ /St 1
+ >>
+ 5
+ <<
+ /S /r
+ /St 6
+ >>
+ 6
+ <<
+ /P ()
+ /St 1
+ >>
+ 7
+ <<
+ /S /r
+ /St 3
+ >>
+ 8
+ <<
+ /S /r
+ /St 5
+ >>
+ 9
+ <<
+ /S /r
+ /St 4
+ >>
+ 10
+ <<
+ /S /r
+ /St 2
+ >>
+ 11
+ <<
+ /P ()
+ /St 2
+ >>
+ 12
+ <<
+ /P ()
+ /St 2
+ >>
+ ]
+ >>
+ /PageMode /UseOutlines
+ /Pages 3 0 R
+ /Type /Catalog
+>>
+endobj
+
+%% Original object ID: 2 0
+2 0 obj
+<<
+ /Count 6
+ /First 4 0 R
+ /Last 5 0 R
+ /Type /Outlines
+>>
+endobj
+
+%% Original object ID: 3 0
+3 0 obj
+<<
+ /Count 13
+ /Kids [
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Original object ID: 4 0
+4 0 obj
+<<
+ /Count 4
+ /Dest [
+ null
+ /XYZ
+ null
+ null
+ null
+ ]
+ /First 19 0 R
+ /Last 20 0 R
+ /Next 5 0 R
+ /Parent 2 0 R
+ /Title (Isís 1 -> 5: /XYZ null null null)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 5 0
+5 0 obj
+<<
+ /Dest [
+ null
+ /XYZ
+ 66
+ 756
+ 3
+ ]
+ /Parent 2 0 R
+ /Prev 4 0 R
+ /Title (Trepak 2 -> 15: /XYZ 66 756 3)
+ /Type /Outline
+>>
+endobj
+
+%% Page 1
+%% Original object ID: 6 0
+6 0 obj
+<<
+ /Contents 21 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 23 0 R
+ >>
+ /ProcSet 24 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+%% Original object ID: 7 0
+7 0 obj
+<<
+ /Contents 25 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 23 0 R
+ >>
+ /ProcSet 24 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+%% Original object ID: 47 0
+8 0 obj
+<<
+ /Contents 27 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 29 0 R
+ >>
+ /ProcSet 30 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+%% Original object ID: 51 0
+9 0 obj
+<<
+ /Contents 31 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+%% Original object ID: 55 0
+10 0 obj
+<<
+ /Contents 35 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+%% Original object ID: 57 0
+11 0 obj
+<<
+ /Contents 37 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+%% Original object ID: 59 0
+12 0 obj
+<<
+ /Contents 39 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+%% Original object ID: 8 0
+13 0 obj
+<<
+ /Contents 41 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 23 0 R
+ >>
+ /ProcSet 24 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+%% Original object ID: 9 0
+14 0 obj
+<<
+ /Contents 43 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 23 0 R
+ >>
+ /ProcSet 24 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+%% Original object ID: 61 0
+15 0 obj
+<<
+ /Contents 45 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+%% Original object ID: 63 0
+16 0 obj
+<<
+ /Contents 47 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+%% Original object ID: 65 0
+17 0 obj
+<<
+ /Contents 49 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 33 0 R
+ >>
+ /ProcSet 34 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+%% Original object ID: 10 0
+18 0 obj
+<<
+ /Contents 51 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 23 0 R
+ >>
+ /ProcSet 24 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Original object ID: 21 0
+19 0 obj
+<<
+ /Count -3
+ /Dest [
+ null
+ /Fit
+ ]
+ /First 53 0 R
+ /Last 54 0 R
+ /Next 20 0 R
+ /Parent 4 0 R
+ /Title (Amanda 1.1 -> 11: /Fit)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 22 0
+20 0 obj
+<<
+ /Count 2
+ /Dest [
+ null
+ /FitH
+ 792
+ ]
+ /First 55 0 R
+ /Last 56 0 R
+ /Parent 4 0 R
+ /Prev 19 0 R
+ /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
+ /Type /Outline
+>>
+endobj
+
+%% Contents for page 1
+%% Original object ID: 23 0
+21 0 obj
+<<
+ /Length 22 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+22 0 obj
+46
+endobj
+
+%% Original object ID: 24 0
+23 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+%% Original object ID: 25 0
+24 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+%% Original object ID: 26 0
+25 0 obj
+<<
+ /Length 26 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+26 0 obj
+46
+endobj
+
+%% Contents for page 3
+%% Original object ID: 48 0
+27 0 obj
+<<
+ /Length 28 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+28 0 obj
+44
+endobj
+
+%% Original object ID: 49 0
+29 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+%% Original object ID: 50 0
+30 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 4
+%% Original object ID: 52 0
+31 0 obj
+<<
+ /Length 32 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+32 0 obj
+47
+endobj
+
+%% Original object ID: 53 0
+33 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+%% Original object ID: 54 0
+34 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 5
+%% Original object ID: 56 0
+35 0 obj
+<<
+ /Length 36 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+36 0 obj
+47
+endobj
+
+%% Contents for page 6
+%% Original object ID: 58 0
+37 0 obj
+<<
+ /Length 38 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+38 0 obj
+46
+endobj
+
+%% Contents for page 7
+%% Original object ID: 60 0
+39 0 obj
+<<
+ /Length 40 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+40 0 obj
+46
+endobj
+
+%% Contents for page 8
+%% Original object ID: 27 0
+41 0 obj
+<<
+ /Length 42 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+42 0 obj
+46
+endobj
+
+%% Contents for page 9
+%% Original object ID: 28 0
+43 0 obj
+<<
+ /Length 44 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+44 0 obj
+46
+endobj
+
+%% Contents for page 10
+%% Original object ID: 62 0
+45 0 obj
+<<
+ /Length 46 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+46 0 obj
+46
+endobj
+
+%% Contents for page 11
+%% Original object ID: 64 0
+47 0 obj
+<<
+ /Length 48 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+48 0 obj
+46
+endobj
+
+%% Contents for page 12
+%% Original object ID: 66 0
+49 0 obj
+<<
+ /Length 50 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+50 0 obj
+46
+endobj
+
+%% Contents for page 13
+%% Original object ID: 29 0
+51 0 obj
+<<
+ /Length 52 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+52 0 obj
+46
+endobj
+
+%% Original object ID: 40 0
+53 0 obj
+<<
+ /Count -2
+ /Dest [
+ 57 0 R
+ /FitV
+ 100
+ ]
+ /First 58 0 R
+ /Last 59 0 R
+ /Next 54 0 R
+ /Parent 19 0 R
+ /Title (Isosicle 1.1.1 -> 12: /FitV 100)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 41 0
+54 0 obj
+<<
+ /Count 1
+ /Dest [
+ 57 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /First 60 0 R
+ /Last 60 0 R
+ /Parent 19 0 R
+ /Prev 53 0 R
+ /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 42 0
+55 0 obj
+<<
+ /Dest [
+ null
+ /FitR
+ 66
+ 714
+ 180
+ 770
+ ]
+ /Next 56 0 R
+ /Parent 20 0 R
+ /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 43 0
+56 0 obj
+<<
+ /Dest [
+ 6 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Parent 20 0 R
+ /Prev 55 0 R
+ /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 12 0
+57 0 obj
+null
+endobj
+
+%% Original object ID: 44 0
+58 0 obj
+<<
+ /Dest [
+ 61 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Next 59 0 R
+ /Parent 53 0 R
+ /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 45 0
+59 0 obj
+<<
+ /Dest [
+ null
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Parent 53 0 R
+ /Prev 58 0 R
+ /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 46 0
+60 0 obj
+<<
+ /Dest [
+ 62 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Parent 54 0 R
+ /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
+ /Type /Outline
+>>
+endobj
+
+%% Original object ID: 15 0
+61 0 obj
+null
+endobj
+
+%% Original object ID: 17 0
+62 0 obj
+null
+endobj
+
+xref
+0 63
+0000000000 65535 f
+0000000052 00000 n
+0000000907 00000 n
+0000001014 00000 n
+0000001243 00000 n
+0000001484 00000 n
+0000001684 00000 n
+0000001916 00000 n
+0000002149 00000 n
+0000002382 00000 n
+0000002615 00000 n
+0000002849 00000 n
+0000003083 00000 n
+0000003316 00000 n
+0000003549 00000 n
+0000003784 00000 n
+0000004019 00000 n
+0000004254 00000 n
+0000004489 00000 n
+0000004713 00000 n
+0000004921 00000 n
+0000005278 00000 n
+0000005381 00000 n
+0000005429 00000 n
+0000005576 00000 n
+0000005663 00000 n
+0000005766 00000 n
+0000005837 00000 n
+0000005938 00000 n
+0000005986 00000 n
+0000006133 00000 n
+0000006220 00000 n
+0000006324 00000 n
+0000006372 00000 n
+0000006519 00000 n
+0000006606 00000 n
+0000006710 00000 n
+0000006781 00000 n
+0000006884 00000 n
+0000006955 00000 n
+0000007058 00000 n
+0000007129 00000 n
+0000007232 00000 n
+0000007303 00000 n
+0000007406 00000 n
+0000007478 00000 n
+0000007581 00000 n
+0000007653 00000 n
+0000007756 00000 n
+0000007828 00000 n
+0000007931 00000 n
+0000008003 00000 n
+0000008106 00000 n
+0000008154 00000 n
+0000008383 00000 n
+0000008639 00000 n
+0000008859 00000 n
+0000009072 00000 n
+0000009122 00000 n
+0000009338 00000 n
+0000009552 00000 n
+0000009753 00000 n
+0000009803 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 63
+ /ID [<d3fab8d0603e683dc94e42ac31141868><31415926535897932384626433832795>]
+>>
+startxref
+9825
+%%EOF