Commit 28453a4908be35de9b8156c7375bd1346d4281d7

Authored by Jay Berkenbilt
1 parent 5e9e17e6

Add --keep-files-open flag (fixes #237)

ChangeLog
  1 +2018-08-18 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Add new option --keep-files-open=[yn] to control whether qpdf
  4 + keeps files open when merging. Prior to version 8.1.0, qpdf always
  5 + kept all files open, but this meant that the number of files that
  6 + could be merged was limited by the operating system's open file
  7 + limit. Version 8.1.0 opened files as they were referenced, but
  8 + this caused a major performance impact. Version 8.2.0 optimized
  9 + the performance but did so in a way that, for local file systems,
  10 + there was a small but unavoidable performance hit, but for
  11 + networked file systems, the performance impact could be very high.
  12 + Starting with version 8.2.1, the default behavior is that files
  13 + are kept open if no more than 200 files are specified, but that
  14 + the behavior can be explicitly overridden with the
  15 + --keep-files-open flag. If you are merging more than 200 files but
  16 + less than the operating system's max open files limit, you may
  17 + want to use --keep-files-open=y. If you are using a local file
  18 + system where the overhead is low and you might sometimes merge
  19 + more than the OS limit's number of files, you may want to specify
  20 + --keep-files-open=n. Fixes #237.
  21 +
1 22 2018-08-16 Jay Berkenbilt <ejb@ql.org>
2 23  
3 24 * 8.2.0: release
... ...
qpdf/qpdf.cc
... ... @@ -8,6 +8,7 @@
8 8 #include <qpdf/QUtil.hh>
9 9 #include <qpdf/QTC.hh>
10 10 #include <qpdf/ClosedFileInputSource.hh>
  11 +#include <qpdf/FileInputSource.hh>
11 12 #include <qpdf/Pl_StdioFile.hh>
12 13 #include <qpdf/Pl_Discard.hh>
13 14 #include <qpdf/PointerHolder.hh>
... ... @@ -95,6 +96,8 @@ struct Options
95 96 qdf_mode(false),
96 97 preserve_unreferenced_objects(false),
97 98 preserve_unreferenced_page_resources(false),
  99 + keep_files_open(true),
  100 + keep_files_open_set(false),
98 101 newline_before_endstream(false),
99 102 coalesce_contents(false),
100 103 show_npages(false),
... ... @@ -162,6 +165,8 @@ struct Options
162 165 bool qdf_mode;
163 166 bool preserve_unreferenced_objects;
164 167 bool preserve_unreferenced_page_resources;
  168 + bool keep_files_open;
  169 + bool keep_files_open_set;
165 170 bool newline_before_endstream;
166 171 std::string linearize_pass1;
167 172 bool coalesce_contents;
... ... @@ -384,6 +389,7 @@ These options allow pages to be selected from one or more PDF files.\n\
384 389 Whatever file is given as the primary input file is used as the\n\
385 390 starting point, but its pages are replaced with pages as specified.\n\
386 391 \n\
  392 +--keep-files-open=[yn]\n\
387 393 --pages file [ --password=password ] [ page-range ] ... --\n\
388 394 \n\
389 395 For each file that pages should be taken from, specify the file, a\n\
... ... @@ -396,6 +402,13 @@ non-page data (info, outlines, page numbers, etc. are taken from the\n\
396 402 primary input file. To discard this, use --empty as the primary\n\
397 403 input.\n\
398 404 \n\
  405 +By default, when more than 200 distinct files are specified, qpdf will\n\
  406 +close each file when not being referenced. With 200 files or fewer, all\n\
  407 +files will be kept open at the same time. This behavior can be overridden\n\
  408 +by specifying --keep-files-open=[yn]. Closing and opening files can have\n\
  409 +very high overhead on certain file systems, especially networked file\n\
  410 +systems.\n\
  411 +\n\
399 412 The page range is a set of numbers separated by commas, ranges of\n\
400 413 numbers separated dashes, or combinations of those. The character\n\
401 414 \"z\" represents the last page. A number preceded by an \"r\" indicates\n\
... ... @@ -1631,6 +1644,23 @@ static void parse_options(int argc, char* argv[], Options&amp; o)
1631 1644 {
1632 1645 o.preserve_unreferenced_page_resources = true;
1633 1646 }
  1647 + else if (strcmp(arg, "keep-files-open") == 0)
  1648 + {
  1649 + o.keep_files_open_set = true;
  1650 + if (parameter && (strcmp(parameter, "y") == 0))
  1651 + {
  1652 + o.keep_files_open = true;
  1653 + }
  1654 + else if (parameter && (strcmp(parameter, "n") == 0))
  1655 + {
  1656 + o.keep_files_open = false;
  1657 + }
  1658 + else
  1659 + {
  1660 + usage("--keep-files-open must be given as"
  1661 + " --keep-files-open=[yn]");
  1662 + }
  1663 + }
1634 1664 else if (strcmp(arg, "newline-before-endstream") == 0)
1635 1665 {
1636 1666 o.newline_before_endstream = true;
... ... @@ -2113,6 +2143,43 @@ static void handle_page_specs(QPDF&amp; pdf, Options&amp; o,
2113 2143 // Parse all page specifications and translate them into lists of
2114 2144 // actual pages.
2115 2145  
  2146 + if (! o.keep_files_open_set)
  2147 + {
  2148 + // Count the number of distinct files to determine whether we
  2149 + // should keep files open or not. Rather than trying to code
  2150 + // some portable heuristic based on OS limits, just hard-code
  2151 + // this at a given number and allow users to override.
  2152 + std::set<std::string> filenames;
  2153 + for (std::vector<PageSpec>::iterator iter = o.page_specs.begin();
  2154 + iter != o.page_specs.end(); ++iter)
  2155 + {
  2156 + PageSpec& page_spec = *iter;
  2157 + filenames.insert(page_spec.filename);
  2158 + }
  2159 + // NOTE: The number 200 for this threshold is in the help
  2160 + // message and manual and is baked into the test suite.
  2161 + if (filenames.size() > 200)
  2162 + {
  2163 + QTC::TC("qpdf", "qpdf disable keep files open");
  2164 + if (o.verbose)
  2165 + {
  2166 + std::cout << whoami << ": selecting --keep-open-files=n"
  2167 + << std::endl;
  2168 + }
  2169 + o.keep_files_open = false;
  2170 + }
  2171 + else
  2172 + {
  2173 + if (o.verbose)
  2174 + {
  2175 + std::cout << whoami << ": selecting --keep-open-files=y"
  2176 + << std::endl;
  2177 + }
  2178 + o.keep_files_open = true;
  2179 + QTC::TC("qpdf", "qpdf don't disable keep files open");
  2180 + }
  2181 + }
  2182 +
2116 2183 // Create a QPDF object for each file that we may take pages from.
2117 2184 std::map<std::string, QPDF*> page_spec_qpdfs;
2118 2185 std::map<std::string, ClosedFileInputSource*> page_spec_cfis;
... ... @@ -2149,14 +2216,29 @@ static void handle_page_specs(QPDF&amp; pdf, Options&amp; o,
2149 2216 std::cout << whoami << ": processing "
2150 2217 << page_spec.filename << std::endl;
2151 2218 }
2152   - ClosedFileInputSource* cis =
2153   - new ClosedFileInputSource(page_spec.filename.c_str());
2154   - PointerHolder<InputSource> is(cis);
2155   - cis->stayOpen(true);
  2219 + PointerHolder<InputSource> is;
  2220 + ClosedFileInputSource* cis = 0;
  2221 + if (! o.keep_files_open)
  2222 + {
  2223 + QTC::TC("qpdf", "qpdf keep files open n");
  2224 + cis = new ClosedFileInputSource(page_spec.filename.c_str());
  2225 + is = cis;
  2226 + cis->stayOpen(true);
  2227 + }
  2228 + else
  2229 + {
  2230 + QTC::TC("qpdf", "qpdf keep files open y");
  2231 + FileInputSource* fis = new FileInputSource();
  2232 + is = fis;
  2233 + fis->setFilename(page_spec.filename.c_str());
  2234 + }
2156 2235 qpdf->processInputSource(is, password);
2157   - cis->stayOpen(false);
2158 2236 page_spec_qpdfs[page_spec.filename] = qpdf;
2159   - page_spec_cfis[page_spec.filename] = cis;
  2237 + if (cis)
  2238 + {
  2239 + cis->stayOpen(false);
  2240 + page_spec_cfis[page_spec.filename] = cis;
  2241 + }
2160 2242 }
2161 2243  
2162 2244 // Read original pages from the PDF, and parse the page range
... ...
qpdf/qpdf.testcov
... ... @@ -356,3 +356,7 @@ QPDFAcroFormDocumentHelper non-dictionary field 0
356 356 QPDFAcroFormDocumentHelper loop 0
357 357 QPDFAcroFormDocumentHelper field found 1
358 358 QPDFAcroFormDocumentHelper annotation found 1
  359 +qpdf disable keep files open 0
  360 +qpdf keep files open n 0
  361 +qpdf keep files open y 0
  362 +qpdf don't disable keep files open 0
... ...
qpdf/qtest/qpdf.test
... ... @@ -1178,6 +1178,49 @@ foreach my $d (@sp_cases)
1178 1178  
1179 1179 show_ntests();
1180 1180 # ----------
  1181 +$td->notify("--- Keep Files Open ---");
  1182 +$n_tests += 4;
  1183 +
  1184 +{ # local scope
  1185 + open(F, "<minimal.pdf") or die;
  1186 + local $/ = undef;
  1187 + binmode F;
  1188 + my $content = <F>;
  1189 + close(F);
  1190 + for (my $i = 1; $i <= 201; ++$i)
  1191 + {
  1192 + open(F, sprintf(">%03d-kfo.pdf", $i)) or die;
  1193 + print F $content;
  1194 + close(F);
  1195 + }
  1196 +}
  1197 +$td->runtest("disable keep files open",
  1198 + {$td->COMMAND =>
  1199 + "qpdf --verbose --static-id --empty" .
  1200 + " --pages *kfo.pdf -- a.pdf"},
  1201 + {$td->FILE => "disable-kfo.out", $td->EXIT_STATUS => 0},
  1202 + $td->NORMALIZE_NEWLINES);
  1203 +$td->runtest("don't disable keep files open",
  1204 + {$td->COMMAND =>
  1205 + "qpdf --verbose --static-id --empty" .
  1206 + " --pages 1*kfo.pdf -- a.pdf"},
  1207 + {$td->FILE => "enable-kfo.out", $td->EXIT_STATUS => 0},
  1208 + $td->NORMALIZE_NEWLINES);
  1209 +$td->runtest("explict keep files open",
  1210 + {$td->COMMAND =>
  1211 + "qpdf --verbose --static-id --keep-files-open=y --empty" .
  1212 + " --pages 00?-kfo.pdf -- a.pdf"},
  1213 + {$td->FILE => "kfo-y.out", $td->EXIT_STATUS => 0},
  1214 + $td->NORMALIZE_NEWLINES);
  1215 +$td->runtest("explicit keep files open = n",
  1216 + {$td->COMMAND =>
  1217 + "qpdf --verbose --static-id --keep-files-open=n --empty" .
  1218 + " --pages 00?-kfo.pdf -- a.pdf"},
  1219 + {$td->FILE => "kfo-n.out", $td->EXIT_STATUS => 0},
  1220 + $td->NORMALIZE_NEWLINES);
  1221 +
  1222 +show_ntests();
  1223 +# ----------
1181 1224 $td->notify("--- Rotate Pages ---");
1182 1225 $n_tests += 4;
1183 1226 # Do absolute, positive, and negative on ranges that include
... ... @@ -3143,5 +3186,5 @@ sub get_md5_checksum
3143 3186 sub cleanup
3144 3187 {
3145 3188 system("rm -rf *.ps *.pnm ?.pdf ?.qdf *.enc* tif1 tif2 tiff-cache");
3146   - system("rm -rf *split-out*");
  3189 + system("rm -rf *split-out* ???-kfo.pdf");
3147 3190 }
... ...
qpdf/qtest/qpdf/disable-kfo.out 0 → 100644
  1 +qpdf: selecting --keep-open-files=n
  2 +qpdf: processing 001-kfo.pdf
  3 +qpdf: processing 002-kfo.pdf
  4 +qpdf: processing 003-kfo.pdf
  5 +qpdf: processing 004-kfo.pdf
  6 +qpdf: processing 005-kfo.pdf
  7 +qpdf: processing 006-kfo.pdf
  8 +qpdf: processing 007-kfo.pdf
  9 +qpdf: processing 008-kfo.pdf
  10 +qpdf: processing 009-kfo.pdf
  11 +qpdf: processing 010-kfo.pdf
  12 +qpdf: processing 011-kfo.pdf
  13 +qpdf: processing 012-kfo.pdf
  14 +qpdf: processing 013-kfo.pdf
  15 +qpdf: processing 014-kfo.pdf
  16 +qpdf: processing 015-kfo.pdf
  17 +qpdf: processing 016-kfo.pdf
  18 +qpdf: processing 017-kfo.pdf
  19 +qpdf: processing 018-kfo.pdf
  20 +qpdf: processing 019-kfo.pdf
  21 +qpdf: processing 020-kfo.pdf
  22 +qpdf: processing 021-kfo.pdf
  23 +qpdf: processing 022-kfo.pdf
  24 +qpdf: processing 023-kfo.pdf
  25 +qpdf: processing 024-kfo.pdf
  26 +qpdf: processing 025-kfo.pdf
  27 +qpdf: processing 026-kfo.pdf
  28 +qpdf: processing 027-kfo.pdf
  29 +qpdf: processing 028-kfo.pdf
  30 +qpdf: processing 029-kfo.pdf
  31 +qpdf: processing 030-kfo.pdf
  32 +qpdf: processing 031-kfo.pdf
  33 +qpdf: processing 032-kfo.pdf
  34 +qpdf: processing 033-kfo.pdf
  35 +qpdf: processing 034-kfo.pdf
  36 +qpdf: processing 035-kfo.pdf
  37 +qpdf: processing 036-kfo.pdf
  38 +qpdf: processing 037-kfo.pdf
  39 +qpdf: processing 038-kfo.pdf
  40 +qpdf: processing 039-kfo.pdf
  41 +qpdf: processing 040-kfo.pdf
  42 +qpdf: processing 041-kfo.pdf
  43 +qpdf: processing 042-kfo.pdf
  44 +qpdf: processing 043-kfo.pdf
  45 +qpdf: processing 044-kfo.pdf
  46 +qpdf: processing 045-kfo.pdf
  47 +qpdf: processing 046-kfo.pdf
  48 +qpdf: processing 047-kfo.pdf
  49 +qpdf: processing 048-kfo.pdf
  50 +qpdf: processing 049-kfo.pdf
  51 +qpdf: processing 050-kfo.pdf
  52 +qpdf: processing 051-kfo.pdf
  53 +qpdf: processing 052-kfo.pdf
  54 +qpdf: processing 053-kfo.pdf
  55 +qpdf: processing 054-kfo.pdf
  56 +qpdf: processing 055-kfo.pdf
  57 +qpdf: processing 056-kfo.pdf
  58 +qpdf: processing 057-kfo.pdf
  59 +qpdf: processing 058-kfo.pdf
  60 +qpdf: processing 059-kfo.pdf
  61 +qpdf: processing 060-kfo.pdf
  62 +qpdf: processing 061-kfo.pdf
  63 +qpdf: processing 062-kfo.pdf
  64 +qpdf: processing 063-kfo.pdf
  65 +qpdf: processing 064-kfo.pdf
  66 +qpdf: processing 065-kfo.pdf
  67 +qpdf: processing 066-kfo.pdf
  68 +qpdf: processing 067-kfo.pdf
  69 +qpdf: processing 068-kfo.pdf
  70 +qpdf: processing 069-kfo.pdf
  71 +qpdf: processing 070-kfo.pdf
  72 +qpdf: processing 071-kfo.pdf
  73 +qpdf: processing 072-kfo.pdf
  74 +qpdf: processing 073-kfo.pdf
  75 +qpdf: processing 074-kfo.pdf
  76 +qpdf: processing 075-kfo.pdf
  77 +qpdf: processing 076-kfo.pdf
  78 +qpdf: processing 077-kfo.pdf
  79 +qpdf: processing 078-kfo.pdf
  80 +qpdf: processing 079-kfo.pdf
  81 +qpdf: processing 080-kfo.pdf
  82 +qpdf: processing 081-kfo.pdf
  83 +qpdf: processing 082-kfo.pdf
  84 +qpdf: processing 083-kfo.pdf
  85 +qpdf: processing 084-kfo.pdf
  86 +qpdf: processing 085-kfo.pdf
  87 +qpdf: processing 086-kfo.pdf
  88 +qpdf: processing 087-kfo.pdf
  89 +qpdf: processing 088-kfo.pdf
  90 +qpdf: processing 089-kfo.pdf
  91 +qpdf: processing 090-kfo.pdf
  92 +qpdf: processing 091-kfo.pdf
  93 +qpdf: processing 092-kfo.pdf
  94 +qpdf: processing 093-kfo.pdf
  95 +qpdf: processing 094-kfo.pdf
  96 +qpdf: processing 095-kfo.pdf
  97 +qpdf: processing 096-kfo.pdf
  98 +qpdf: processing 097-kfo.pdf
  99 +qpdf: processing 098-kfo.pdf
  100 +qpdf: processing 099-kfo.pdf
  101 +qpdf: processing 100-kfo.pdf
  102 +qpdf: processing 101-kfo.pdf
  103 +qpdf: processing 102-kfo.pdf
  104 +qpdf: processing 103-kfo.pdf
  105 +qpdf: processing 104-kfo.pdf
  106 +qpdf: processing 105-kfo.pdf
  107 +qpdf: processing 106-kfo.pdf
  108 +qpdf: processing 107-kfo.pdf
  109 +qpdf: processing 108-kfo.pdf
  110 +qpdf: processing 109-kfo.pdf
  111 +qpdf: processing 110-kfo.pdf
  112 +qpdf: processing 111-kfo.pdf
  113 +qpdf: processing 112-kfo.pdf
  114 +qpdf: processing 113-kfo.pdf
  115 +qpdf: processing 114-kfo.pdf
  116 +qpdf: processing 115-kfo.pdf
  117 +qpdf: processing 116-kfo.pdf
  118 +qpdf: processing 117-kfo.pdf
  119 +qpdf: processing 118-kfo.pdf
  120 +qpdf: processing 119-kfo.pdf
  121 +qpdf: processing 120-kfo.pdf
  122 +qpdf: processing 121-kfo.pdf
  123 +qpdf: processing 122-kfo.pdf
  124 +qpdf: processing 123-kfo.pdf
  125 +qpdf: processing 124-kfo.pdf
  126 +qpdf: processing 125-kfo.pdf
  127 +qpdf: processing 126-kfo.pdf
  128 +qpdf: processing 127-kfo.pdf
  129 +qpdf: processing 128-kfo.pdf
  130 +qpdf: processing 129-kfo.pdf
  131 +qpdf: processing 130-kfo.pdf
  132 +qpdf: processing 131-kfo.pdf
  133 +qpdf: processing 132-kfo.pdf
  134 +qpdf: processing 133-kfo.pdf
  135 +qpdf: processing 134-kfo.pdf
  136 +qpdf: processing 135-kfo.pdf
  137 +qpdf: processing 136-kfo.pdf
  138 +qpdf: processing 137-kfo.pdf
  139 +qpdf: processing 138-kfo.pdf
  140 +qpdf: processing 139-kfo.pdf
  141 +qpdf: processing 140-kfo.pdf
  142 +qpdf: processing 141-kfo.pdf
  143 +qpdf: processing 142-kfo.pdf
  144 +qpdf: processing 143-kfo.pdf
  145 +qpdf: processing 144-kfo.pdf
  146 +qpdf: processing 145-kfo.pdf
  147 +qpdf: processing 146-kfo.pdf
  148 +qpdf: processing 147-kfo.pdf
  149 +qpdf: processing 148-kfo.pdf
  150 +qpdf: processing 149-kfo.pdf
  151 +qpdf: processing 150-kfo.pdf
  152 +qpdf: processing 151-kfo.pdf
  153 +qpdf: processing 152-kfo.pdf
  154 +qpdf: processing 153-kfo.pdf
  155 +qpdf: processing 154-kfo.pdf
  156 +qpdf: processing 155-kfo.pdf
  157 +qpdf: processing 156-kfo.pdf
  158 +qpdf: processing 157-kfo.pdf
  159 +qpdf: processing 158-kfo.pdf
  160 +qpdf: processing 159-kfo.pdf
  161 +qpdf: processing 160-kfo.pdf
  162 +qpdf: processing 161-kfo.pdf
  163 +qpdf: processing 162-kfo.pdf
  164 +qpdf: processing 163-kfo.pdf
  165 +qpdf: processing 164-kfo.pdf
  166 +qpdf: processing 165-kfo.pdf
  167 +qpdf: processing 166-kfo.pdf
  168 +qpdf: processing 167-kfo.pdf
  169 +qpdf: processing 168-kfo.pdf
  170 +qpdf: processing 169-kfo.pdf
  171 +qpdf: processing 170-kfo.pdf
  172 +qpdf: processing 171-kfo.pdf
  173 +qpdf: processing 172-kfo.pdf
  174 +qpdf: processing 173-kfo.pdf
  175 +qpdf: processing 174-kfo.pdf
  176 +qpdf: processing 175-kfo.pdf
  177 +qpdf: processing 176-kfo.pdf
  178 +qpdf: processing 177-kfo.pdf
  179 +qpdf: processing 178-kfo.pdf
  180 +qpdf: processing 179-kfo.pdf
  181 +qpdf: processing 180-kfo.pdf
  182 +qpdf: processing 181-kfo.pdf
  183 +qpdf: processing 182-kfo.pdf
  184 +qpdf: processing 183-kfo.pdf
  185 +qpdf: processing 184-kfo.pdf
  186 +qpdf: processing 185-kfo.pdf
  187 +qpdf: processing 186-kfo.pdf
  188 +qpdf: processing 187-kfo.pdf
  189 +qpdf: processing 188-kfo.pdf
  190 +qpdf: processing 189-kfo.pdf
  191 +qpdf: processing 190-kfo.pdf
  192 +qpdf: processing 191-kfo.pdf
  193 +qpdf: processing 192-kfo.pdf
  194 +qpdf: processing 193-kfo.pdf
  195 +qpdf: processing 194-kfo.pdf
  196 +qpdf: processing 195-kfo.pdf
  197 +qpdf: processing 196-kfo.pdf
  198 +qpdf: processing 197-kfo.pdf
  199 +qpdf: processing 198-kfo.pdf
  200 +qpdf: processing 199-kfo.pdf
  201 +qpdf: processing 200-kfo.pdf
  202 +qpdf: processing 201-kfo.pdf
  203 +qpdf: removing unreferenced pages from primary input
  204 +qpdf: adding pages from 001-kfo.pdf
  205 +qpdf: adding pages from 002-kfo.pdf
  206 +qpdf: adding pages from 003-kfo.pdf
  207 +qpdf: adding pages from 004-kfo.pdf
  208 +qpdf: adding pages from 005-kfo.pdf
  209 +qpdf: adding pages from 006-kfo.pdf
  210 +qpdf: adding pages from 007-kfo.pdf
  211 +qpdf: adding pages from 008-kfo.pdf
  212 +qpdf: adding pages from 009-kfo.pdf
  213 +qpdf: adding pages from 010-kfo.pdf
  214 +qpdf: adding pages from 011-kfo.pdf
  215 +qpdf: adding pages from 012-kfo.pdf
  216 +qpdf: adding pages from 013-kfo.pdf
  217 +qpdf: adding pages from 014-kfo.pdf
  218 +qpdf: adding pages from 015-kfo.pdf
  219 +qpdf: adding pages from 016-kfo.pdf
  220 +qpdf: adding pages from 017-kfo.pdf
  221 +qpdf: adding pages from 018-kfo.pdf
  222 +qpdf: adding pages from 019-kfo.pdf
  223 +qpdf: adding pages from 020-kfo.pdf
  224 +qpdf: adding pages from 021-kfo.pdf
  225 +qpdf: adding pages from 022-kfo.pdf
  226 +qpdf: adding pages from 023-kfo.pdf
  227 +qpdf: adding pages from 024-kfo.pdf
  228 +qpdf: adding pages from 025-kfo.pdf
  229 +qpdf: adding pages from 026-kfo.pdf
  230 +qpdf: adding pages from 027-kfo.pdf
  231 +qpdf: adding pages from 028-kfo.pdf
  232 +qpdf: adding pages from 029-kfo.pdf
  233 +qpdf: adding pages from 030-kfo.pdf
  234 +qpdf: adding pages from 031-kfo.pdf
  235 +qpdf: adding pages from 032-kfo.pdf
  236 +qpdf: adding pages from 033-kfo.pdf
  237 +qpdf: adding pages from 034-kfo.pdf
  238 +qpdf: adding pages from 035-kfo.pdf
  239 +qpdf: adding pages from 036-kfo.pdf
  240 +qpdf: adding pages from 037-kfo.pdf
  241 +qpdf: adding pages from 038-kfo.pdf
  242 +qpdf: adding pages from 039-kfo.pdf
  243 +qpdf: adding pages from 040-kfo.pdf
  244 +qpdf: adding pages from 041-kfo.pdf
  245 +qpdf: adding pages from 042-kfo.pdf
  246 +qpdf: adding pages from 043-kfo.pdf
  247 +qpdf: adding pages from 044-kfo.pdf
  248 +qpdf: adding pages from 045-kfo.pdf
  249 +qpdf: adding pages from 046-kfo.pdf
  250 +qpdf: adding pages from 047-kfo.pdf
  251 +qpdf: adding pages from 048-kfo.pdf
  252 +qpdf: adding pages from 049-kfo.pdf
  253 +qpdf: adding pages from 050-kfo.pdf
  254 +qpdf: adding pages from 051-kfo.pdf
  255 +qpdf: adding pages from 052-kfo.pdf
  256 +qpdf: adding pages from 053-kfo.pdf
  257 +qpdf: adding pages from 054-kfo.pdf
  258 +qpdf: adding pages from 055-kfo.pdf
  259 +qpdf: adding pages from 056-kfo.pdf
  260 +qpdf: adding pages from 057-kfo.pdf
  261 +qpdf: adding pages from 058-kfo.pdf
  262 +qpdf: adding pages from 059-kfo.pdf
  263 +qpdf: adding pages from 060-kfo.pdf
  264 +qpdf: adding pages from 061-kfo.pdf
  265 +qpdf: adding pages from 062-kfo.pdf
  266 +qpdf: adding pages from 063-kfo.pdf
  267 +qpdf: adding pages from 064-kfo.pdf
  268 +qpdf: adding pages from 065-kfo.pdf
  269 +qpdf: adding pages from 066-kfo.pdf
  270 +qpdf: adding pages from 067-kfo.pdf
  271 +qpdf: adding pages from 068-kfo.pdf
  272 +qpdf: adding pages from 069-kfo.pdf
  273 +qpdf: adding pages from 070-kfo.pdf
  274 +qpdf: adding pages from 071-kfo.pdf
  275 +qpdf: adding pages from 072-kfo.pdf
  276 +qpdf: adding pages from 073-kfo.pdf
  277 +qpdf: adding pages from 074-kfo.pdf
  278 +qpdf: adding pages from 075-kfo.pdf
  279 +qpdf: adding pages from 076-kfo.pdf
  280 +qpdf: adding pages from 077-kfo.pdf
  281 +qpdf: adding pages from 078-kfo.pdf
  282 +qpdf: adding pages from 079-kfo.pdf
  283 +qpdf: adding pages from 080-kfo.pdf
  284 +qpdf: adding pages from 081-kfo.pdf
  285 +qpdf: adding pages from 082-kfo.pdf
  286 +qpdf: adding pages from 083-kfo.pdf
  287 +qpdf: adding pages from 084-kfo.pdf
  288 +qpdf: adding pages from 085-kfo.pdf
  289 +qpdf: adding pages from 086-kfo.pdf
  290 +qpdf: adding pages from 087-kfo.pdf
  291 +qpdf: adding pages from 088-kfo.pdf
  292 +qpdf: adding pages from 089-kfo.pdf
  293 +qpdf: adding pages from 090-kfo.pdf
  294 +qpdf: adding pages from 091-kfo.pdf
  295 +qpdf: adding pages from 092-kfo.pdf
  296 +qpdf: adding pages from 093-kfo.pdf
  297 +qpdf: adding pages from 094-kfo.pdf
  298 +qpdf: adding pages from 095-kfo.pdf
  299 +qpdf: adding pages from 096-kfo.pdf
  300 +qpdf: adding pages from 097-kfo.pdf
  301 +qpdf: adding pages from 098-kfo.pdf
  302 +qpdf: adding pages from 099-kfo.pdf
  303 +qpdf: adding pages from 100-kfo.pdf
  304 +qpdf: adding pages from 101-kfo.pdf
  305 +qpdf: adding pages from 102-kfo.pdf
  306 +qpdf: adding pages from 103-kfo.pdf
  307 +qpdf: adding pages from 104-kfo.pdf
  308 +qpdf: adding pages from 105-kfo.pdf
  309 +qpdf: adding pages from 106-kfo.pdf
  310 +qpdf: adding pages from 107-kfo.pdf
  311 +qpdf: adding pages from 108-kfo.pdf
  312 +qpdf: adding pages from 109-kfo.pdf
  313 +qpdf: adding pages from 110-kfo.pdf
  314 +qpdf: adding pages from 111-kfo.pdf
  315 +qpdf: adding pages from 112-kfo.pdf
  316 +qpdf: adding pages from 113-kfo.pdf
  317 +qpdf: adding pages from 114-kfo.pdf
  318 +qpdf: adding pages from 115-kfo.pdf
  319 +qpdf: adding pages from 116-kfo.pdf
  320 +qpdf: adding pages from 117-kfo.pdf
  321 +qpdf: adding pages from 118-kfo.pdf
  322 +qpdf: adding pages from 119-kfo.pdf
  323 +qpdf: adding pages from 120-kfo.pdf
  324 +qpdf: adding pages from 121-kfo.pdf
  325 +qpdf: adding pages from 122-kfo.pdf
  326 +qpdf: adding pages from 123-kfo.pdf
  327 +qpdf: adding pages from 124-kfo.pdf
  328 +qpdf: adding pages from 125-kfo.pdf
  329 +qpdf: adding pages from 126-kfo.pdf
  330 +qpdf: adding pages from 127-kfo.pdf
  331 +qpdf: adding pages from 128-kfo.pdf
  332 +qpdf: adding pages from 129-kfo.pdf
  333 +qpdf: adding pages from 130-kfo.pdf
  334 +qpdf: adding pages from 131-kfo.pdf
  335 +qpdf: adding pages from 132-kfo.pdf
  336 +qpdf: adding pages from 133-kfo.pdf
  337 +qpdf: adding pages from 134-kfo.pdf
  338 +qpdf: adding pages from 135-kfo.pdf
  339 +qpdf: adding pages from 136-kfo.pdf
  340 +qpdf: adding pages from 137-kfo.pdf
  341 +qpdf: adding pages from 138-kfo.pdf
  342 +qpdf: adding pages from 139-kfo.pdf
  343 +qpdf: adding pages from 140-kfo.pdf
  344 +qpdf: adding pages from 141-kfo.pdf
  345 +qpdf: adding pages from 142-kfo.pdf
  346 +qpdf: adding pages from 143-kfo.pdf
  347 +qpdf: adding pages from 144-kfo.pdf
  348 +qpdf: adding pages from 145-kfo.pdf
  349 +qpdf: adding pages from 146-kfo.pdf
  350 +qpdf: adding pages from 147-kfo.pdf
  351 +qpdf: adding pages from 148-kfo.pdf
  352 +qpdf: adding pages from 149-kfo.pdf
  353 +qpdf: adding pages from 150-kfo.pdf
  354 +qpdf: adding pages from 151-kfo.pdf
  355 +qpdf: adding pages from 152-kfo.pdf
  356 +qpdf: adding pages from 153-kfo.pdf
  357 +qpdf: adding pages from 154-kfo.pdf
  358 +qpdf: adding pages from 155-kfo.pdf
  359 +qpdf: adding pages from 156-kfo.pdf
  360 +qpdf: adding pages from 157-kfo.pdf
  361 +qpdf: adding pages from 158-kfo.pdf
  362 +qpdf: adding pages from 159-kfo.pdf
  363 +qpdf: adding pages from 160-kfo.pdf
  364 +qpdf: adding pages from 161-kfo.pdf
  365 +qpdf: adding pages from 162-kfo.pdf
  366 +qpdf: adding pages from 163-kfo.pdf
  367 +qpdf: adding pages from 164-kfo.pdf
  368 +qpdf: adding pages from 165-kfo.pdf
  369 +qpdf: adding pages from 166-kfo.pdf
  370 +qpdf: adding pages from 167-kfo.pdf
  371 +qpdf: adding pages from 168-kfo.pdf
  372 +qpdf: adding pages from 169-kfo.pdf
  373 +qpdf: adding pages from 170-kfo.pdf
  374 +qpdf: adding pages from 171-kfo.pdf
  375 +qpdf: adding pages from 172-kfo.pdf
  376 +qpdf: adding pages from 173-kfo.pdf
  377 +qpdf: adding pages from 174-kfo.pdf
  378 +qpdf: adding pages from 175-kfo.pdf
  379 +qpdf: adding pages from 176-kfo.pdf
  380 +qpdf: adding pages from 177-kfo.pdf
  381 +qpdf: adding pages from 178-kfo.pdf
  382 +qpdf: adding pages from 179-kfo.pdf
  383 +qpdf: adding pages from 180-kfo.pdf
  384 +qpdf: adding pages from 181-kfo.pdf
  385 +qpdf: adding pages from 182-kfo.pdf
  386 +qpdf: adding pages from 183-kfo.pdf
  387 +qpdf: adding pages from 184-kfo.pdf
  388 +qpdf: adding pages from 185-kfo.pdf
  389 +qpdf: adding pages from 186-kfo.pdf
  390 +qpdf: adding pages from 187-kfo.pdf
  391 +qpdf: adding pages from 188-kfo.pdf
  392 +qpdf: adding pages from 189-kfo.pdf
  393 +qpdf: adding pages from 190-kfo.pdf
  394 +qpdf: adding pages from 191-kfo.pdf
  395 +qpdf: adding pages from 192-kfo.pdf
  396 +qpdf: adding pages from 193-kfo.pdf
  397 +qpdf: adding pages from 194-kfo.pdf
  398 +qpdf: adding pages from 195-kfo.pdf
  399 +qpdf: adding pages from 196-kfo.pdf
  400 +qpdf: adding pages from 197-kfo.pdf
  401 +qpdf: adding pages from 198-kfo.pdf
  402 +qpdf: adding pages from 199-kfo.pdf
  403 +qpdf: adding pages from 200-kfo.pdf
  404 +qpdf: adding pages from 201-kfo.pdf
  405 +qpdf: wrote file a.pdf
... ...
qpdf/qtest/qpdf/enable-kfo.out 0 → 100644
  1 +qpdf: selecting --keep-open-files=y
  2 +qpdf: processing 100-kfo.pdf
  3 +qpdf: processing 101-kfo.pdf
  4 +qpdf: processing 102-kfo.pdf
  5 +qpdf: processing 103-kfo.pdf
  6 +qpdf: processing 104-kfo.pdf
  7 +qpdf: processing 105-kfo.pdf
  8 +qpdf: processing 106-kfo.pdf
  9 +qpdf: processing 107-kfo.pdf
  10 +qpdf: processing 108-kfo.pdf
  11 +qpdf: processing 109-kfo.pdf
  12 +qpdf: processing 110-kfo.pdf
  13 +qpdf: processing 111-kfo.pdf
  14 +qpdf: processing 112-kfo.pdf
  15 +qpdf: processing 113-kfo.pdf
  16 +qpdf: processing 114-kfo.pdf
  17 +qpdf: processing 115-kfo.pdf
  18 +qpdf: processing 116-kfo.pdf
  19 +qpdf: processing 117-kfo.pdf
  20 +qpdf: processing 118-kfo.pdf
  21 +qpdf: processing 119-kfo.pdf
  22 +qpdf: processing 120-kfo.pdf
  23 +qpdf: processing 121-kfo.pdf
  24 +qpdf: processing 122-kfo.pdf
  25 +qpdf: processing 123-kfo.pdf
  26 +qpdf: processing 124-kfo.pdf
  27 +qpdf: processing 125-kfo.pdf
  28 +qpdf: processing 126-kfo.pdf
  29 +qpdf: processing 127-kfo.pdf
  30 +qpdf: processing 128-kfo.pdf
  31 +qpdf: processing 129-kfo.pdf
  32 +qpdf: processing 130-kfo.pdf
  33 +qpdf: processing 131-kfo.pdf
  34 +qpdf: processing 132-kfo.pdf
  35 +qpdf: processing 133-kfo.pdf
  36 +qpdf: processing 134-kfo.pdf
  37 +qpdf: processing 135-kfo.pdf
  38 +qpdf: processing 136-kfo.pdf
  39 +qpdf: processing 137-kfo.pdf
  40 +qpdf: processing 138-kfo.pdf
  41 +qpdf: processing 139-kfo.pdf
  42 +qpdf: processing 140-kfo.pdf
  43 +qpdf: processing 141-kfo.pdf
  44 +qpdf: processing 142-kfo.pdf
  45 +qpdf: processing 143-kfo.pdf
  46 +qpdf: processing 144-kfo.pdf
  47 +qpdf: processing 145-kfo.pdf
  48 +qpdf: processing 146-kfo.pdf
  49 +qpdf: processing 147-kfo.pdf
  50 +qpdf: processing 148-kfo.pdf
  51 +qpdf: processing 149-kfo.pdf
  52 +qpdf: processing 150-kfo.pdf
  53 +qpdf: processing 151-kfo.pdf
  54 +qpdf: processing 152-kfo.pdf
  55 +qpdf: processing 153-kfo.pdf
  56 +qpdf: processing 154-kfo.pdf
  57 +qpdf: processing 155-kfo.pdf
  58 +qpdf: processing 156-kfo.pdf
  59 +qpdf: processing 157-kfo.pdf
  60 +qpdf: processing 158-kfo.pdf
  61 +qpdf: processing 159-kfo.pdf
  62 +qpdf: processing 160-kfo.pdf
  63 +qpdf: processing 161-kfo.pdf
  64 +qpdf: processing 162-kfo.pdf
  65 +qpdf: processing 163-kfo.pdf
  66 +qpdf: processing 164-kfo.pdf
  67 +qpdf: processing 165-kfo.pdf
  68 +qpdf: processing 166-kfo.pdf
  69 +qpdf: processing 167-kfo.pdf
  70 +qpdf: processing 168-kfo.pdf
  71 +qpdf: processing 169-kfo.pdf
  72 +qpdf: processing 170-kfo.pdf
  73 +qpdf: processing 171-kfo.pdf
  74 +qpdf: processing 172-kfo.pdf
  75 +qpdf: processing 173-kfo.pdf
  76 +qpdf: processing 174-kfo.pdf
  77 +qpdf: processing 175-kfo.pdf
  78 +qpdf: processing 176-kfo.pdf
  79 +qpdf: processing 177-kfo.pdf
  80 +qpdf: processing 178-kfo.pdf
  81 +qpdf: processing 179-kfo.pdf
  82 +qpdf: processing 180-kfo.pdf
  83 +qpdf: processing 181-kfo.pdf
  84 +qpdf: processing 182-kfo.pdf
  85 +qpdf: processing 183-kfo.pdf
  86 +qpdf: processing 184-kfo.pdf
  87 +qpdf: processing 185-kfo.pdf
  88 +qpdf: processing 186-kfo.pdf
  89 +qpdf: processing 187-kfo.pdf
  90 +qpdf: processing 188-kfo.pdf
  91 +qpdf: processing 189-kfo.pdf
  92 +qpdf: processing 190-kfo.pdf
  93 +qpdf: processing 191-kfo.pdf
  94 +qpdf: processing 192-kfo.pdf
  95 +qpdf: processing 193-kfo.pdf
  96 +qpdf: processing 194-kfo.pdf
  97 +qpdf: processing 195-kfo.pdf
  98 +qpdf: processing 196-kfo.pdf
  99 +qpdf: processing 197-kfo.pdf
  100 +qpdf: processing 198-kfo.pdf
  101 +qpdf: processing 199-kfo.pdf
  102 +qpdf: removing unreferenced pages from primary input
  103 +qpdf: adding pages from 100-kfo.pdf
  104 +qpdf: adding pages from 101-kfo.pdf
  105 +qpdf: adding pages from 102-kfo.pdf
  106 +qpdf: adding pages from 103-kfo.pdf
  107 +qpdf: adding pages from 104-kfo.pdf
  108 +qpdf: adding pages from 105-kfo.pdf
  109 +qpdf: adding pages from 106-kfo.pdf
  110 +qpdf: adding pages from 107-kfo.pdf
  111 +qpdf: adding pages from 108-kfo.pdf
  112 +qpdf: adding pages from 109-kfo.pdf
  113 +qpdf: adding pages from 110-kfo.pdf
  114 +qpdf: adding pages from 111-kfo.pdf
  115 +qpdf: adding pages from 112-kfo.pdf
  116 +qpdf: adding pages from 113-kfo.pdf
  117 +qpdf: adding pages from 114-kfo.pdf
  118 +qpdf: adding pages from 115-kfo.pdf
  119 +qpdf: adding pages from 116-kfo.pdf
  120 +qpdf: adding pages from 117-kfo.pdf
  121 +qpdf: adding pages from 118-kfo.pdf
  122 +qpdf: adding pages from 119-kfo.pdf
  123 +qpdf: adding pages from 120-kfo.pdf
  124 +qpdf: adding pages from 121-kfo.pdf
  125 +qpdf: adding pages from 122-kfo.pdf
  126 +qpdf: adding pages from 123-kfo.pdf
  127 +qpdf: adding pages from 124-kfo.pdf
  128 +qpdf: adding pages from 125-kfo.pdf
  129 +qpdf: adding pages from 126-kfo.pdf
  130 +qpdf: adding pages from 127-kfo.pdf
  131 +qpdf: adding pages from 128-kfo.pdf
  132 +qpdf: adding pages from 129-kfo.pdf
  133 +qpdf: adding pages from 130-kfo.pdf
  134 +qpdf: adding pages from 131-kfo.pdf
  135 +qpdf: adding pages from 132-kfo.pdf
  136 +qpdf: adding pages from 133-kfo.pdf
  137 +qpdf: adding pages from 134-kfo.pdf
  138 +qpdf: adding pages from 135-kfo.pdf
  139 +qpdf: adding pages from 136-kfo.pdf
  140 +qpdf: adding pages from 137-kfo.pdf
  141 +qpdf: adding pages from 138-kfo.pdf
  142 +qpdf: adding pages from 139-kfo.pdf
  143 +qpdf: adding pages from 140-kfo.pdf
  144 +qpdf: adding pages from 141-kfo.pdf
  145 +qpdf: adding pages from 142-kfo.pdf
  146 +qpdf: adding pages from 143-kfo.pdf
  147 +qpdf: adding pages from 144-kfo.pdf
  148 +qpdf: adding pages from 145-kfo.pdf
  149 +qpdf: adding pages from 146-kfo.pdf
  150 +qpdf: adding pages from 147-kfo.pdf
  151 +qpdf: adding pages from 148-kfo.pdf
  152 +qpdf: adding pages from 149-kfo.pdf
  153 +qpdf: adding pages from 150-kfo.pdf
  154 +qpdf: adding pages from 151-kfo.pdf
  155 +qpdf: adding pages from 152-kfo.pdf
  156 +qpdf: adding pages from 153-kfo.pdf
  157 +qpdf: adding pages from 154-kfo.pdf
  158 +qpdf: adding pages from 155-kfo.pdf
  159 +qpdf: adding pages from 156-kfo.pdf
  160 +qpdf: adding pages from 157-kfo.pdf
  161 +qpdf: adding pages from 158-kfo.pdf
  162 +qpdf: adding pages from 159-kfo.pdf
  163 +qpdf: adding pages from 160-kfo.pdf
  164 +qpdf: adding pages from 161-kfo.pdf
  165 +qpdf: adding pages from 162-kfo.pdf
  166 +qpdf: adding pages from 163-kfo.pdf
  167 +qpdf: adding pages from 164-kfo.pdf
  168 +qpdf: adding pages from 165-kfo.pdf
  169 +qpdf: adding pages from 166-kfo.pdf
  170 +qpdf: adding pages from 167-kfo.pdf
  171 +qpdf: adding pages from 168-kfo.pdf
  172 +qpdf: adding pages from 169-kfo.pdf
  173 +qpdf: adding pages from 170-kfo.pdf
  174 +qpdf: adding pages from 171-kfo.pdf
  175 +qpdf: adding pages from 172-kfo.pdf
  176 +qpdf: adding pages from 173-kfo.pdf
  177 +qpdf: adding pages from 174-kfo.pdf
  178 +qpdf: adding pages from 175-kfo.pdf
  179 +qpdf: adding pages from 176-kfo.pdf
  180 +qpdf: adding pages from 177-kfo.pdf
  181 +qpdf: adding pages from 178-kfo.pdf
  182 +qpdf: adding pages from 179-kfo.pdf
  183 +qpdf: adding pages from 180-kfo.pdf
  184 +qpdf: adding pages from 181-kfo.pdf
  185 +qpdf: adding pages from 182-kfo.pdf
  186 +qpdf: adding pages from 183-kfo.pdf
  187 +qpdf: adding pages from 184-kfo.pdf
  188 +qpdf: adding pages from 185-kfo.pdf
  189 +qpdf: adding pages from 186-kfo.pdf
  190 +qpdf: adding pages from 187-kfo.pdf
  191 +qpdf: adding pages from 188-kfo.pdf
  192 +qpdf: adding pages from 189-kfo.pdf
  193 +qpdf: adding pages from 190-kfo.pdf
  194 +qpdf: adding pages from 191-kfo.pdf
  195 +qpdf: adding pages from 192-kfo.pdf
  196 +qpdf: adding pages from 193-kfo.pdf
  197 +qpdf: adding pages from 194-kfo.pdf
  198 +qpdf: adding pages from 195-kfo.pdf
  199 +qpdf: adding pages from 196-kfo.pdf
  200 +qpdf: adding pages from 197-kfo.pdf
  201 +qpdf: adding pages from 198-kfo.pdf
  202 +qpdf: adding pages from 199-kfo.pdf
  203 +qpdf: wrote file a.pdf
... ...
qpdf/qtest/qpdf/kfo-n.out 0 → 100644
  1 +qpdf: processing 001-kfo.pdf
  2 +qpdf: processing 002-kfo.pdf
  3 +qpdf: processing 003-kfo.pdf
  4 +qpdf: processing 004-kfo.pdf
  5 +qpdf: processing 005-kfo.pdf
  6 +qpdf: processing 006-kfo.pdf
  7 +qpdf: processing 007-kfo.pdf
  8 +qpdf: processing 008-kfo.pdf
  9 +qpdf: processing 009-kfo.pdf
  10 +qpdf: removing unreferenced pages from primary input
  11 +qpdf: adding pages from 001-kfo.pdf
  12 +qpdf: adding pages from 002-kfo.pdf
  13 +qpdf: adding pages from 003-kfo.pdf
  14 +qpdf: adding pages from 004-kfo.pdf
  15 +qpdf: adding pages from 005-kfo.pdf
  16 +qpdf: adding pages from 006-kfo.pdf
  17 +qpdf: adding pages from 007-kfo.pdf
  18 +qpdf: adding pages from 008-kfo.pdf
  19 +qpdf: adding pages from 009-kfo.pdf
  20 +qpdf: wrote file a.pdf
... ...
qpdf/qtest/qpdf/kfo-y.out 0 → 100644
  1 +qpdf: processing 001-kfo.pdf
  2 +qpdf: processing 002-kfo.pdf
  3 +qpdf: processing 003-kfo.pdf
  4 +qpdf: processing 004-kfo.pdf
  5 +qpdf: processing 005-kfo.pdf
  6 +qpdf: processing 006-kfo.pdf
  7 +qpdf: processing 007-kfo.pdf
  8 +qpdf: processing 008-kfo.pdf
  9 +qpdf: processing 009-kfo.pdf
  10 +qpdf: removing unreferenced pages from primary input
  11 +qpdf: adding pages from 001-kfo.pdf
  12 +qpdf: adding pages from 002-kfo.pdf
  13 +qpdf: adding pages from 003-kfo.pdf
  14 +qpdf: adding pages from 004-kfo.pdf
  15 +qpdf: adding pages from 005-kfo.pdf
  16 +qpdf: adding pages from 006-kfo.pdf
  17 +qpdf: adding pages from 007-kfo.pdf
  18 +qpdf: adding pages from 008-kfo.pdf
  19 +qpdf: adding pages from 009-kfo.pdf
  20 +qpdf: wrote file a.pdf
... ...
qpdf/qtest/qpdf/verbose-merge.out
  1 +qpdf: selecting --keep-open-files=y
1 2 qpdf: processing 20-pages.pdf
2 3 qpdf: processing ./20-pages.pdf
3 4 qpdf: processing minimal.pdf
... ...