From 313ba081265f69ac9a0324f9fe87087c72918191 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 19 Dec 2018 17:01:56 -0500 Subject: [PATCH] Preserve some outline functionality in page splitting --- ChangeLog | 8 + qpdf/qpdf.cc | 24 + qpdf/qtest/qpdf.test | 13 +- qpdf/qtest/qpdf/outlines-split-01-10.pdf | 760 +++++++++++++++++++++++ qpdf/qtest/qpdf/outlines-split-11-20.pdf | 760 +++++++++++++++++++++++ qpdf/qtest/qpdf/outlines-split-21-30.pdf | 760 +++++++++++++++++++++++ 6 files changed, 2324 insertions(+), 1 deletion(-) create mode 100644 qpdf/qtest/qpdf/outlines-split-01-10.pdf create mode 100644 qpdf/qtest/qpdf/outlines-split-11-20.pdf create mode 100644 qpdf/qtest/qpdf/outlines-split-21-30.pdf diff --git a/ChangeLog b/ChangeLog index 447c35b2..aaf64d24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2018-12-19 Jay Berkenbilt + * When splitting pages using --split-pages, the outlines + dictionary and some supporting metadata are copied into the split + files. The result is that all bookmarks from the original file + appear, and those that point to pages that are preserved work + while those that point to pages that are not preserved don't do + anything. This is an interim step toward proper support for + bookmark preservation in split files. + * Add QPDFOutlineDocumentHelper and QPDFOutlineObjectHelper for handling outlines (bookmarks) including bidirectionally mapping between bookmarks and pages. Initially there is no support for diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index b6762aab..46b984bc 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -2622,6 +2622,30 @@ static void write_outfile(QPDF& pdf, Options& o) "/Nums", QPDFObjectHandle::newArray(labels)); outpdf.getRoot().replaceKey("/PageLabels", page_labels); } + // Copying the outlines tree, names table, and any + // outdated Dests key from the original file will make + // some things work in the split files. It is not a + // complete solution, but at least outlines whose + // destinations are on pages that have been preserved will + // work normally. There are other top-level structures + // that should be copied as well. This will be improved in + // the future. + std::list to_copy; + to_copy.push_back("/Names"); + to_copy.push_back("/Dests"); + to_copy.push_back("/Outlines"); + for (std::list::iterator iter = to_copy.begin(); + iter != to_copy.end(); ++iter) + { + QPDFObjectHandle orig = pdf.getRoot().getKey(*iter); + if (! orig.isIndirect()) + { + orig = pdf.makeIndirectObject(orig); + } + outpdf.getRoot().replaceKey( + *iter, + outpdf.copyForeignObject(orig)); + } std::string page_range = QUtil::int_to_string(first, pageno_len); if (o.split_pages > 1) { diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index cc8a0755..9b063cb7 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -1159,7 +1159,7 @@ my @sp_cases = ( [11, 'pdf extension', '', 'split-out.Pdf'], [4, 'fallback', '--pages 11-pages.pdf 1-3 minimal.pdf --', 'split-out'], ); -$n_tests += 12; +$n_tests += 16; for (@sp_cases) { $n_tests += 1 + $_->[0]; @@ -1204,6 +1204,17 @@ foreach my $i (qw(01-06 07-11)) {$td->FILE => "labels-split-$i.pdf"}); } +$td->runtest("split page with outlines", + {$td->COMMAND => "qpdf --qdf --static-id --split-pages=10". + " outlines-with-actions.pdf split-out-outlines.pdf"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); +foreach my $i (qw(01-10 11-20 21-30)) +{ + $td->runtest("check output ($i)", + {$td->FILE => "split-out-outlines-$i.pdf"}, + {$td->FILE => "outlines-split-$i.pdf"}); +} + foreach my $d (@sp_cases) { my ($n, $description, $xargs, $out) = @$d; diff --git a/qpdf/qtest/qpdf/outlines-split-01-10.pdf b/qpdf/qtest/qpdf/outlines-split-01-10.pdf new file mode 100644 index 00000000..2a15df92 --- /dev/null +++ b/qpdf/qtest/qpdf/outlines-split-01-10.pdf @@ -0,0 +1,760 @@ +%PDF-1.3 +%¿÷¢þ +%QDF-1.0 + +%% Original object ID: 1 0 +1 0 obj +<< + /Names 2 0 R + /Outlines 3 0 R + /Pages 4 0 R + /Type /Catalog +>> +endobj + +%% Original object ID: 35 0 +2 0 obj +<< + /Dests 5 0 R +>> +endobj + +%% Original object ID: 38 0 +3 0 obj +<< + /Count 6 + /First 6 0 R + /Last 7 0 R + /Type /Outlines +>> +endobj + +%% Original object ID: 2 0 +4 0 obj +<< + /Count 10 + /Kids [ + 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 + ] + /Type /Pages +>> +endobj + +%% Original object ID: 36 0 +5 0 obj +<< + /Names [ + (gabeebee) + [ + 9 0 R + /FitR + 66 + 714 + 180 + 770 + ] + (glarp) + [ + null + /XYZ + null + null + null + ] + ] +>> +endobj + +%% Original object ID: 39 0 +6 0 obj +<< + /Count 4 + /Dest [ + 13 0 R + /XYZ + null + null + null + ] + /First 18 0 R + /Last 19 0 R + /Next 7 0 R + /Parent 3 0 R + /Title (Potato 1 -> 5: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 50 0 +7 0 obj +<< + /Dest [ + null + /XYZ + 66 + 756 + 3 + ] + /Parent 3 0 R + /Prev 6 0 R + /Title (Salad 2 -> 15: /XYZ 66 756 3) + /Type /Outline +>> +endobj + +%% Page 1 +%% Original object ID: 3 0 +8 0 obj +<< + /Contents 20 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 2 +%% Original object ID: 8 0 +9 0 obj +<< + /Contents 24 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 3 +%% Original object ID: 11 0 +10 0 obj +<< + /Contents 26 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 4 +%% Original object ID: 14 0 +11 0 obj +<< + /Contents 28 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 5 +%% Original object ID: 17 0 +12 0 obj +<< + /Contents 30 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 6 +%% Original object ID: 20 0 +13 0 obj +<< + /Contents 32 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 7 +%% Original object ID: 23 0 +14 0 obj +<< + /Contents 34 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 8 +%% Original object ID: 26 0 +15 0 obj +<< + /Contents 36 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 9 +%% Original object ID: 29 0 +16 0 obj +<< + /Contents 38 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 10 +%% Original object ID: 32 0 +17 0 obj +<< + /Contents 40 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Original object ID: 40 0 +18 0 obj +<< + /Count -3 + /Dest [ + null + /Fit + ] + /First 42 0 R + /Last 43 0 R + /Next 19 0 R + /Parent 6 0 R + /Title (Mern 1.1 -> 11: /Fit) + /Type /Outline +>> +endobj + +%% Original object ID: 47 0 +19 0 obj +<< + /Count 2 + /Dest [ + null + /FitH + 792 + ] + /First 44 0 R + /Last 45 0 R + /Parent 6 0 R + /Prev 18 0 R + /Title + /Type /Outline +>> +endobj + +%% Contents for page 1 +%% Original object ID: 4 0 +20 0 obj +<< + /Length 21 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 0) Tj +ET +endstream +endobj + +21 0 obj +45 +endobj + +%% Original object ID: 6 0 +22 0 obj +<< + /BaseFont /Helvetica + /Encoding /WinAnsiEncoding + /Name /F1 + /Subtype /Type1 + /Type /Font +>> +endobj + +%% Original object ID: 7 0 +23 0 obj +[ + /PDF + /Text +] +endobj + +%% Contents for page 2 +%% Original object ID: 9 0 +24 0 obj +<< + /Length 25 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 1) Tj +ET +endstream +endobj + +25 0 obj +45 +endobj + +%% Contents for page 3 +%% Original object ID: 12 0 +26 0 obj +<< + /Length 27 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 2) Tj +ET +endstream +endobj + +27 0 obj +45 +endobj + +%% Contents for page 4 +%% Original object ID: 15 0 +28 0 obj +<< + /Length 29 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 3) Tj +ET +endstream +endobj + +29 0 obj +45 +endobj + +%% Contents for page 5 +%% Original object ID: 18 0 +30 0 obj +<< + /Length 31 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 4) Tj +ET +endstream +endobj + +31 0 obj +45 +endobj + +%% Contents for page 6 +%% Original object ID: 21 0 +32 0 obj +<< + /Length 33 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 5) Tj +ET +endstream +endobj + +33 0 obj +45 +endobj + +%% Contents for page 7 +%% Original object ID: 24 0 +34 0 obj +<< + /Length 35 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 6) Tj +ET +endstream +endobj + +35 0 obj +45 +endobj + +%% Contents for page 8 +%% Original object ID: 27 0 +36 0 obj +<< + /Length 37 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 7) Tj +ET +endstream +endobj + +37 0 obj +45 +endobj + +%% Contents for page 9 +%% Original object ID: 30 0 +38 0 obj +<< + /Length 39 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 8) Tj +ET +endstream +endobj + +39 0 obj +45 +endobj + +%% Contents for page 10 +%% Original object ID: 33 0 +40 0 obj +<< + /Length 41 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 9) Tj +ET +endstream +endobj + +41 0 obj +45 +endobj + +%% Original object ID: 41 0 +42 0 obj +<< + /Count -2 + /Dest [ + null + /FitV + 100 + ] + /First 46 0 R + /Last 47 0 R + /Next 43 0 R + /Parent 18 0 R + /Title (Biherbadem 1.1.1 -> 12: /FitV 100) + /Type /Outline +>> +endobj + +%% Original object ID: 44 0 +43 0 obj +<< + /Count 1 + /Dest [ + null + /XYZ + null + null + null + ] + /First 48 0 R + /Last 48 0 R + /Parent 18 0 R + /Prev 42 0 R + /Title (Gawehwehweh 1.1.2 -> 12: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 48 0 +44 0 obj +<< + /Dest (gabeebee) + /Next 45 0 R + /Parent 19 0 R + /Title (Gabeebeebee \(name\) 1.2.1 -> 1: /FitR 66 714 180 770) + /Type /Outline +>> +endobj + +%% Original object ID: 49 0 +45 0 obj +<< + /A << + /D [ + 8 0 R + /XYZ + null + null + null + ] + /S /GoTo + /Type /Action + >> + /Parent 19 0 R + /Prev 44 0 R + /Title (Merschqaberschq \(A\) 1.2.2 -> 0: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 42 0 +46 0 obj +<< + /A << + /D (glarp) + /S /GoTo + /Type /Action + >> + /Next 47 0 R + /Parent 42 0 R + /Title (Glarpenspliel \(A, name\) 1.1.1.1 -> 18: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 43 0 +47 0 obj +<< + /Dest [ + null + /XYZ + null + null + null + ] + /Parent 42 0 R + /Prev 46 0 R + /Title (Hagoogamagoogle 1.1.1.2 -> 19: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 45 0 +48 0 obj +<< + /Dest 49 0 R + /Parent 43 0 R + /Title (Jawarnianbvarwash 1.1.2.1 -> 22: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 46 0 +49 0 obj +[ + null + /XYZ + null + null + null +] +endobj + +xref +0 50 +0000000000 65535 f +0000000052 00000 n +0000000167 00000 n +0000000232 00000 n +0000000339 00000 n +0000000538 00000 n +0000000772 00000 n +0000001018 00000 n +0000001217 00000 n +0000001449 00000 n +0000001682 00000 n +0000001916 00000 n +0000002150 00000 n +0000002384 00000 n +0000002618 00000 n +0000002852 00000 n +0000003086 00000 n +0000003321 00000 n +0000003545 00000 n +0000003751 00000 n +0000004099 00000 n +0000004201 00000 n +0000004248 00000 n +0000004394 00000 n +0000004480 00000 n +0000004582 00000 n +0000004653 00000 n +0000004755 00000 n +0000004826 00000 n +0000004928 00000 n +0000004999 00000 n +0000005101 00000 n +0000005172 00000 n +0000005274 00000 n +0000005345 00000 n +0000005447 00000 n +0000005518 00000 n +0000005620 00000 n +0000005691 00000 n +0000005793 00000 n +0000005865 00000 n +0000005967 00000 n +0000006015 00000 n +0000006244 00000 n +0000006501 00000 n +0000006685 00000 n +0000006965 00000 n +0000007196 00000 n +0000007417 00000 n +0000007581 00000 n +trailer << + /Root 1 0 R + /Size 50 + /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] +>> +startxref +7637 +%%EOF diff --git a/qpdf/qtest/qpdf/outlines-split-11-20.pdf b/qpdf/qtest/qpdf/outlines-split-11-20.pdf new file mode 100644 index 00000000..04263d57 --- /dev/null +++ b/qpdf/qtest/qpdf/outlines-split-11-20.pdf @@ -0,0 +1,760 @@ +%PDF-1.3 +%¿÷¢þ +%QDF-1.0 + +%% Original object ID: 1 0 +1 0 obj +<< + /Names 2 0 R + /Outlines 3 0 R + /Pages 4 0 R + /Type /Catalog +>> +endobj + +%% Original object ID: 35 0 +2 0 obj +<< + /Dests 5 0 R +>> +endobj + +%% Original object ID: 38 0 +3 0 obj +<< + /Count 6 + /First 6 0 R + /Last 7 0 R + /Type /Outlines +>> +endobj + +%% Original object ID: 2 0 +4 0 obj +<< + /Count 10 + /Kids [ + 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 + ] + /Type /Pages +>> +endobj + +%% Original object ID: 36 0 +5 0 obj +<< + /Names [ + (gabeebee) + [ + null + /FitR + 66 + 714 + 180 + 770 + ] + (glarp) + [ + 16 0 R + /XYZ + null + null + null + ] + ] +>> +endobj + +%% Original object ID: 39 0 +6 0 obj +<< + /Count 4 + /Dest [ + null + /XYZ + null + null + null + ] + /First 18 0 R + /Last 19 0 R + /Next 7 0 R + /Parent 3 0 R + /Title (Potato 1 -> 5: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 50 0 +7 0 obj +<< + /Dest [ + 13 0 R + /XYZ + 66 + 756 + 3 + ] + /Parent 3 0 R + /Prev 6 0 R + /Title (Salad 2 -> 15: /XYZ 66 756 3) + /Type /Outline +>> +endobj + +%% Page 1 +%% Original object ID: 3 0 +8 0 obj +<< + /Contents 20 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 2 +%% Original object ID: 8 0 +9 0 obj +<< + /Contents 24 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 3 +%% Original object ID: 11 0 +10 0 obj +<< + /Contents 26 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 4 +%% Original object ID: 14 0 +11 0 obj +<< + /Contents 28 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 5 +%% Original object ID: 17 0 +12 0 obj +<< + /Contents 30 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 6 +%% Original object ID: 20 0 +13 0 obj +<< + /Contents 32 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 7 +%% Original object ID: 23 0 +14 0 obj +<< + /Contents 34 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 8 +%% Original object ID: 26 0 +15 0 obj +<< + /Contents 36 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 9 +%% Original object ID: 29 0 +16 0 obj +<< + /Contents 38 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 10 +%% Original object ID: 32 0 +17 0 obj +<< + /Contents 40 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Original object ID: 40 0 +18 0 obj +<< + /Count -3 + /Dest [ + 9 0 R + /Fit + ] + /First 42 0 R + /Last 43 0 R + /Next 19 0 R + /Parent 6 0 R + /Title (Mern 1.1 -> 11: /Fit) + /Type /Outline +>> +endobj + +%% Original object ID: 47 0 +19 0 obj +<< + /Count 2 + /Dest [ + 11 0 R + /FitH + 792 + ] + /First 44 0 R + /Last 45 0 R + /Parent 6 0 R + /Prev 18 0 R + /Title + /Type /Outline +>> +endobj + +%% Contents for page 1 +%% Original object ID: 4 0 +20 0 obj +<< + /Length 21 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 10) Tj +ET +endstream +endobj + +21 0 obj +46 +endobj + +%% Original object ID: 6 0 +22 0 obj +<< + /BaseFont /Helvetica + /Encoding /WinAnsiEncoding + /Name /F1 + /Subtype /Type1 + /Type /Font +>> +endobj + +%% Original object ID: 7 0 +23 0 obj +[ + /PDF + /Text +] +endobj + +%% Contents for page 2 +%% Original object ID: 9 0 +24 0 obj +<< + /Length 25 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 11) Tj +ET +endstream +endobj + +25 0 obj +46 +endobj + +%% Contents for page 3 +%% Original object ID: 12 0 +26 0 obj +<< + /Length 27 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 12) Tj +ET +endstream +endobj + +27 0 obj +46 +endobj + +%% Contents for page 4 +%% Original object ID: 15 0 +28 0 obj +<< + /Length 29 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 13) Tj +ET +endstream +endobj + +29 0 obj +46 +endobj + +%% Contents for page 5 +%% Original object ID: 18 0 +30 0 obj +<< + /Length 31 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 14) Tj +ET +endstream +endobj + +31 0 obj +46 +endobj + +%% Contents for page 6 +%% Original object ID: 21 0 +32 0 obj +<< + /Length 33 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 15) Tj +ET +endstream +endobj + +33 0 obj +46 +endobj + +%% Contents for page 7 +%% Original object ID: 24 0 +34 0 obj +<< + /Length 35 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 16) Tj +ET +endstream +endobj + +35 0 obj +46 +endobj + +%% Contents for page 8 +%% Original object ID: 27 0 +36 0 obj +<< + /Length 37 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 17) Tj +ET +endstream +endobj + +37 0 obj +46 +endobj + +%% Contents for page 9 +%% Original object ID: 30 0 +38 0 obj +<< + /Length 39 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 18) Tj +ET +endstream +endobj + +39 0 obj +46 +endobj + +%% Contents for page 10 +%% Original object ID: 33 0 +40 0 obj +<< + /Length 41 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 19) Tj +ET +endstream +endobj + +41 0 obj +46 +endobj + +%% Original object ID: 41 0 +42 0 obj +<< + /Count -2 + /Dest [ + 10 0 R + /FitV + 100 + ] + /First 46 0 R + /Last 47 0 R + /Next 43 0 R + /Parent 18 0 R + /Title (Biherbadem 1.1.1 -> 12: /FitV 100) + /Type /Outline +>> +endobj + +%% Original object ID: 44 0 +43 0 obj +<< + /Count 1 + /Dest [ + 10 0 R + /XYZ + null + null + null + ] + /First 48 0 R + /Last 48 0 R + /Parent 18 0 R + /Prev 42 0 R + /Title (Gawehwehweh 1.1.2 -> 12: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 48 0 +44 0 obj +<< + /Dest (gabeebee) + /Next 45 0 R + /Parent 19 0 R + /Title (Gabeebeebee \(name\) 1.2.1 -> 1: /FitR 66 714 180 770) + /Type /Outline +>> +endobj + +%% Original object ID: 49 0 +45 0 obj +<< + /A << + /D [ + null + /XYZ + null + null + null + ] + /S /GoTo + /Type /Action + >> + /Parent 19 0 R + /Prev 44 0 R + /Title (Merschqaberschq \(A\) 1.2.2 -> 0: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 42 0 +46 0 obj +<< + /A << + /D (glarp) + /S /GoTo + /Type /Action + >> + /Next 47 0 R + /Parent 42 0 R + /Title (Glarpenspliel \(A, name\) 1.1.1.1 -> 18: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 43 0 +47 0 obj +<< + /Dest [ + 17 0 R + /XYZ + null + null + null + ] + /Parent 42 0 R + /Prev 46 0 R + /Title (Hagoogamagoogle 1.1.1.2 -> 19: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 45 0 +48 0 obj +<< + /Dest 49 0 R + /Parent 43 0 R + /Title (Jawarnianbvarwash 1.1.2.1 -> 22: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 46 0 +49 0 obj +[ + null + /XYZ + null + null + null +] +endobj + +xref +0 50 +0000000000 65535 f +0000000052 00000 n +0000000167 00000 n +0000000232 00000 n +0000000339 00000 n +0000000538 00000 n +0000000773 00000 n +0000001017 00000 n +0000001218 00000 n +0000001450 00000 n +0000001683 00000 n +0000001917 00000 n +0000002151 00000 n +0000002385 00000 n +0000002619 00000 n +0000002853 00000 n +0000003087 00000 n +0000003322 00000 n +0000003546 00000 n +0000003753 00000 n +0000004103 00000 n +0000004206 00000 n +0000004253 00000 n +0000004399 00000 n +0000004485 00000 n +0000004588 00000 n +0000004659 00000 n +0000004762 00000 n +0000004833 00000 n +0000004936 00000 n +0000005007 00000 n +0000005110 00000 n +0000005181 00000 n +0000005284 00000 n +0000005355 00000 n +0000005458 00000 n +0000005529 00000 n +0000005632 00000 n +0000005703 00000 n +0000005806 00000 n +0000005878 00000 n +0000005981 00000 n +0000006029 00000 n +0000006260 00000 n +0000006519 00000 n +0000006703 00000 n +0000006982 00000 n +0000007213 00000 n +0000007436 00000 n +0000007600 00000 n +trailer << + /Root 1 0 R + /Size 50 + /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] +>> +startxref +7656 +%%EOF diff --git a/qpdf/qtest/qpdf/outlines-split-21-30.pdf b/qpdf/qtest/qpdf/outlines-split-21-30.pdf new file mode 100644 index 00000000..b1a3566f --- /dev/null +++ b/qpdf/qtest/qpdf/outlines-split-21-30.pdf @@ -0,0 +1,760 @@ +%PDF-1.3 +%¿÷¢þ +%QDF-1.0 + +%% Original object ID: 1 0 +1 0 obj +<< + /Names 2 0 R + /Outlines 3 0 R + /Pages 4 0 R + /Type /Catalog +>> +endobj + +%% Original object ID: 35 0 +2 0 obj +<< + /Dests 5 0 R +>> +endobj + +%% Original object ID: 38 0 +3 0 obj +<< + /Count 6 + /First 6 0 R + /Last 7 0 R + /Type /Outlines +>> +endobj + +%% Original object ID: 2 0 +4 0 obj +<< + /Count 10 + /Kids [ + 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 + ] + /Type /Pages +>> +endobj + +%% Original object ID: 36 0 +5 0 obj +<< + /Names [ + (gabeebee) + [ + null + /FitR + 66 + 714 + 180 + 770 + ] + (glarp) + [ + null + /XYZ + null + null + null + ] + ] +>> +endobj + +%% Original object ID: 39 0 +6 0 obj +<< + /Count 4 + /Dest [ + null + /XYZ + null + null + null + ] + /First 18 0 R + /Last 19 0 R + /Next 7 0 R + /Parent 3 0 R + /Title (Potato 1 -> 5: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 50 0 +7 0 obj +<< + /Dest [ + null + /XYZ + 66 + 756 + 3 + ] + /Parent 3 0 R + /Prev 6 0 R + /Title (Salad 2 -> 15: /XYZ 66 756 3) + /Type /Outline +>> +endobj + +%% Page 1 +%% Original object ID: 3 0 +8 0 obj +<< + /Contents 20 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 2 +%% Original object ID: 8 0 +9 0 obj +<< + /Contents 24 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 3 +%% Original object ID: 11 0 +10 0 obj +<< + /Contents 26 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 4 +%% Original object ID: 14 0 +11 0 obj +<< + /Contents 28 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 5 +%% Original object ID: 17 0 +12 0 obj +<< + /Contents 30 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 6 +%% Original object ID: 20 0 +13 0 obj +<< + /Contents 32 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 7 +%% Original object ID: 23 0 +14 0 obj +<< + /Contents 34 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 8 +%% Original object ID: 26 0 +15 0 obj +<< + /Contents 36 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 9 +%% Original object ID: 29 0 +16 0 obj +<< + /Contents 38 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Page 10 +%% Original object ID: 32 0 +17 0 obj +<< + /Contents 40 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 4 0 R + /Resources << + /Font << + /F1 22 0 R + >> + /ProcSet 23 0 R + >> + /Type /Page +>> +endobj + +%% Original object ID: 40 0 +18 0 obj +<< + /Count -3 + /Dest [ + null + /Fit + ] + /First 42 0 R + /Last 43 0 R + /Next 19 0 R + /Parent 6 0 R + /Title (Mern 1.1 -> 11: /Fit) + /Type /Outline +>> +endobj + +%% Original object ID: 47 0 +19 0 obj +<< + /Count 2 + /Dest [ + null + /FitH + 792 + ] + /First 44 0 R + /Last 45 0 R + /Parent 6 0 R + /Prev 18 0 R + /Title + /Type /Outline +>> +endobj + +%% Contents for page 1 +%% Original object ID: 4 0 +20 0 obj +<< + /Length 21 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 20) Tj +ET +endstream +endobj + +21 0 obj +46 +endobj + +%% Original object ID: 6 0 +22 0 obj +<< + /BaseFont /Helvetica + /Encoding /WinAnsiEncoding + /Name /F1 + /Subtype /Type1 + /Type /Font +>> +endobj + +%% Original object ID: 7 0 +23 0 obj +[ + /PDF + /Text +] +endobj + +%% Contents for page 2 +%% Original object ID: 9 0 +24 0 obj +<< + /Length 25 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 21) Tj +ET +endstream +endobj + +25 0 obj +46 +endobj + +%% Contents for page 3 +%% Original object ID: 12 0 +26 0 obj +<< + /Length 27 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 22) Tj +ET +endstream +endobj + +27 0 obj +46 +endobj + +%% Contents for page 4 +%% Original object ID: 15 0 +28 0 obj +<< + /Length 29 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 23) Tj +ET +endstream +endobj + +29 0 obj +46 +endobj + +%% Contents for page 5 +%% Original object ID: 18 0 +30 0 obj +<< + /Length 31 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 24) Tj +ET +endstream +endobj + +31 0 obj +46 +endobj + +%% Contents for page 6 +%% Original object ID: 21 0 +32 0 obj +<< + /Length 33 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 25) Tj +ET +endstream +endobj + +33 0 obj +46 +endobj + +%% Contents for page 7 +%% Original object ID: 24 0 +34 0 obj +<< + /Length 35 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 26) Tj +ET +endstream +endobj + +35 0 obj +46 +endobj + +%% Contents for page 8 +%% Original object ID: 27 0 +36 0 obj +<< + /Length 37 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 27) Tj +ET +endstream +endobj + +37 0 obj +46 +endobj + +%% Contents for page 9 +%% Original object ID: 30 0 +38 0 obj +<< + /Length 39 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 28) Tj +ET +endstream +endobj + +39 0 obj +46 +endobj + +%% Contents for page 10 +%% Original object ID: 33 0 +40 0 obj +<< + /Length 41 0 R +>> +stream +BT + /F1 24 Tf + 72 720 Td + (Salad 29) Tj +ET +endstream +endobj + +41 0 obj +46 +endobj + +%% Original object ID: 41 0 +42 0 obj +<< + /Count -2 + /Dest [ + null + /FitV + 100 + ] + /First 46 0 R + /Last 47 0 R + /Next 43 0 R + /Parent 18 0 R + /Title (Biherbadem 1.1.1 -> 12: /FitV 100) + /Type /Outline +>> +endobj + +%% Original object ID: 44 0 +43 0 obj +<< + /Count 1 + /Dest [ + null + /XYZ + null + null + null + ] + /First 48 0 R + /Last 48 0 R + /Parent 18 0 R + /Prev 42 0 R + /Title (Gawehwehweh 1.1.2 -> 12: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 48 0 +44 0 obj +<< + /Dest (gabeebee) + /Next 45 0 R + /Parent 19 0 R + /Title (Gabeebeebee \(name\) 1.2.1 -> 1: /FitR 66 714 180 770) + /Type /Outline +>> +endobj + +%% Original object ID: 49 0 +45 0 obj +<< + /A << + /D [ + null + /XYZ + null + null + null + ] + /S /GoTo + /Type /Action + >> + /Parent 19 0 R + /Prev 44 0 R + /Title (Merschqaberschq \(A\) 1.2.2 -> 0: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 42 0 +46 0 obj +<< + /A << + /D (glarp) + /S /GoTo + /Type /Action + >> + /Next 47 0 R + /Parent 42 0 R + /Title (Glarpenspliel \(A, name\) 1.1.1.1 -> 18: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 43 0 +47 0 obj +<< + /Dest [ + null + /XYZ + null + null + null + ] + /Parent 42 0 R + /Prev 46 0 R + /Title (Hagoogamagoogle 1.1.1.2 -> 19: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 45 0 +48 0 obj +<< + /Dest 49 0 R + /Parent 43 0 R + /Title (Jawarnianbvarwash 1.1.2.1 -> 22: /XYZ null null null) + /Type /Outline +>> +endobj + +%% Original object ID: 46 0 +49 0 obj +[ + 10 0 R + /XYZ + null + null + null +] +endobj + +xref +0 50 +0000000000 65535 f +0000000052 00000 n +0000000167 00000 n +0000000232 00000 n +0000000339 00000 n +0000000538 00000 n +0000000771 00000 n +0000001015 00000 n +0000001214 00000 n +0000001446 00000 n +0000001679 00000 n +0000001913 00000 n +0000002147 00000 n +0000002381 00000 n +0000002615 00000 n +0000002849 00000 n +0000003083 00000 n +0000003318 00000 n +0000003542 00000 n +0000003748 00000 n +0000004096 00000 n +0000004199 00000 n +0000004246 00000 n +0000004392 00000 n +0000004478 00000 n +0000004581 00000 n +0000004652 00000 n +0000004755 00000 n +0000004826 00000 n +0000004929 00000 n +0000005000 00000 n +0000005103 00000 n +0000005174 00000 n +0000005277 00000 n +0000005348 00000 n +0000005451 00000 n +0000005522 00000 n +0000005625 00000 n +0000005696 00000 n +0000005799 00000 n +0000005871 00000 n +0000005974 00000 n +0000006022 00000 n +0000006251 00000 n +0000006508 00000 n +0000006692 00000 n +0000006971 00000 n +0000007202 00000 n +0000007423 00000 n +0000007587 00000 n +trailer << + /Root 1 0 R + /Size 50 + /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] +>> +startxref +7645 +%%EOF