diff --git a/ChangeLog b/ChangeLog index d7f9a37b..0d5a399a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2018-08-18 Jay Berkenbilt + + * Add new option --keep-files-open=[yn] to control whether qpdf + keeps files open when merging. Prior to version 8.1.0, qpdf always + kept all files open, but this meant that the number of files that + could be merged was limited by the operating system's open file + limit. Version 8.1.0 opened files as they were referenced, but + this caused a major performance impact. Version 8.2.0 optimized + the performance but did so in a way that, for local file systems, + there was a small but unavoidable performance hit, but for + networked file systems, the performance impact could be very high. + Starting with version 8.2.1, the default behavior is that files + are kept open if no more than 200 files are specified, but that + the behavior can be explicitly overridden with the + --keep-files-open flag. If you are merging more than 200 files but + less than the operating system's max open files limit, you may + want to use --keep-files-open=y. If you are using a local file + system where the overhead is low and you might sometimes merge + more than the OS limit's number of files, you may want to specify + --keep-files-open=n. Fixes #237. + 2018-08-16 Jay Berkenbilt * 8.2.0: release diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index f5365d19..19d46acc 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -95,6 +96,8 @@ struct Options qdf_mode(false), preserve_unreferenced_objects(false), preserve_unreferenced_page_resources(false), + keep_files_open(true), + keep_files_open_set(false), newline_before_endstream(false), coalesce_contents(false), show_npages(false), @@ -162,6 +165,8 @@ struct Options bool qdf_mode; bool preserve_unreferenced_objects; bool preserve_unreferenced_page_resources; + bool keep_files_open; + bool keep_files_open_set; bool newline_before_endstream; std::string linearize_pass1; bool coalesce_contents; @@ -384,6 +389,7 @@ These options allow pages to be selected from one or more PDF files.\n\ Whatever file is given as the primary input file is used as the\n\ starting point, but its pages are replaced with pages as specified.\n\ \n\ +--keep-files-open=[yn]\n\ --pages file [ --password=password ] [ page-range ] ... --\n\ \n\ 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\ primary input file. To discard this, use --empty as the primary\n\ input.\n\ \n\ +By default, when more than 200 distinct files are specified, qpdf will\n\ +close each file when not being referenced. With 200 files or fewer, all\n\ +files will be kept open at the same time. This behavior can be overridden\n\ +by specifying --keep-files-open=[yn]. Closing and opening files can have\n\ +very high overhead on certain file systems, especially networked file\n\ +systems.\n\ +\n\ The page range is a set of numbers separated by commas, ranges of\n\ numbers separated dashes, or combinations of those. The character\n\ \"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& o) { o.preserve_unreferenced_page_resources = true; } + else if (strcmp(arg, "keep-files-open") == 0) + { + o.keep_files_open_set = true; + if (parameter && (strcmp(parameter, "y") == 0)) + { + o.keep_files_open = true; + } + else if (parameter && (strcmp(parameter, "n") == 0)) + { + o.keep_files_open = false; + } + else + { + usage("--keep-files-open must be given as" + " --keep-files-open=[yn]"); + } + } else if (strcmp(arg, "newline-before-endstream") == 0) { o.newline_before_endstream = true; @@ -2113,6 +2143,43 @@ static void handle_page_specs(QPDF& pdf, Options& o, // Parse all page specifications and translate them into lists of // actual pages. + if (! o.keep_files_open_set) + { + // Count the number of distinct files to determine whether we + // should keep files open or not. Rather than trying to code + // some portable heuristic based on OS limits, just hard-code + // this at a given number and allow users to override. + std::set filenames; + for (std::vector::iterator iter = o.page_specs.begin(); + iter != o.page_specs.end(); ++iter) + { + PageSpec& page_spec = *iter; + filenames.insert(page_spec.filename); + } + // NOTE: The number 200 for this threshold is in the help + // message and manual and is baked into the test suite. + if (filenames.size() > 200) + { + QTC::TC("qpdf", "qpdf disable keep files open"); + if (o.verbose) + { + std::cout << whoami << ": selecting --keep-open-files=n" + << std::endl; + } + o.keep_files_open = false; + } + else + { + if (o.verbose) + { + std::cout << whoami << ": selecting --keep-open-files=y" + << std::endl; + } + o.keep_files_open = true; + QTC::TC("qpdf", "qpdf don't disable keep files open"); + } + } + // Create a QPDF object for each file that we may take pages from. std::map page_spec_qpdfs; std::map page_spec_cfis; @@ -2149,14 +2216,29 @@ static void handle_page_specs(QPDF& pdf, Options& o, std::cout << whoami << ": processing " << page_spec.filename << std::endl; } - ClosedFileInputSource* cis = - new ClosedFileInputSource(page_spec.filename.c_str()); - PointerHolder is(cis); - cis->stayOpen(true); + PointerHolder is; + ClosedFileInputSource* cis = 0; + if (! o.keep_files_open) + { + QTC::TC("qpdf", "qpdf keep files open n"); + cis = new ClosedFileInputSource(page_spec.filename.c_str()); + is = cis; + cis->stayOpen(true); + } + else + { + QTC::TC("qpdf", "qpdf keep files open y"); + FileInputSource* fis = new FileInputSource(); + is = fis; + fis->setFilename(page_spec.filename.c_str()); + } qpdf->processInputSource(is, password); - cis->stayOpen(false); page_spec_qpdfs[page_spec.filename] = qpdf; - page_spec_cfis[page_spec.filename] = cis; + if (cis) + { + cis->stayOpen(false); + page_spec_cfis[page_spec.filename] = cis; + } } // Read original pages from the PDF, and parse the page range diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 2ef724bd..6f06ab05 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -356,3 +356,7 @@ QPDFAcroFormDocumentHelper non-dictionary field 0 QPDFAcroFormDocumentHelper loop 0 QPDFAcroFormDocumentHelper field found 1 QPDFAcroFormDocumentHelper annotation found 1 +qpdf disable keep files open 0 +qpdf keep files open n 0 +qpdf keep files open y 0 +qpdf don't disable keep files open 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 1468a438..21e15e1d 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -1176,6 +1176,49 @@ foreach my $d (@sp_cases) } } +show_ntests(); +# ---------- +$td->notify("--- Keep Files Open ---"); +$n_tests += 4; + +{ # local scope + open(F, "; + close(F); + for (my $i = 1; $i <= 201; ++$i) + { + open(F, sprintf(">%03d-kfo.pdf", $i)) or die; + print F $content; + close(F); + } +} +$td->runtest("disable keep files open", + {$td->COMMAND => + "qpdf --verbose --static-id --empty" . + " --pages *kfo.pdf -- a.pdf"}, + {$td->FILE => "disable-kfo.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("don't disable keep files open", + {$td->COMMAND => + "qpdf --verbose --static-id --empty" . + " --pages 1*kfo.pdf -- a.pdf"}, + {$td->FILE => "enable-kfo.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("explict keep files open", + {$td->COMMAND => + "qpdf --verbose --static-id --keep-files-open=y --empty" . + " --pages 00?-kfo.pdf -- a.pdf"}, + {$td->FILE => "kfo-y.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +$td->runtest("explicit keep files open = n", + {$td->COMMAND => + "qpdf --verbose --static-id --keep-files-open=n --empty" . + " --pages 00?-kfo.pdf -- a.pdf"}, + {$td->FILE => "kfo-n.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + show_ntests(); # ---------- $td->notify("--- Rotate Pages ---"); @@ -3143,5 +3186,5 @@ sub get_md5_checksum sub cleanup { system("rm -rf *.ps *.pnm ?.pdf ?.qdf *.enc* tif1 tif2 tiff-cache"); - system("rm -rf *split-out*"); + system("rm -rf *split-out* ???-kfo.pdf"); } diff --git a/qpdf/qtest/qpdf/disable-kfo.out b/qpdf/qtest/qpdf/disable-kfo.out new file mode 100644 index 00000000..4aec24b6 --- /dev/null +++ b/qpdf/qtest/qpdf/disable-kfo.out @@ -0,0 +1,405 @@ +qpdf: selecting --keep-open-files=n +qpdf: processing 001-kfo.pdf +qpdf: processing 002-kfo.pdf +qpdf: processing 003-kfo.pdf +qpdf: processing 004-kfo.pdf +qpdf: processing 005-kfo.pdf +qpdf: processing 006-kfo.pdf +qpdf: processing 007-kfo.pdf +qpdf: processing 008-kfo.pdf +qpdf: processing 009-kfo.pdf +qpdf: processing 010-kfo.pdf +qpdf: processing 011-kfo.pdf +qpdf: processing 012-kfo.pdf +qpdf: processing 013-kfo.pdf +qpdf: processing 014-kfo.pdf +qpdf: processing 015-kfo.pdf +qpdf: processing 016-kfo.pdf +qpdf: processing 017-kfo.pdf +qpdf: processing 018-kfo.pdf +qpdf: processing 019-kfo.pdf +qpdf: processing 020-kfo.pdf +qpdf: processing 021-kfo.pdf +qpdf: processing 022-kfo.pdf +qpdf: processing 023-kfo.pdf +qpdf: processing 024-kfo.pdf +qpdf: processing 025-kfo.pdf +qpdf: processing 026-kfo.pdf +qpdf: processing 027-kfo.pdf +qpdf: processing 028-kfo.pdf +qpdf: processing 029-kfo.pdf +qpdf: processing 030-kfo.pdf +qpdf: processing 031-kfo.pdf +qpdf: processing 032-kfo.pdf +qpdf: processing 033-kfo.pdf +qpdf: processing 034-kfo.pdf +qpdf: processing 035-kfo.pdf +qpdf: processing 036-kfo.pdf +qpdf: processing 037-kfo.pdf +qpdf: processing 038-kfo.pdf +qpdf: processing 039-kfo.pdf +qpdf: processing 040-kfo.pdf +qpdf: processing 041-kfo.pdf +qpdf: processing 042-kfo.pdf +qpdf: processing 043-kfo.pdf +qpdf: processing 044-kfo.pdf +qpdf: processing 045-kfo.pdf +qpdf: processing 046-kfo.pdf +qpdf: processing 047-kfo.pdf +qpdf: processing 048-kfo.pdf +qpdf: processing 049-kfo.pdf +qpdf: processing 050-kfo.pdf +qpdf: processing 051-kfo.pdf +qpdf: processing 052-kfo.pdf +qpdf: processing 053-kfo.pdf +qpdf: processing 054-kfo.pdf +qpdf: processing 055-kfo.pdf +qpdf: processing 056-kfo.pdf +qpdf: processing 057-kfo.pdf +qpdf: processing 058-kfo.pdf +qpdf: processing 059-kfo.pdf +qpdf: processing 060-kfo.pdf +qpdf: processing 061-kfo.pdf +qpdf: processing 062-kfo.pdf +qpdf: processing 063-kfo.pdf +qpdf: processing 064-kfo.pdf +qpdf: processing 065-kfo.pdf +qpdf: processing 066-kfo.pdf +qpdf: processing 067-kfo.pdf +qpdf: processing 068-kfo.pdf +qpdf: processing 069-kfo.pdf +qpdf: processing 070-kfo.pdf +qpdf: processing 071-kfo.pdf +qpdf: processing 072-kfo.pdf +qpdf: processing 073-kfo.pdf +qpdf: processing 074-kfo.pdf +qpdf: processing 075-kfo.pdf +qpdf: processing 076-kfo.pdf +qpdf: processing 077-kfo.pdf +qpdf: processing 078-kfo.pdf +qpdf: processing 079-kfo.pdf +qpdf: processing 080-kfo.pdf +qpdf: processing 081-kfo.pdf +qpdf: processing 082-kfo.pdf +qpdf: processing 083-kfo.pdf +qpdf: processing 084-kfo.pdf +qpdf: processing 085-kfo.pdf +qpdf: processing 086-kfo.pdf +qpdf: processing 087-kfo.pdf +qpdf: processing 088-kfo.pdf +qpdf: processing 089-kfo.pdf +qpdf: processing 090-kfo.pdf +qpdf: processing 091-kfo.pdf +qpdf: processing 092-kfo.pdf +qpdf: processing 093-kfo.pdf +qpdf: processing 094-kfo.pdf +qpdf: processing 095-kfo.pdf +qpdf: processing 096-kfo.pdf +qpdf: processing 097-kfo.pdf +qpdf: processing 098-kfo.pdf +qpdf: processing 099-kfo.pdf +qpdf: processing 100-kfo.pdf +qpdf: processing 101-kfo.pdf +qpdf: processing 102-kfo.pdf +qpdf: processing 103-kfo.pdf +qpdf: processing 104-kfo.pdf +qpdf: processing 105-kfo.pdf +qpdf: processing 106-kfo.pdf +qpdf: processing 107-kfo.pdf +qpdf: processing 108-kfo.pdf +qpdf: processing 109-kfo.pdf +qpdf: processing 110-kfo.pdf +qpdf: processing 111-kfo.pdf +qpdf: processing 112-kfo.pdf +qpdf: processing 113-kfo.pdf +qpdf: processing 114-kfo.pdf +qpdf: processing 115-kfo.pdf +qpdf: processing 116-kfo.pdf +qpdf: processing 117-kfo.pdf +qpdf: processing 118-kfo.pdf +qpdf: processing 119-kfo.pdf +qpdf: processing 120-kfo.pdf +qpdf: processing 121-kfo.pdf +qpdf: processing 122-kfo.pdf +qpdf: processing 123-kfo.pdf +qpdf: processing 124-kfo.pdf +qpdf: processing 125-kfo.pdf +qpdf: processing 126-kfo.pdf +qpdf: processing 127-kfo.pdf +qpdf: processing 128-kfo.pdf +qpdf: processing 129-kfo.pdf +qpdf: processing 130-kfo.pdf +qpdf: processing 131-kfo.pdf +qpdf: processing 132-kfo.pdf +qpdf: processing 133-kfo.pdf +qpdf: processing 134-kfo.pdf +qpdf: processing 135-kfo.pdf +qpdf: processing 136-kfo.pdf +qpdf: processing 137-kfo.pdf +qpdf: processing 138-kfo.pdf +qpdf: processing 139-kfo.pdf +qpdf: processing 140-kfo.pdf +qpdf: processing 141-kfo.pdf +qpdf: processing 142-kfo.pdf +qpdf: processing 143-kfo.pdf +qpdf: processing 144-kfo.pdf +qpdf: processing 145-kfo.pdf +qpdf: processing 146-kfo.pdf +qpdf: processing 147-kfo.pdf +qpdf: processing 148-kfo.pdf +qpdf: processing 149-kfo.pdf +qpdf: processing 150-kfo.pdf +qpdf: processing 151-kfo.pdf +qpdf: processing 152-kfo.pdf +qpdf: processing 153-kfo.pdf +qpdf: processing 154-kfo.pdf +qpdf: processing 155-kfo.pdf +qpdf: processing 156-kfo.pdf +qpdf: processing 157-kfo.pdf +qpdf: processing 158-kfo.pdf +qpdf: processing 159-kfo.pdf +qpdf: processing 160-kfo.pdf +qpdf: processing 161-kfo.pdf +qpdf: processing 162-kfo.pdf +qpdf: processing 163-kfo.pdf +qpdf: processing 164-kfo.pdf +qpdf: processing 165-kfo.pdf +qpdf: processing 166-kfo.pdf +qpdf: processing 167-kfo.pdf +qpdf: processing 168-kfo.pdf +qpdf: processing 169-kfo.pdf +qpdf: processing 170-kfo.pdf +qpdf: processing 171-kfo.pdf +qpdf: processing 172-kfo.pdf +qpdf: processing 173-kfo.pdf +qpdf: processing 174-kfo.pdf +qpdf: processing 175-kfo.pdf +qpdf: processing 176-kfo.pdf +qpdf: processing 177-kfo.pdf +qpdf: processing 178-kfo.pdf +qpdf: processing 179-kfo.pdf +qpdf: processing 180-kfo.pdf +qpdf: processing 181-kfo.pdf +qpdf: processing 182-kfo.pdf +qpdf: processing 183-kfo.pdf +qpdf: processing 184-kfo.pdf +qpdf: processing 185-kfo.pdf +qpdf: processing 186-kfo.pdf +qpdf: processing 187-kfo.pdf +qpdf: processing 188-kfo.pdf +qpdf: processing 189-kfo.pdf +qpdf: processing 190-kfo.pdf +qpdf: processing 191-kfo.pdf +qpdf: processing 192-kfo.pdf +qpdf: processing 193-kfo.pdf +qpdf: processing 194-kfo.pdf +qpdf: processing 195-kfo.pdf +qpdf: processing 196-kfo.pdf +qpdf: processing 197-kfo.pdf +qpdf: processing 198-kfo.pdf +qpdf: processing 199-kfo.pdf +qpdf: processing 200-kfo.pdf +qpdf: processing 201-kfo.pdf +qpdf: removing unreferenced pages from primary input +qpdf: adding pages from 001-kfo.pdf +qpdf: adding pages from 002-kfo.pdf +qpdf: adding pages from 003-kfo.pdf +qpdf: adding pages from 004-kfo.pdf +qpdf: adding pages from 005-kfo.pdf +qpdf: adding pages from 006-kfo.pdf +qpdf: adding pages from 007-kfo.pdf +qpdf: adding pages from 008-kfo.pdf +qpdf: adding pages from 009-kfo.pdf +qpdf: adding pages from 010-kfo.pdf +qpdf: adding pages from 011-kfo.pdf +qpdf: adding pages from 012-kfo.pdf +qpdf: adding pages from 013-kfo.pdf +qpdf: adding pages from 014-kfo.pdf +qpdf: adding pages from 015-kfo.pdf +qpdf: adding pages from 016-kfo.pdf +qpdf: adding pages from 017-kfo.pdf +qpdf: adding pages from 018-kfo.pdf +qpdf: adding pages from 019-kfo.pdf +qpdf: adding pages from 020-kfo.pdf +qpdf: adding pages from 021-kfo.pdf +qpdf: adding pages from 022-kfo.pdf +qpdf: adding pages from 023-kfo.pdf +qpdf: adding pages from 024-kfo.pdf +qpdf: adding pages from 025-kfo.pdf +qpdf: adding pages from 026-kfo.pdf +qpdf: adding pages from 027-kfo.pdf +qpdf: adding pages from 028-kfo.pdf +qpdf: adding pages from 029-kfo.pdf +qpdf: adding pages from 030-kfo.pdf +qpdf: adding pages from 031-kfo.pdf +qpdf: adding pages from 032-kfo.pdf +qpdf: adding pages from 033-kfo.pdf +qpdf: adding pages from 034-kfo.pdf +qpdf: adding pages from 035-kfo.pdf +qpdf: adding pages from 036-kfo.pdf +qpdf: adding pages from 037-kfo.pdf +qpdf: adding pages from 038-kfo.pdf +qpdf: adding pages from 039-kfo.pdf +qpdf: adding pages from 040-kfo.pdf +qpdf: adding pages from 041-kfo.pdf +qpdf: adding pages from 042-kfo.pdf +qpdf: adding pages from 043-kfo.pdf +qpdf: adding pages from 044-kfo.pdf +qpdf: adding pages from 045-kfo.pdf +qpdf: adding pages from 046-kfo.pdf +qpdf: adding pages from 047-kfo.pdf +qpdf: adding pages from 048-kfo.pdf +qpdf: adding pages from 049-kfo.pdf +qpdf: adding pages from 050-kfo.pdf +qpdf: adding pages from 051-kfo.pdf +qpdf: adding pages from 052-kfo.pdf +qpdf: adding pages from 053-kfo.pdf +qpdf: adding pages from 054-kfo.pdf +qpdf: adding pages from 055-kfo.pdf +qpdf: adding pages from 056-kfo.pdf +qpdf: adding pages from 057-kfo.pdf +qpdf: adding pages from 058-kfo.pdf +qpdf: adding pages from 059-kfo.pdf +qpdf: adding pages from 060-kfo.pdf +qpdf: adding pages from 061-kfo.pdf +qpdf: adding pages from 062-kfo.pdf +qpdf: adding pages from 063-kfo.pdf +qpdf: adding pages from 064-kfo.pdf +qpdf: adding pages from 065-kfo.pdf +qpdf: adding pages from 066-kfo.pdf +qpdf: adding pages from 067-kfo.pdf +qpdf: adding pages from 068-kfo.pdf +qpdf: adding pages from 069-kfo.pdf +qpdf: adding pages from 070-kfo.pdf +qpdf: adding pages from 071-kfo.pdf +qpdf: adding pages from 072-kfo.pdf +qpdf: adding pages from 073-kfo.pdf +qpdf: adding pages from 074-kfo.pdf +qpdf: adding pages from 075-kfo.pdf +qpdf: adding pages from 076-kfo.pdf +qpdf: adding pages from 077-kfo.pdf +qpdf: adding pages from 078-kfo.pdf +qpdf: adding pages from 079-kfo.pdf +qpdf: adding pages from 080-kfo.pdf +qpdf: adding pages from 081-kfo.pdf +qpdf: adding pages from 082-kfo.pdf +qpdf: adding pages from 083-kfo.pdf +qpdf: adding pages from 084-kfo.pdf +qpdf: adding pages from 085-kfo.pdf +qpdf: adding pages from 086-kfo.pdf +qpdf: adding pages from 087-kfo.pdf +qpdf: adding pages from 088-kfo.pdf +qpdf: adding pages from 089-kfo.pdf +qpdf: adding pages from 090-kfo.pdf +qpdf: adding pages from 091-kfo.pdf +qpdf: adding pages from 092-kfo.pdf +qpdf: adding pages from 093-kfo.pdf +qpdf: adding pages from 094-kfo.pdf +qpdf: adding pages from 095-kfo.pdf +qpdf: adding pages from 096-kfo.pdf +qpdf: adding pages from 097-kfo.pdf +qpdf: adding pages from 098-kfo.pdf +qpdf: adding pages from 099-kfo.pdf +qpdf: adding pages from 100-kfo.pdf +qpdf: adding pages from 101-kfo.pdf +qpdf: adding pages from 102-kfo.pdf +qpdf: adding pages from 103-kfo.pdf +qpdf: adding pages from 104-kfo.pdf +qpdf: adding pages from 105-kfo.pdf +qpdf: adding pages from 106-kfo.pdf +qpdf: adding pages from 107-kfo.pdf +qpdf: adding pages from 108-kfo.pdf +qpdf: adding pages from 109-kfo.pdf +qpdf: adding pages from 110-kfo.pdf +qpdf: adding pages from 111-kfo.pdf +qpdf: adding pages from 112-kfo.pdf +qpdf: adding pages from 113-kfo.pdf +qpdf: adding pages from 114-kfo.pdf +qpdf: adding pages from 115-kfo.pdf +qpdf: adding pages from 116-kfo.pdf +qpdf: adding pages from 117-kfo.pdf +qpdf: adding pages from 118-kfo.pdf +qpdf: adding pages from 119-kfo.pdf +qpdf: adding pages from 120-kfo.pdf +qpdf: adding pages from 121-kfo.pdf +qpdf: adding pages from 122-kfo.pdf +qpdf: adding pages from 123-kfo.pdf +qpdf: adding pages from 124-kfo.pdf +qpdf: adding pages from 125-kfo.pdf +qpdf: adding pages from 126-kfo.pdf +qpdf: adding pages from 127-kfo.pdf +qpdf: adding pages from 128-kfo.pdf +qpdf: adding pages from 129-kfo.pdf +qpdf: adding pages from 130-kfo.pdf +qpdf: adding pages from 131-kfo.pdf +qpdf: adding pages from 132-kfo.pdf +qpdf: adding pages from 133-kfo.pdf +qpdf: adding pages from 134-kfo.pdf +qpdf: adding pages from 135-kfo.pdf +qpdf: adding pages from 136-kfo.pdf +qpdf: adding pages from 137-kfo.pdf +qpdf: adding pages from 138-kfo.pdf +qpdf: adding pages from 139-kfo.pdf +qpdf: adding pages from 140-kfo.pdf +qpdf: adding pages from 141-kfo.pdf +qpdf: adding pages from 142-kfo.pdf +qpdf: adding pages from 143-kfo.pdf +qpdf: adding pages from 144-kfo.pdf +qpdf: adding pages from 145-kfo.pdf +qpdf: adding pages from 146-kfo.pdf +qpdf: adding pages from 147-kfo.pdf +qpdf: adding pages from 148-kfo.pdf +qpdf: adding pages from 149-kfo.pdf +qpdf: adding pages from 150-kfo.pdf +qpdf: adding pages from 151-kfo.pdf +qpdf: adding pages from 152-kfo.pdf +qpdf: adding pages from 153-kfo.pdf +qpdf: adding pages from 154-kfo.pdf +qpdf: adding pages from 155-kfo.pdf +qpdf: adding pages from 156-kfo.pdf +qpdf: adding pages from 157-kfo.pdf +qpdf: adding pages from 158-kfo.pdf +qpdf: adding pages from 159-kfo.pdf +qpdf: adding pages from 160-kfo.pdf +qpdf: adding pages from 161-kfo.pdf +qpdf: adding pages from 162-kfo.pdf +qpdf: adding pages from 163-kfo.pdf +qpdf: adding pages from 164-kfo.pdf +qpdf: adding pages from 165-kfo.pdf +qpdf: adding pages from 166-kfo.pdf +qpdf: adding pages from 167-kfo.pdf +qpdf: adding pages from 168-kfo.pdf +qpdf: adding pages from 169-kfo.pdf +qpdf: adding pages from 170-kfo.pdf +qpdf: adding pages from 171-kfo.pdf +qpdf: adding pages from 172-kfo.pdf +qpdf: adding pages from 173-kfo.pdf +qpdf: adding pages from 174-kfo.pdf +qpdf: adding pages from 175-kfo.pdf +qpdf: adding pages from 176-kfo.pdf +qpdf: adding pages from 177-kfo.pdf +qpdf: adding pages from 178-kfo.pdf +qpdf: adding pages from 179-kfo.pdf +qpdf: adding pages from 180-kfo.pdf +qpdf: adding pages from 181-kfo.pdf +qpdf: adding pages from 182-kfo.pdf +qpdf: adding pages from 183-kfo.pdf +qpdf: adding pages from 184-kfo.pdf +qpdf: adding pages from 185-kfo.pdf +qpdf: adding pages from 186-kfo.pdf +qpdf: adding pages from 187-kfo.pdf +qpdf: adding pages from 188-kfo.pdf +qpdf: adding pages from 189-kfo.pdf +qpdf: adding pages from 190-kfo.pdf +qpdf: adding pages from 191-kfo.pdf +qpdf: adding pages from 192-kfo.pdf +qpdf: adding pages from 193-kfo.pdf +qpdf: adding pages from 194-kfo.pdf +qpdf: adding pages from 195-kfo.pdf +qpdf: adding pages from 196-kfo.pdf +qpdf: adding pages from 197-kfo.pdf +qpdf: adding pages from 198-kfo.pdf +qpdf: adding pages from 199-kfo.pdf +qpdf: adding pages from 200-kfo.pdf +qpdf: adding pages from 201-kfo.pdf +qpdf: wrote file a.pdf diff --git a/qpdf/qtest/qpdf/enable-kfo.out b/qpdf/qtest/qpdf/enable-kfo.out new file mode 100644 index 00000000..b889638c --- /dev/null +++ b/qpdf/qtest/qpdf/enable-kfo.out @@ -0,0 +1,203 @@ +qpdf: selecting --keep-open-files=y +qpdf: processing 100-kfo.pdf +qpdf: processing 101-kfo.pdf +qpdf: processing 102-kfo.pdf +qpdf: processing 103-kfo.pdf +qpdf: processing 104-kfo.pdf +qpdf: processing 105-kfo.pdf +qpdf: processing 106-kfo.pdf +qpdf: processing 107-kfo.pdf +qpdf: processing 108-kfo.pdf +qpdf: processing 109-kfo.pdf +qpdf: processing 110-kfo.pdf +qpdf: processing 111-kfo.pdf +qpdf: processing 112-kfo.pdf +qpdf: processing 113-kfo.pdf +qpdf: processing 114-kfo.pdf +qpdf: processing 115-kfo.pdf +qpdf: processing 116-kfo.pdf +qpdf: processing 117-kfo.pdf +qpdf: processing 118-kfo.pdf +qpdf: processing 119-kfo.pdf +qpdf: processing 120-kfo.pdf +qpdf: processing 121-kfo.pdf +qpdf: processing 122-kfo.pdf +qpdf: processing 123-kfo.pdf +qpdf: processing 124-kfo.pdf +qpdf: processing 125-kfo.pdf +qpdf: processing 126-kfo.pdf +qpdf: processing 127-kfo.pdf +qpdf: processing 128-kfo.pdf +qpdf: processing 129-kfo.pdf +qpdf: processing 130-kfo.pdf +qpdf: processing 131-kfo.pdf +qpdf: processing 132-kfo.pdf +qpdf: processing 133-kfo.pdf +qpdf: processing 134-kfo.pdf +qpdf: processing 135-kfo.pdf +qpdf: processing 136-kfo.pdf +qpdf: processing 137-kfo.pdf +qpdf: processing 138-kfo.pdf +qpdf: processing 139-kfo.pdf +qpdf: processing 140-kfo.pdf +qpdf: processing 141-kfo.pdf +qpdf: processing 142-kfo.pdf +qpdf: processing 143-kfo.pdf +qpdf: processing 144-kfo.pdf +qpdf: processing 145-kfo.pdf +qpdf: processing 146-kfo.pdf +qpdf: processing 147-kfo.pdf +qpdf: processing 148-kfo.pdf +qpdf: processing 149-kfo.pdf +qpdf: processing 150-kfo.pdf +qpdf: processing 151-kfo.pdf +qpdf: processing 152-kfo.pdf +qpdf: processing 153-kfo.pdf +qpdf: processing 154-kfo.pdf +qpdf: processing 155-kfo.pdf +qpdf: processing 156-kfo.pdf +qpdf: processing 157-kfo.pdf +qpdf: processing 158-kfo.pdf +qpdf: processing 159-kfo.pdf +qpdf: processing 160-kfo.pdf +qpdf: processing 161-kfo.pdf +qpdf: processing 162-kfo.pdf +qpdf: processing 163-kfo.pdf +qpdf: processing 164-kfo.pdf +qpdf: processing 165-kfo.pdf +qpdf: processing 166-kfo.pdf +qpdf: processing 167-kfo.pdf +qpdf: processing 168-kfo.pdf +qpdf: processing 169-kfo.pdf +qpdf: processing 170-kfo.pdf +qpdf: processing 171-kfo.pdf +qpdf: processing 172-kfo.pdf +qpdf: processing 173-kfo.pdf +qpdf: processing 174-kfo.pdf +qpdf: processing 175-kfo.pdf +qpdf: processing 176-kfo.pdf +qpdf: processing 177-kfo.pdf +qpdf: processing 178-kfo.pdf +qpdf: processing 179-kfo.pdf +qpdf: processing 180-kfo.pdf +qpdf: processing 181-kfo.pdf +qpdf: processing 182-kfo.pdf +qpdf: processing 183-kfo.pdf +qpdf: processing 184-kfo.pdf +qpdf: processing 185-kfo.pdf +qpdf: processing 186-kfo.pdf +qpdf: processing 187-kfo.pdf +qpdf: processing 188-kfo.pdf +qpdf: processing 189-kfo.pdf +qpdf: processing 190-kfo.pdf +qpdf: processing 191-kfo.pdf +qpdf: processing 192-kfo.pdf +qpdf: processing 193-kfo.pdf +qpdf: processing 194-kfo.pdf +qpdf: processing 195-kfo.pdf +qpdf: processing 196-kfo.pdf +qpdf: processing 197-kfo.pdf +qpdf: processing 198-kfo.pdf +qpdf: processing 199-kfo.pdf +qpdf: removing unreferenced pages from primary input +qpdf: adding pages from 100-kfo.pdf +qpdf: adding pages from 101-kfo.pdf +qpdf: adding pages from 102-kfo.pdf +qpdf: adding pages from 103-kfo.pdf +qpdf: adding pages from 104-kfo.pdf +qpdf: adding pages from 105-kfo.pdf +qpdf: adding pages from 106-kfo.pdf +qpdf: adding pages from 107-kfo.pdf +qpdf: adding pages from 108-kfo.pdf +qpdf: adding pages from 109-kfo.pdf +qpdf: adding pages from 110-kfo.pdf +qpdf: adding pages from 111-kfo.pdf +qpdf: adding pages from 112-kfo.pdf +qpdf: adding pages from 113-kfo.pdf +qpdf: adding pages from 114-kfo.pdf +qpdf: adding pages from 115-kfo.pdf +qpdf: adding pages from 116-kfo.pdf +qpdf: adding pages from 117-kfo.pdf +qpdf: adding pages from 118-kfo.pdf +qpdf: adding pages from 119-kfo.pdf +qpdf: adding pages from 120-kfo.pdf +qpdf: adding pages from 121-kfo.pdf +qpdf: adding pages from 122-kfo.pdf +qpdf: adding pages from 123-kfo.pdf +qpdf: adding pages from 124-kfo.pdf +qpdf: adding pages from 125-kfo.pdf +qpdf: adding pages from 126-kfo.pdf +qpdf: adding pages from 127-kfo.pdf +qpdf: adding pages from 128-kfo.pdf +qpdf: adding pages from 129-kfo.pdf +qpdf: adding pages from 130-kfo.pdf +qpdf: adding pages from 131-kfo.pdf +qpdf: adding pages from 132-kfo.pdf +qpdf: adding pages from 133-kfo.pdf +qpdf: adding pages from 134-kfo.pdf +qpdf: adding pages from 135-kfo.pdf +qpdf: adding pages from 136-kfo.pdf +qpdf: adding pages from 137-kfo.pdf +qpdf: adding pages from 138-kfo.pdf +qpdf: adding pages from 139-kfo.pdf +qpdf: adding pages from 140-kfo.pdf +qpdf: adding pages from 141-kfo.pdf +qpdf: adding pages from 142-kfo.pdf +qpdf: adding pages from 143-kfo.pdf +qpdf: adding pages from 144-kfo.pdf +qpdf: adding pages from 145-kfo.pdf +qpdf: adding pages from 146-kfo.pdf +qpdf: adding pages from 147-kfo.pdf +qpdf: adding pages from 148-kfo.pdf +qpdf: adding pages from 149-kfo.pdf +qpdf: adding pages from 150-kfo.pdf +qpdf: adding pages from 151-kfo.pdf +qpdf: adding pages from 152-kfo.pdf +qpdf: adding pages from 153-kfo.pdf +qpdf: adding pages from 154-kfo.pdf +qpdf: adding pages from 155-kfo.pdf +qpdf: adding pages from 156-kfo.pdf +qpdf: adding pages from 157-kfo.pdf +qpdf: adding pages from 158-kfo.pdf +qpdf: adding pages from 159-kfo.pdf +qpdf: adding pages from 160-kfo.pdf +qpdf: adding pages from 161-kfo.pdf +qpdf: adding pages from 162-kfo.pdf +qpdf: adding pages from 163-kfo.pdf +qpdf: adding pages from 164-kfo.pdf +qpdf: adding pages from 165-kfo.pdf +qpdf: adding pages from 166-kfo.pdf +qpdf: adding pages from 167-kfo.pdf +qpdf: adding pages from 168-kfo.pdf +qpdf: adding pages from 169-kfo.pdf +qpdf: adding pages from 170-kfo.pdf +qpdf: adding pages from 171-kfo.pdf +qpdf: adding pages from 172-kfo.pdf +qpdf: adding pages from 173-kfo.pdf +qpdf: adding pages from 174-kfo.pdf +qpdf: adding pages from 175-kfo.pdf +qpdf: adding pages from 176-kfo.pdf +qpdf: adding pages from 177-kfo.pdf +qpdf: adding pages from 178-kfo.pdf +qpdf: adding pages from 179-kfo.pdf +qpdf: adding pages from 180-kfo.pdf +qpdf: adding pages from 181-kfo.pdf +qpdf: adding pages from 182-kfo.pdf +qpdf: adding pages from 183-kfo.pdf +qpdf: adding pages from 184-kfo.pdf +qpdf: adding pages from 185-kfo.pdf +qpdf: adding pages from 186-kfo.pdf +qpdf: adding pages from 187-kfo.pdf +qpdf: adding pages from 188-kfo.pdf +qpdf: adding pages from 189-kfo.pdf +qpdf: adding pages from 190-kfo.pdf +qpdf: adding pages from 191-kfo.pdf +qpdf: adding pages from 192-kfo.pdf +qpdf: adding pages from 193-kfo.pdf +qpdf: adding pages from 194-kfo.pdf +qpdf: adding pages from 195-kfo.pdf +qpdf: adding pages from 196-kfo.pdf +qpdf: adding pages from 197-kfo.pdf +qpdf: adding pages from 198-kfo.pdf +qpdf: adding pages from 199-kfo.pdf +qpdf: wrote file a.pdf diff --git a/qpdf/qtest/qpdf/kfo-n.out b/qpdf/qtest/qpdf/kfo-n.out new file mode 100644 index 00000000..0fe71ca0 --- /dev/null +++ b/qpdf/qtest/qpdf/kfo-n.out @@ -0,0 +1,20 @@ +qpdf: processing 001-kfo.pdf +qpdf: processing 002-kfo.pdf +qpdf: processing 003-kfo.pdf +qpdf: processing 004-kfo.pdf +qpdf: processing 005-kfo.pdf +qpdf: processing 006-kfo.pdf +qpdf: processing 007-kfo.pdf +qpdf: processing 008-kfo.pdf +qpdf: processing 009-kfo.pdf +qpdf: removing unreferenced pages from primary input +qpdf: adding pages from 001-kfo.pdf +qpdf: adding pages from 002-kfo.pdf +qpdf: adding pages from 003-kfo.pdf +qpdf: adding pages from 004-kfo.pdf +qpdf: adding pages from 005-kfo.pdf +qpdf: adding pages from 006-kfo.pdf +qpdf: adding pages from 007-kfo.pdf +qpdf: adding pages from 008-kfo.pdf +qpdf: adding pages from 009-kfo.pdf +qpdf: wrote file a.pdf diff --git a/qpdf/qtest/qpdf/kfo-y.out b/qpdf/qtest/qpdf/kfo-y.out new file mode 100644 index 00000000..0fe71ca0 --- /dev/null +++ b/qpdf/qtest/qpdf/kfo-y.out @@ -0,0 +1,20 @@ +qpdf: processing 001-kfo.pdf +qpdf: processing 002-kfo.pdf +qpdf: processing 003-kfo.pdf +qpdf: processing 004-kfo.pdf +qpdf: processing 005-kfo.pdf +qpdf: processing 006-kfo.pdf +qpdf: processing 007-kfo.pdf +qpdf: processing 008-kfo.pdf +qpdf: processing 009-kfo.pdf +qpdf: removing unreferenced pages from primary input +qpdf: adding pages from 001-kfo.pdf +qpdf: adding pages from 002-kfo.pdf +qpdf: adding pages from 003-kfo.pdf +qpdf: adding pages from 004-kfo.pdf +qpdf: adding pages from 005-kfo.pdf +qpdf: adding pages from 006-kfo.pdf +qpdf: adding pages from 007-kfo.pdf +qpdf: adding pages from 008-kfo.pdf +qpdf: adding pages from 009-kfo.pdf +qpdf: wrote file a.pdf diff --git a/qpdf/qtest/qpdf/verbose-merge.out b/qpdf/qtest/qpdf/verbose-merge.out index ae8c3113..9de13e16 100644 --- a/qpdf/qtest/qpdf/verbose-merge.out +++ b/qpdf/qtest/qpdf/verbose-merge.out @@ -1,3 +1,4 @@ +qpdf: selecting --keep-open-files=y qpdf: processing 20-pages.pdf qpdf: processing ./20-pages.pdf qpdf: processing minimal.pdf