Commit e50d5201dfce53158ba811865e99654054f0c872

Authored by Jay Berkenbilt
1 parent 011695df

Add --keep-files-open-threshold (fixes #288)

ChangeLog
1 1 2019-04-20 Jay Berkenbilt <ejb@ql.org>
2 2  
  3 + * Add parameter --keep-files-open-threshold to override the
  4 + maximum number of files that qpdf will allow to be kept open at
  5 + once. Fixes #288.
  6 +
3 7 * Handle Unicode characters in filenames. The changes to support
4 8 Unicode on the CLI in Windows broke Unicode filenames. Fixes #298.
5 9  
... ...
manual/qpdf-manual.xml
... ... @@ -652,6 +652,19 @@ make
652 652 more than the OS limit's number of files from a script and are
653 653 not worried about a few seconds additional processing time,
654 654 you may want to specify <option>--keep-files-open=n</option>.
  655 + The threshold for switching may be changed from the default
  656 + 200 with the <option>--keep-files-open-threshold</option>
  657 + option.
  658 + </para>
  659 + </listitem>
  660 + </varlistentry>
  661 + <varlistentry>
  662 + <term><option>--keep-files-open-threshold=<replaceable>count</replaceable></option></term>
  663 + <listitem>
  664 + <para>
  665 + If specified, overrides the default value of 200 used as the
  666 + threshold for qpdf deciding whether or not to keep files open.
  667 + See <option>--keep-files-open</option> for details.
655 668 </para>
656 669 </listitem>
657 670 </varlistentry>
... ...
qpdf/qpdf.cc
... ... @@ -134,6 +134,7 @@ struct Options
134 134 preserve_unreferenced_page_resources(false),
135 135 keep_files_open(true),
136 136 keep_files_open_set(false),
  137 + keep_files_open_threshold(200), // default known in help and docs
137 138 newline_before_endstream(false),
138 139 coalesce_contents(false),
139 140 flatten_annotations(false),
... ... @@ -225,6 +226,7 @@ struct Options
225 226 bool preserve_unreferenced_page_resources;
226 227 bool keep_files_open;
227 228 bool keep_files_open_set;
  229 + size_t keep_files_open_threshold;
228 230 bool newline_before_endstream;
229 231 std::string linearize_pass1;
230 232 bool coalesce_contents;
... ... @@ -634,6 +636,7 @@ class ArgParser
634 636 void argPreserveUnreferenced();
635 637 void argPreserveUnreferencedResources();
636 638 void argKeepFilesOpen(char* parameter);
  639 + void argKeepFilesOpenThreshold(char* parameter);
637 640 void argNewlineBeforeEndstream();
638 641 void argLinearizePass1(char* parameter);
639 642 void argCoalesceContents();
... ... @@ -857,6 +860,8 @@ ArgParser::initOptionTable()
857 860 &ArgParser::argPreserveUnreferencedResources);
858 861 (*t)["keep-files-open"] = oe_requiredChoices(
859 862 &ArgParser::argKeepFilesOpen, yn);
  863 + (*t)["keep-files-open-threshold"] = oe_requiredParameter(
  864 + &ArgParser::argKeepFilesOpenThreshold, "count");
860 865 (*t)["newline-before-endstream"] = oe_bare(
861 866 &ArgParser::argNewlineBeforeEndstream);
862 867 (*t)["linearize-pass1"] = oe_requiredParameter(
... ... @@ -1209,6 +1214,7 @@ ArgParser::argHelp()
1209 1214 << "starting point, but its pages are replaced with pages as specified.\n"
1210 1215 << "\n"
1211 1216 << "--keep-files-open=[yn]\n"
  1217 + << "--keep-files-threshold=count\n"
1212 1218 << "--pages file [ --password=password ] [ page-range ] ... --\n"
1213 1219 << "\n"
1214 1220 << "For each file that pages should be taken from, specify the file, a\n"
... ... @@ -1227,7 +1233,8 @@ ArgParser::argHelp()
1227 1233 << "files will be kept open at the same time. This behavior can be overridden\n"
1228 1234 << "by specifying --keep-files-open=[yn]. Closing and opening files can have\n"
1229 1235 << "very high overhead on certain file systems, especially networked file\n"
1230   - << "systems.\n"
  1236 + << "systems. The threshold of 200 can be modified with\n"
  1237 + << "--keep-files-open-threshold\n"
1231 1238 << "\n"
1232 1239 << "The page range is a set of numbers separated by commas, ranges of\n"
1233 1240 << "numbers separated dashes, or combinations of those. The character\n"
... ... @@ -1782,6 +1789,13 @@ ArgParser::argKeepFilesOpen(char* parameter)
1782 1789 }
1783 1790  
1784 1791 void
  1792 +ArgParser::argKeepFilesOpenThreshold(char* parameter)
  1793 +{
  1794 + o.keep_files_open_threshold =
  1795 + static_cast<size_t>(QUtil::string_to_int(parameter));
  1796 +}
  1797 +
  1798 +void
1785 1799 ArgParser::argNewlineBeforeEndstream()
1786 1800 {
1787 1801 o.newline_before_endstream = true;
... ... @@ -4352,9 +4366,7 @@ static void handle_page_specs(QPDF&amp; pdf, Options&amp; o)
4352 4366 PageSpec& page_spec = *iter;
4353 4367 filenames.insert(page_spec.filename);
4354 4368 }
4355   - // NOTE: The number 200 for this threshold is in the help
4356   - // message and manual and is baked into the test suite.
4357   - if (filenames.size() > 200)
  4369 + if (filenames.size() > o.keep_files_open_threshold)
4358 4370 {
4359 4371 QTC::TC("qpdf", "qpdf disable keep files open");
4360 4372 if (o.verbose)
... ...
qpdf/qtest/qpdf.test
... ... @@ -1685,7 +1685,7 @@ $n_tests += 4;
1685 1685 binmode F;
1686 1686 my $content = <F>;
1687 1687 close(F);
1688   - for (my $i = 1; $i <= 201; ++$i)
  1688 + for (my $i = 1; $i <= 51; ++$i)
1689 1689 {
1690 1690 open(F, sprintf(">%03d-kfo.pdf", $i)) or die;
1691 1691 binmode F;
... ... @@ -1693,16 +1693,17 @@ $n_tests += 4;
1693 1693 close(F);
1694 1694 }
1695 1695 }
1696   -$td->runtest("disable keep files open",
  1696 +$td->runtest("automatic disable keep files open",
1697 1697 {$td->COMMAND =>
1698 1698 "qpdf --verbose --static-id --empty" .
  1699 + " --keep-files-open-threshold=50" .
1699 1700 " --pages *kfo.pdf -- a.pdf"},
1700 1701 {$td->FILE => "disable-kfo.out", $td->EXIT_STATUS => 0},
1701 1702 $td->NORMALIZE_NEWLINES);
1702 1703 $td->runtest("don't disable keep files open",
1703 1704 {$td->COMMAND =>
1704 1705 "qpdf --verbose --static-id --empty" .
1705   - " --pages 11*kfo.pdf -- a.pdf"},
  1706 + " --pages 01*kfo.pdf -- a.pdf"},
1706 1707 {$td->FILE => "enable-kfo.out", $td->EXIT_STATUS => 0},
1707 1708 $td->NORMALIZE_NEWLINES);
1708 1709 $td->runtest("explict keep files open",
... ...
qpdf/qtest/qpdf/disable-kfo.out
... ... @@ -50,156 +50,6 @@ qpdf: processing 048-kfo.pdf
50 50 qpdf: processing 049-kfo.pdf
51 51 qpdf: processing 050-kfo.pdf
52 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 53 qpdf: removing unreferenced pages from primary input
204 54 qpdf: adding pages from 001-kfo.pdf
205 55 qpdf: adding pages from 002-kfo.pdf
... ... @@ -252,154 +102,4 @@ qpdf: adding pages from 048-kfo.pdf
252 102 qpdf: adding pages from 049-kfo.pdf
253 103 qpdf: adding pages from 050-kfo.pdf
254 104 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 105 qpdf: wrote file a.pdf
... ...
qpdf/qtest/qpdf/enable-kfo.out
1 1 qpdf: selecting --keep-open-files=y
2   -qpdf: processing 110-kfo.pdf
3   -qpdf: processing 111-kfo.pdf
4   -qpdf: processing 112-kfo.pdf
5   -qpdf: processing 113-kfo.pdf
6   -qpdf: processing 114-kfo.pdf
7   -qpdf: processing 115-kfo.pdf
8   -qpdf: processing 116-kfo.pdf
9   -qpdf: processing 117-kfo.pdf
10   -qpdf: processing 118-kfo.pdf
11   -qpdf: processing 119-kfo.pdf
  2 +qpdf: processing 010-kfo.pdf
  3 +qpdf: processing 011-kfo.pdf
  4 +qpdf: processing 012-kfo.pdf
  5 +qpdf: processing 013-kfo.pdf
  6 +qpdf: processing 014-kfo.pdf
  7 +qpdf: processing 015-kfo.pdf
  8 +qpdf: processing 016-kfo.pdf
  9 +qpdf: processing 017-kfo.pdf
  10 +qpdf: processing 018-kfo.pdf
  11 +qpdf: processing 019-kfo.pdf
12 12 qpdf: removing unreferenced pages from primary input
13   -qpdf: adding pages from 110-kfo.pdf
14   -qpdf: adding pages from 111-kfo.pdf
15   -qpdf: adding pages from 112-kfo.pdf
16   -qpdf: adding pages from 113-kfo.pdf
17   -qpdf: adding pages from 114-kfo.pdf
18   -qpdf: adding pages from 115-kfo.pdf
19   -qpdf: adding pages from 116-kfo.pdf
20   -qpdf: adding pages from 117-kfo.pdf
21   -qpdf: adding pages from 118-kfo.pdf
22   -qpdf: adding pages from 119-kfo.pdf
  13 +qpdf: adding pages from 010-kfo.pdf
  14 +qpdf: adding pages from 011-kfo.pdf
  15 +qpdf: adding pages from 012-kfo.pdf
  16 +qpdf: adding pages from 013-kfo.pdf
  17 +qpdf: adding pages from 014-kfo.pdf
  18 +qpdf: adding pages from 015-kfo.pdf
  19 +qpdf: adding pages from 016-kfo.pdf
  20 +qpdf: adding pages from 017-kfo.pdf
  21 +qpdf: adding pages from 018-kfo.pdf
  22 +qpdf: adding pages from 019-kfo.pdf
23 23 qpdf: wrote file a.pdf
... ...