Commit dfce581754142d37308313b6788598771f242039

Authored by Jay Berkenbilt
1 parent a773f4c7

Add numeric argument to --collate

This takes pages from the file in groups of n with default = 1. This
partially fixes the enhancement in issue #505 but doesn't implement
the entire suggestion.
ChangeLog
  1 +2021-02-17 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Allow optional numeric argument to --collate. If --collate=n is
  4 + given, pull n pages from the first file, n pages from the second
  5 + file, etc., until we run out of pages.
  6 +
1 7 2021-02-15 Jay Berkenbilt <ejb@ql.org>
2 8  
3 9 * Add a version of QPDFObjectHandle::parse that takes a QPDF* as
... ...
manual/qpdf-manual.xml
... ... @@ -1077,12 +1077,14 @@ make
1077 1077 </listitem>
1078 1078 </varlistentry>
1079 1079 <varlistentry>
1080   - <term><option>--collate</option></term>
  1080 + <term><option>--collate=<replaceable>n</replaceable></option></term>
1081 1081 <listitem>
1082 1082 <para>
1083 1083 When specified, collate rather than concatenate pages from
1084   - files specified with <option>--pages</option>. See <xref
1085   - linkend="ref.page-selection"/> for additional details.
  1084 + files specified with <option>--pages</option>. With a numeric
  1085 + argument, collate in groups of <replaceable>n</replaceable>.
  1086 + The default is 1. See <xref linkend="ref.page-selection"/> for
  1087 + additional details.
1086 1088 </para>
1087 1089 </listitem>
1088 1090 </varlistentry>
... ... @@ -1647,6 +1649,27 @@ make
1647 1649 </itemizedlist>
1648 1650 </para>
1649 1651 <para>
  1652 + Starting in qpdf version 10.2, you may specify a numeric argument
  1653 + to <option>--collate</option>. With
  1654 + <option>--collate=<replaceable>n</replaceable></option>, pull
  1655 + groups of <replaceable>n</replaceable> pages from each file,
  1656 + again, stopping when there are no more pages. For example, if you
  1657 + ran <command>qpdf --collate=2 --empty --pages a.pdf 1-5 b.pdf 6-4
  1658 + c.pdf r1 -- out.pdf</command>, you would get the following pages
  1659 + in this order:
  1660 + <itemizedlist>
  1661 + <listitem><para>a.pdf page 1</para></listitem>
  1662 + <listitem><para>a.pdf page 2</para></listitem>
  1663 + <listitem><para>b.pdf page 6</para></listitem>
  1664 + <listitem><para>b.pdf page 5</para></listitem>
  1665 + <listitem><para>c.pdf last page</para></listitem>
  1666 + <listitem><para>a.pdf page 3</para></listitem>
  1667 + <listitem><para>a.pdf page 4</para></listitem>
  1668 + <listitem><para>b.pdf page 4</para></listitem>
  1669 + <listitem><para>a.pdf page 5</para></listitem>
  1670 + </itemizedlist>
  1671 + </para>
  1672 + <para>
1650 1673 Starting in qpdf version 8.3, when you split and merge files, any
1651 1674 page labels (page numbers) are preserved in the final file. It is
1652 1675 expected that more document features will be preserved by
... ... @@ -5144,6 +5167,14 @@ print &quot;\n&quot;;
5144 5167 reference to the file spec object.
5145 5168 </para>
5146 5169 </listitem>
  5170 + <listitem>
  5171 + <para>
  5172 + Add numeric option to <option>--collate</option>. If
  5173 + <option>--collate=<replaceable>n</replaceable></option> is
  5174 + given, take pages in groups of <replaceable>n</replaceable>
  5175 + from the given files.
  5176 + </para>
  5177 + </listitem>
5147 5178 </itemizedlist>
5148 5179 </listitem>
5149 5180 <listitem>
... ...
qpdf/qpdf.cc
... ... @@ -201,7 +201,7 @@ struct Options
201 201 show_filtered_stream_data(false),
202 202 show_pages(false),
203 203 show_page_images(false),
204   - collate(false),
  204 + collate(0),
205 205 flatten_rotation(false),
206 206 list_attachments(false),
207 207 json(false),
... ... @@ -307,7 +307,7 @@ struct Options
307 307 bool show_filtered_stream_data;
308 308 bool show_pages;
309 309 bool show_page_images;
310   - bool collate;
  310 + size_t collate;
311 311 bool flatten_rotation;
312 312 bool list_attachments;
313 313 std::string attachment_to_show;
... ... @@ -804,7 +804,7 @@ class ArgParser
804 804 void argUnderlay();
805 805 void argOverlay();
806 806 void argRotate(char* parameter);
807   - void argCollate();
  807 + void argCollate(char* parameter);
808 808 void argFlattenRotation();
809 809 void argListAttachments();
810 810 void argShowAttachment(char* parameter);
... ... @@ -1048,7 +1048,7 @@ ArgParser::initOptionTable()
1048 1048 &ArgParser::argRotate, "[+|-]angle:page-range");
1049 1049 char const* stream_data_choices[] =
1050 1050 {"compress", "preserve", "uncompress", 0};
1051   - (*t)["collate"] = oe_bare(&ArgParser::argCollate);
  1051 + (*t)["collate"] = oe_optionalParameter(&ArgParser::argCollate);
1052 1052 (*t)["flatten-rotation"] = oe_bare(&ArgParser::argFlattenRotation);
1053 1053 (*t)["list-attachments"] = oe_bare(&ArgParser::argListAttachments);
1054 1054 (*t)["show-attachment"] = oe_requiredParameter(
... ... @@ -1369,8 +1369,9 @@ ArgParser::argHelp()
1369 1369 << " encoding errors\n"
1370 1370 << "--password-mode=mode control qpdf's encoding of passwords\n"
1371 1371 << "--pages options -- select specific pages from one or more files\n"
1372   - << "--collate causes files specified in --pages to be collated\n"
1373   - << " rather than concatenated\n"
  1372 + << "--collate=n causes files specified in --pages to be collated\n"
  1373 + << " in groups of n pages (default 1) rather than\n"
  1374 + << " concatenated\n"
1374 1375 << "--flatten-rotation move page rotation from /Rotate key to content\n"
1375 1376 << "--rotate=[+|-]angle[:page-range]\n"
1376 1377 << " rotate each specified page 90, 180, or 270 degrees;\n"
... ... @@ -2068,9 +2069,11 @@ ArgParser::argEncryptionFilePassword(char* parameter)
2068 2069 }
2069 2070  
2070 2071 void
2071   -ArgParser::argCollate()
  2072 +ArgParser::argCollate(char* parameter)
2072 2073 {
2073   - o.collate = true;
  2074 + auto n = ((parameter == 0) ? 1 :
  2075 + QUtil::string_to_uint(parameter));
  2076 + o.collate = QIntC::to_size(n);
2074 2077 }
2075 2078  
2076 2079 void
... ... @@ -5788,16 +5791,19 @@ static void handle_page_specs(QPDF&amp; pdf, Options&amp; o, bool&amp; warnings)
5788 5791 for (size_t i = 0; i < nspecs; ++i)
5789 5792 {
5790 5793 QPDFPageData& page_data = parsed_specs.at(i);
5791   - if (cur_page < page_data.selected_pages.size())
  5794 + for (size_t j = 0; j < o.collate; ++j)
5792 5795 {
5793   - got_pages = true;
5794   - new_parsed_specs.push_back(
5795   - QPDFPageData(
5796   - page_data,
5797   - page_data.selected_pages.at(cur_page)));
  5796 + if (cur_page + j < page_data.selected_pages.size())
  5797 + {
  5798 + got_pages = true;
  5799 + new_parsed_specs.push_back(
  5800 + QPDFPageData(
  5801 + page_data,
  5802 + page_data.selected_pages.at(cur_page + j)));
  5803 + }
5798 5804 }
5799 5805 }
5800   - ++cur_page;
  5806 + cur_page += o.collate;
5801 5807 }
5802 5808 parsed_specs = new_parsed_specs;
5803 5809 }
... ...
qpdf/qtest/qpdf.test
... ... @@ -2573,17 +2573,26 @@ show_ntests();
2573 2573 # ----------
2574 2574 $td->notify("--- Collating ---");
2575 2575 my @collate = (
2576   - ["three-files", "collate-odd",
  2576 + ["", "three-files", "collate-odd",
  2577 + "collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
  2578 + [1, "three-files", "collate-odd",
  2579 + "collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
  2580 + [2, "three-files-2", "collate-odd",
2577 2581 "collate-odd.pdf 1-5 minimal.pdf collate-even.pdf 7-1"],
2578 2582 );
2579 2583 $n_tests += 2 * scalar(@collate);
2580 2584  
2581 2585 foreach my $d (@collate)
2582 2586 {
2583   - my ($description, $first, $args) = @$d;
  2587 + my ($n, $description, $first, $args) = @$d;
  2588 + my $collate = '--collate';
  2589 + if ($n)
  2590 + {
  2591 + $collate .= "=$n";
  2592 + }
2584 2593 $td->runtest("collate pages: $description",
2585 2594 {$td->COMMAND =>
2586   - "qpdf --qdf --static-id --collate $first.pdf" .
  2595 + "qpdf --qdf --static-id $collate $first.pdf" .
2587 2596 " --pages $args -- a.pdf"},
2588 2597 {$td->STRING => "", $td->EXIT_STATUS => 0});
2589 2598 $td->runtest("check output",
... ...
qpdf/qtest/qpdf/three-files-2-collate-out.pdf 0 โ†’ 100644
  1 +%PDF-1.3
  2 +%ยฟรทยขรพ
  3 +%QDF-1.0
  4 +
  5 +%% Original object ID: 1 0
  6 +1 0 obj
  7 +<<
  8 + /Outlines 2 0 R
  9 + /PageLabels <<
  10 + /Nums [
  11 + 0
  12 + <<
  13 + /P ()
  14 + /St 1
  15 + >>
  16 + 1
  17 + <<
  18 + /S /r
  19 + /St 1
  20 + >>
  21 + 2
  22 + <<
  23 + /St 3
  24 + >>
  25 + 3
  26 + <<
  27 + /S /D
  28 + /St 3
  29 + >>
  30 + 4
  31 + <<
  32 + /P ()
  33 + /St 1
  34 + >>
  35 + 5
  36 + <<
  37 + /S /r
  38 + /St 3
  39 + >>
  40 + 6
  41 + <<
  42 + /S /r
  43 + /St 5
  44 + >>
  45 + 8
  46 + <<
  47 + /P ()
  48 + /St 1
  49 + >>
  50 + 10
  51 + <<
  52 + /S /r
  53 + /St 4
  54 + >>
  55 + 11
  56 + <<
  57 + /S /r
  58 + /St 2
  59 + >>
  60 + 12
  61 + <<
  62 + /P ()
  63 + /St 2
  64 + >>
  65 + ]
  66 + >>
  67 + /PageMode /UseOutlines
  68 + /Pages 3 0 R
  69 + /Type /Catalog
  70 +>>
  71 +endobj
  72 +
  73 +%% Original object ID: 2 0
  74 +2 0 obj
  75 +<<
  76 + /Count 6
  77 + /First 4 0 R
  78 + /Last 5 0 R
  79 + /Type /Outlines
  80 +>>
  81 +endobj
  82 +
  83 +%% Original object ID: 3 0
  84 +3 0 obj
  85 +<<
  86 + /Count 13
  87 + /Kids [
  88 + 6 0 R
  89 + 7 0 R
  90 + 8 0 R
  91 + 9 0 R
  92 + 10 0 R
  93 + 11 0 R
  94 + 12 0 R
  95 + 13 0 R
  96 + 14 0 R
  97 + 15 0 R
  98 + 16 0 R
  99 + 17 0 R
  100 + 18 0 R
  101 + ]
  102 + /Type /Pages
  103 +>>
  104 +endobj
  105 +
  106 +%% Original object ID: 4 0
  107 +4 0 obj
  108 +<<
  109 + /Count 4
  110 + /Dest [
  111 + null
  112 + /XYZ
  113 + null
  114 + null
  115 + null
  116 + ]
  117 + /First 19 0 R
  118 + /Last 20 0 R
  119 + /Next 5 0 R
  120 + /Parent 2 0 R
  121 + /Title (Isรญs 1 -> 5: /XYZ null null null)
  122 + /Type /Outline
  123 +>>
  124 +endobj
  125 +
  126 +%% Original object ID: 5 0
  127 +5 0 obj
  128 +<<
  129 + /Dest [
  130 + null
  131 + /XYZ
  132 + 66
  133 + 756
  134 + 3
  135 + ]
  136 + /Parent 2 0 R
  137 + /Prev 4 0 R
  138 + /Title (Trepak 2 -> 15: /XYZ 66 756 3)
  139 + /Type /Outline
  140 +>>
  141 +endobj
  142 +
  143 +%% Page 1
  144 +%% Original object ID: 6 0
  145 +6 0 obj
  146 +<<
  147 + /Contents 21 0 R
  148 + /MediaBox [
  149 + 0
  150 + 0
  151 + 612
  152 + 792
  153 + ]
  154 + /Parent 3 0 R
  155 + /Resources <<
  156 + /Font <<
  157 + /F1 23 0 R
  158 + >>
  159 + /ProcSet 24 0 R
  160 + >>
  161 + /Type /Page
  162 +>>
  163 +endobj
  164 +
  165 +%% Page 2
  166 +%% Original object ID: 7 0
  167 +7 0 obj
  168 +<<
  169 + /Contents 25 0 R
  170 + /MediaBox [
  171 + 0
  172 + 0
  173 + 612
  174 + 792
  175 + ]
  176 + /Parent 3 0 R
  177 + /Resources <<
  178 + /Font <<
  179 + /F1 23 0 R
  180 + >>
  181 + /ProcSet 24 0 R
  182 + >>
  183 + /Type /Page
  184 +>>
  185 +endobj
  186 +
  187 +%% Page 3
  188 +%% Original object ID: 47 0
  189 +8 0 obj
  190 +<<
  191 + /Contents 27 0 R
  192 + /MediaBox [
  193 + 0
  194 + 0
  195 + 612
  196 + 792
  197 + ]
  198 + /Parent 3 0 R
  199 + /Resources <<
  200 + /Font <<
  201 + /F1 29 0 R
  202 + >>
  203 + /ProcSet 30 0 R
  204 + >>
  205 + /Type /Page
  206 +>>
  207 +endobj
  208 +
  209 +%% Page 4
  210 +%% Original object ID: 51 0
  211 +9 0 obj
  212 +<<
  213 + /Contents 31 0 R
  214 + /MediaBox [
  215 + 0
  216 + 0
  217 + 612
  218 + 792
  219 + ]
  220 + /Parent 3 0 R
  221 + /Resources <<
  222 + /Font <<
  223 + /F1 33 0 R
  224 + >>
  225 + /ProcSet 34 0 R
  226 + >>
  227 + /Type /Page
  228 +>>
  229 +endobj
  230 +
  231 +%% Page 5
  232 +%% Original object ID: 55 0
  233 +10 0 obj
  234 +<<
  235 + /Contents 35 0 R
  236 + /MediaBox [
  237 + 0
  238 + 0
  239 + 612
  240 + 792
  241 + ]
  242 + /Parent 3 0 R
  243 + /Resources <<
  244 + /Font <<
  245 + /F1 33 0 R
  246 + >>
  247 + /ProcSet 34 0 R
  248 + >>
  249 + /Type /Page
  250 +>>
  251 +endobj
  252 +
  253 +%% Page 6
  254 +%% Original object ID: 8 0
  255 +11 0 obj
  256 +<<
  257 + /Contents 37 0 R
  258 + /MediaBox [
  259 + 0
  260 + 0
  261 + 612
  262 + 792
  263 + ]
  264 + /Parent 3 0 R
  265 + /Resources <<
  266 + /Font <<
  267 + /F1 23 0 R
  268 + >>
  269 + /ProcSet 24 0 R
  270 + >>
  271 + /Type /Page
  272 +>>
  273 +endobj
  274 +
  275 +%% Page 7
  276 +%% Original object ID: 9 0
  277 +12 0 obj
  278 +<<
  279 + /Contents 39 0 R
  280 + /MediaBox [
  281 + 0
  282 + 0
  283 + 612
  284 + 792
  285 + ]
  286 + /Parent 3 0 R
  287 + /Resources <<
  288 + /Font <<
  289 + /F1 23 0 R
  290 + >>
  291 + /ProcSet 24 0 R
  292 + >>
  293 + /Type /Page
  294 +>>
  295 +endobj
  296 +
  297 +%% Page 8
  298 +%% Original object ID: 57 0
  299 +13 0 obj
  300 +<<
  301 + /Contents 41 0 R
  302 + /MediaBox [
  303 + 0
  304 + 0
  305 + 612
  306 + 792
  307 + ]
  308 + /Parent 3 0 R
  309 + /Resources <<
  310 + /Font <<
  311 + /F1 33 0 R
  312 + >>
  313 + /ProcSet 34 0 R
  314 + >>
  315 + /Type /Page
  316 +>>
  317 +endobj
  318 +
  319 +%% Page 9
  320 +%% Original object ID: 59 0
  321 +14 0 obj
  322 +<<
  323 + /Contents 43 0 R
  324 + /MediaBox [
  325 + 0
  326 + 0
  327 + 612
  328 + 792
  329 + ]
  330 + /Parent 3 0 R
  331 + /Resources <<
  332 + /Font <<
  333 + /F1 33 0 R
  334 + >>
  335 + /ProcSet 34 0 R
  336 + >>
  337 + /Type /Page
  338 +>>
  339 +endobj
  340 +
  341 +%% Page 10
  342 +%% Original object ID: 10 0
  343 +15 0 obj
  344 +<<
  345 + /Contents 45 0 R
  346 + /MediaBox [
  347 + 0
  348 + 0
  349 + 612
  350 + 792
  351 + ]
  352 + /Parent 3 0 R
  353 + /Resources <<
  354 + /Font <<
  355 + /F1 23 0 R
  356 + >>
  357 + /ProcSet 24 0 R
  358 + >>
  359 + /Type /Page
  360 +>>
  361 +endobj
  362 +
  363 +%% Page 11
  364 +%% Original object ID: 61 0
  365 +16 0 obj
  366 +<<
  367 + /Contents 47 0 R
  368 + /MediaBox [
  369 + 0
  370 + 0
  371 + 612
  372 + 792
  373 + ]
  374 + /Parent 3 0 R
  375 + /Resources <<
  376 + /Font <<
  377 + /F1 33 0 R
  378 + >>
  379 + /ProcSet 34 0 R
  380 + >>
  381 + /Type /Page
  382 +>>
  383 +endobj
  384 +
  385 +%% Page 12
  386 +%% Original object ID: 63 0
  387 +17 0 obj
  388 +<<
  389 + /Contents 49 0 R
  390 + /MediaBox [
  391 + 0
  392 + 0
  393 + 612
  394 + 792
  395 + ]
  396 + /Parent 3 0 R
  397 + /Resources <<
  398 + /Font <<
  399 + /F1 33 0 R
  400 + >>
  401 + /ProcSet 34 0 R
  402 + >>
  403 + /Type /Page
  404 +>>
  405 +endobj
  406 +
  407 +%% Page 13
  408 +%% Original object ID: 65 0
  409 +18 0 obj
  410 +<<
  411 + /Contents 51 0 R
  412 + /MediaBox [
  413 + 0
  414 + 0
  415 + 612
  416 + 792
  417 + ]
  418 + /Parent 3 0 R
  419 + /Resources <<
  420 + /Font <<
  421 + /F1 33 0 R
  422 + >>
  423 + /ProcSet 34 0 R
  424 + >>
  425 + /Type /Page
  426 +>>
  427 +endobj
  428 +
  429 +%% Original object ID: 21 0
  430 +19 0 obj
  431 +<<
  432 + /Count -3
  433 + /Dest [
  434 + null
  435 + /Fit
  436 + ]
  437 + /First 53 0 R
  438 + /Last 54 0 R
  439 + /Next 20 0 R
  440 + /Parent 4 0 R
  441 + /Title (Amanda 1.1 -> 11: /Fit)
  442 + /Type /Outline
  443 +>>
  444 +endobj
  445 +
  446 +%% Original object ID: 22 0
  447 +20 0 obj
  448 +<<
  449 + /Count 2
  450 + /Dest [
  451 + null
  452 + /FitH
  453 + 792
  454 + ]
  455 + /First 55 0 R
  456 + /Last 56 0 R
  457 + /Parent 4 0 R
  458 + /Prev 19 0 R
  459 + /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
  460 + /Type /Outline
  461 +>>
  462 +endobj
  463 +
  464 +%% Contents for page 1
  465 +%% Original object ID: 23 0
  466 +21 0 obj
  467 +<<
  468 + /Length 22 0 R
  469 +>>
  470 +stream
  471 +BT
  472 + /F1 24 Tf
  473 + 72 720 Td
  474 + (Potato 0) Tj
  475 +ET
  476 +endstream
  477 +endobj
  478 +
  479 +22 0 obj
  480 +46
  481 +endobj
  482 +
  483 +%% Original object ID: 24 0
  484 +23 0 obj
  485 +<<
  486 + /BaseFont /Helvetica
  487 + /Encoding /WinAnsiEncoding
  488 + /Name /F1
  489 + /Subtype /Type1
  490 + /Type /Font
  491 +>>
  492 +endobj
  493 +
  494 +%% Original object ID: 25 0
  495 +24 0 obj
  496 +[
  497 + /PDF
  498 + /Text
  499 +]
  500 +endobj
  501 +
  502 +%% Contents for page 2
  503 +%% Original object ID: 26 0
  504 +25 0 obj
  505 +<<
  506 + /Length 26 0 R
  507 +>>
  508 +stream
  509 +BT
  510 + /F1 24 Tf
  511 + 72 720 Td
  512 + (Potato 2) Tj
  513 +ET
  514 +endstream
  515 +endobj
  516 +
  517 +26 0 obj
  518 +46
  519 +endobj
  520 +
  521 +%% Contents for page 3
  522 +%% Original object ID: 48 0
  523 +27 0 obj
  524 +<<
  525 + /Length 28 0 R
  526 +>>
  527 +stream
  528 +BT
  529 + /F1 24 Tf
  530 + 72 720 Td
  531 + (Potato) Tj
  532 +ET
  533 +endstream
  534 +endobj
  535 +
  536 +28 0 obj
  537 +44
  538 +endobj
  539 +
  540 +%% Original object ID: 49 0
  541 +29 0 obj
  542 +<<
  543 + /BaseFont /Helvetica
  544 + /Encoding /WinAnsiEncoding
  545 + /Name /F1
  546 + /Subtype /Type1
  547 + /Type /Font
  548 +>>
  549 +endobj
  550 +
  551 +%% Original object ID: 50 0
  552 +30 0 obj
  553 +[
  554 + /PDF
  555 + /Text
  556 +]
  557 +endobj
  558 +
  559 +%% Contents for page 4
  560 +%% Original object ID: 52 0
  561 +31 0 obj
  562 +<<
  563 + /Length 32 0 R
  564 +>>
  565 +stream
  566 +BT
  567 + /F1 24 Tf
  568 + 72 720 Td
  569 + (Potato 13) Tj
  570 +ET
  571 +endstream
  572 +endobj
  573 +
  574 +32 0 obj
  575 +47
  576 +endobj
  577 +
  578 +%% Original object ID: 53 0
  579 +33 0 obj
  580 +<<
  581 + /BaseFont /Helvetica
  582 + /Encoding /WinAnsiEncoding
  583 + /Name /F1
  584 + /Subtype /Type1
  585 + /Type /Font
  586 +>>
  587 +endobj
  588 +
  589 +%% Original object ID: 54 0
  590 +34 0 obj
  591 +[
  592 + /PDF
  593 + /Text
  594 +]
  595 +endobj
  596 +
  597 +%% Contents for page 5
  598 +%% Original object ID: 56 0
  599 +35 0 obj
  600 +<<
  601 + /Length 36 0 R
  602 +>>
  603 +stream
  604 +BT
  605 + /F1 24 Tf
  606 + 72 720 Td
  607 + (Potato 11) Tj
  608 +ET
  609 +endstream
  610 +endobj
  611 +
  612 +36 0 obj
  613 +47
  614 +endobj
  615 +
  616 +%% Contents for page 6
  617 +%% Original object ID: 27 0
  618 +37 0 obj
  619 +<<
  620 + /Length 38 0 R
  621 +>>
  622 +stream
  623 +BT
  624 + /F1 24 Tf
  625 + 72 720 Td
  626 + (Potato 4) Tj
  627 +ET
  628 +endstream
  629 +endobj
  630 +
  631 +38 0 obj
  632 +46
  633 +endobj
  634 +
  635 +%% Contents for page 7
  636 +%% Original object ID: 28 0
  637 +39 0 obj
  638 +<<
  639 + /Length 40 0 R
  640 +>>
  641 +stream
  642 +BT
  643 + /F1 24 Tf
  644 + 72 720 Td
  645 + (Potato 6) Tj
  646 +ET
  647 +endstream
  648 +endobj
  649 +
  650 +40 0 obj
  651 +46
  652 +endobj
  653 +
  654 +%% Contents for page 8
  655 +%% Original object ID: 58 0
  656 +41 0 obj
  657 +<<
  658 + /Length 42 0 R
  659 +>>
  660 +stream
  661 +BT
  662 + /F1 24 Tf
  663 + 72 720 Td
  664 + (Potato 9) Tj
  665 +ET
  666 +endstream
  667 +endobj
  668 +
  669 +42 0 obj
  670 +46
  671 +endobj
  672 +
  673 +%% Contents for page 9
  674 +%% Original object ID: 60 0
  675 +43 0 obj
  676 +<<
  677 + /Length 44 0 R
  678 +>>
  679 +stream
  680 +BT
  681 + /F1 24 Tf
  682 + 72 720 Td
  683 + (Potato 7) Tj
  684 +ET
  685 +endstream
  686 +endobj
  687 +
  688 +44 0 obj
  689 +46
  690 +endobj
  691 +
  692 +%% Contents for page 10
  693 +%% Original object ID: 29 0
  694 +45 0 obj
  695 +<<
  696 + /Length 46 0 R
  697 +>>
  698 +stream
  699 +BT
  700 + /F1 24 Tf
  701 + 72 720 Td
  702 + (Potato 8) Tj
  703 +ET
  704 +endstream
  705 +endobj
  706 +
  707 +46 0 obj
  708 +46
  709 +endobj
  710 +
  711 +%% Contents for page 11
  712 +%% Original object ID: 62 0
  713 +47 0 obj
  714 +<<
  715 + /Length 48 0 R
  716 +>>
  717 +stream
  718 +BT
  719 + /F1 24 Tf
  720 + 72 720 Td
  721 + (Potato 5) Tj
  722 +ET
  723 +endstream
  724 +endobj
  725 +
  726 +48 0 obj
  727 +46
  728 +endobj
  729 +
  730 +%% Contents for page 12
  731 +%% Original object ID: 64 0
  732 +49 0 obj
  733 +<<
  734 + /Length 50 0 R
  735 +>>
  736 +stream
  737 +BT
  738 + /F1 24 Tf
  739 + 72 720 Td
  740 + (Potato 3) Tj
  741 +ET
  742 +endstream
  743 +endobj
  744 +
  745 +50 0 obj
  746 +46
  747 +endobj
  748 +
  749 +%% Contents for page 13
  750 +%% Original object ID: 66 0
  751 +51 0 obj
  752 +<<
  753 + /Length 52 0 R
  754 +>>
  755 +stream
  756 +BT
  757 + /F1 24 Tf
  758 + 72 720 Td
  759 + (Potato 1) Tj
  760 +ET
  761 +endstream
  762 +endobj
  763 +
  764 +52 0 obj
  765 +46
  766 +endobj
  767 +
  768 +%% Original object ID: 40 0
  769 +53 0 obj
  770 +<<
  771 + /Count -2
  772 + /Dest [
  773 + 57 0 R
  774 + /FitV
  775 + 100
  776 + ]
  777 + /First 58 0 R
  778 + /Last 59 0 R
  779 + /Next 54 0 R
  780 + /Parent 19 0 R
  781 + /Title (Isosicle 1.1.1 -> 12: /FitV 100)
  782 + /Type /Outline
  783 +>>
  784 +endobj
  785 +
  786 +%% Original object ID: 41 0
  787 +54 0 obj
  788 +<<
  789 + /Count 1
  790 + /Dest [
  791 + 57 0 R
  792 + /XYZ
  793 + null
  794 + null
  795 + null
  796 + ]
  797 + /First 60 0 R
  798 + /Last 60 0 R
  799 + /Parent 19 0 R
  800 + /Prev 53 0 R
  801 + /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
  802 + /Type /Outline
  803 +>>
  804 +endobj
  805 +
  806 +%% Original object ID: 42 0
  807 +55 0 obj
  808 +<<
  809 + /Dest [
  810 + null
  811 + /FitR
  812 + 66
  813 + 714
  814 + 180
  815 + 770
  816 + ]
  817 + /Next 56 0 R
  818 + /Parent 20 0 R
  819 + /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
  820 + /Type /Outline
  821 +>>
  822 +endobj
  823 +
  824 +%% Original object ID: 43 0
  825 +56 0 obj
  826 +<<
  827 + /Dest [
  828 + 6 0 R
  829 + /XYZ
  830 + null
  831 + null
  832 + null
  833 + ]
  834 + /Parent 20 0 R
  835 + /Prev 55 0 R
  836 + /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
  837 + /Type /Outline
  838 +>>
  839 +endobj
  840 +
  841 +%% Original object ID: 12 0
  842 +57 0 obj
  843 +null
  844 +endobj
  845 +
  846 +%% Original object ID: 44 0
  847 +58 0 obj
  848 +<<
  849 + /Dest [
  850 + 61 0 R
  851 + /XYZ
  852 + null
  853 + null
  854 + null
  855 + ]
  856 + /Next 59 0 R
  857 + /Parent 53 0 R
  858 + /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
  859 + /Type /Outline
  860 +>>
  861 +endobj
  862 +
  863 +%% Original object ID: 45 0
  864 +59 0 obj
  865 +<<
  866 + /Dest [
  867 + null
  868 + /XYZ
  869 + null
  870 + null
  871 + null
  872 + ]
  873 + /Parent 53 0 R
  874 + /Prev 58 0 R
  875 + /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
  876 + /Type /Outline
  877 +>>
  878 +endobj
  879 +
  880 +%% Original object ID: 46 0
  881 +60 0 obj
  882 +<<
  883 + /Dest [
  884 + 62 0 R
  885 + /XYZ
  886 + null
  887 + null
  888 + null
  889 + ]
  890 + /Parent 54 0 R
  891 + /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
  892 + /Type /Outline
  893 +>>
  894 +endobj
  895 +
  896 +%% Original object ID: 15 0
  897 +61 0 obj
  898 +null
  899 +endobj
  900 +
  901 +%% Original object ID: 17 0
  902 +62 0 obj
  903 +null
  904 +endobj
  905 +
  906 +xref
  907 +0 63
  908 +0000000000 65535 f
  909 +0000000052 00000 n
  910 +0000000799 00000 n
  911 +0000000906 00000 n
  912 +0000001135 00000 n
  913 +0000001376 00000 n
  914 +0000001576 00000 n
  915 +0000001808 00000 n
  916 +0000002041 00000 n
  917 +0000002274 00000 n
  918 +0000002507 00000 n
  919 +0000002740 00000 n
  920 +0000002973 00000 n
  921 +0000003207 00000 n
  922 +0000003441 00000 n
  923 +0000003676 00000 n
  924 +0000003911 00000 n
  925 +0000004146 00000 n
  926 +0000004381 00000 n
  927 +0000004605 00000 n
  928 +0000004813 00000 n
  929 +0000005170 00000 n
  930 +0000005273 00000 n
  931 +0000005321 00000 n
  932 +0000005468 00000 n
  933 +0000005555 00000 n
  934 +0000005658 00000 n
  935 +0000005729 00000 n
  936 +0000005830 00000 n
  937 +0000005878 00000 n
  938 +0000006025 00000 n
  939 +0000006112 00000 n
  940 +0000006216 00000 n
  941 +0000006264 00000 n
  942 +0000006411 00000 n
  943 +0000006498 00000 n
  944 +0000006602 00000 n
  945 +0000006673 00000 n
  946 +0000006776 00000 n
  947 +0000006847 00000 n
  948 +0000006950 00000 n
  949 +0000007021 00000 n
  950 +0000007124 00000 n
  951 +0000007195 00000 n
  952 +0000007298 00000 n
  953 +0000007370 00000 n
  954 +0000007473 00000 n
  955 +0000007545 00000 n
  956 +0000007648 00000 n
  957 +0000007720 00000 n
  958 +0000007823 00000 n
  959 +0000007895 00000 n
  960 +0000007998 00000 n
  961 +0000008046 00000 n
  962 +0000008275 00000 n
  963 +0000008531 00000 n
  964 +0000008751 00000 n
  965 +0000008964 00000 n
  966 +0000009014 00000 n
  967 +0000009230 00000 n
  968 +0000009444 00000 n
  969 +0000009645 00000 n
  970 +0000009695 00000 n
  971 +trailer <<
  972 + /Root 1 0 R
  973 + /Size 63
  974 + /ID [<d3fab8d0603e683dc94e42ac31141868><31415926535897932384626433832795>]
  975 +>>
  976 +startxref
  977 +9717
  978 +%%EOF
... ...