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

This commit is contained in:
Jay Berkenbilt 2018-08-18 09:47:39 -04:00
parent 5e9e17e62a
commit 28453a4908
9 changed files with 806 additions and 7 deletions

View File

@ -1,3 +1,24 @@
2018-08-18 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 8.2.0: release

View File

@ -8,6 +8,7 @@
#include <qpdf/QUtil.hh>
#include <qpdf/QTC.hh>
#include <qpdf/ClosedFileInputSource.hh>
#include <qpdf/FileInputSource.hh>
#include <qpdf/Pl_StdioFile.hh>
#include <qpdf/Pl_Discard.hh>
#include <qpdf/PointerHolder.hh>
@ -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<std::string> filenames;
for (std::vector<PageSpec>::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<std::string, QPDF*> page_spec_qpdfs;
std::map<std::string, ClosedFileInputSource*> 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<InputSource> is(cis);
cis->stayOpen(true);
PointerHolder<InputSource> 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

View File

@ -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

View File

@ -1176,6 +1176,49 @@ foreach my $d (@sp_cases)
}
}
show_ntests();
# ----------
$td->notify("--- Keep Files Open ---");
$n_tests += 4;
{ # local scope
open(F, "<minimal.pdf") or die;
local $/ = undef;
binmode F;
my $content = <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");
}

View File

@ -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

View File

@ -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

20
qpdf/qtest/qpdf/kfo-n.out Normal file
View File

@ -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

20
qpdf/qtest/qpdf/kfo-y.out Normal file
View File

@ -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

View File

@ -1,3 +1,4 @@
qpdf: selecting --keep-open-files=y
qpdf: processing 20-pages.pdf
qpdf: processing ./20-pages.pdf
qpdf: processing minimal.pdf