mirror of
https://github.com/qpdf/qpdf.git
synced 2025-01-02 22:50:20 +00:00
Preserve page labels (numbers) when splitting and merging
This commit is contained in:
parent
6ef9e31233
commit
352ce9b22b
@ -1,5 +1,11 @@
|
|||||||
2018-12-18 Jay Berkenbilt <ejb@ql.org>
|
2018-12-18 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Preserve page labels when merging and splitting files. Prior
|
||||||
|
versions of qpdf simply preserved the page label information from
|
||||||
|
the first file, which usually wouldn't make any sense in the
|
||||||
|
merged file. Now any page that had a page number in any original
|
||||||
|
file will have the same page number after merging or splitting.
|
||||||
|
|
||||||
* Add QPDFPageLabelDocumentHelper class. This is a document helper
|
* Add QPDFPageLabelDocumentHelper class. This is a document helper
|
||||||
class that provides useful methods for dealing with page labels.
|
class that provides useful methods for dealing with page labels.
|
||||||
It abstracts the fact that they are stored as number trees and
|
It abstracts the fact that they are stored as number trees and
|
||||||
|
@ -911,23 +911,23 @@ make
|
|||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Note that qpdf doesn't presently do anything special about other
|
Starting in qpdf version 8.3, when you split and merge files, any
|
||||||
constructs in a PDF file that may know about pages, so semantics
|
page labels (page numbers) are preserved in the final file. It is
|
||||||
of splitting and merging vary across features. For example, the
|
expected that more document features will be preserved by
|
||||||
document's outlines (bookmarks) point to actual page objects, so
|
splitting and merging. In the mean time, semantics of splitting
|
||||||
if you select some pages and not others, bookmarks that point to
|
and merging vary across features. For example, the document's
|
||||||
pages that are in the output file will work, and remaining
|
outlines (bookmarks) point to actual page objects, so if you
|
||||||
bookmarks will not work. On the other hand, page labels (page
|
select some pages and not others, bookmarks that point to pages
|
||||||
numbers specified in the file) are just sequential, so page labels
|
that are in the output file will work, and remaining bookmarks
|
||||||
will be messed up in the output file. A future version of
|
will not work. A future version of <command>qpdf</command> may do
|
||||||
<command>qpdf</command> may do a better job at handling these
|
a better job at handling these issues. (Note that the qpdf library
|
||||||
issues. (Note that the qpdf library already contains all of the
|
already contains all of the APIs required in order to implement
|
||||||
APIs required in order to implement this in your own application
|
this in your own application if you need it.) In the mean time,
|
||||||
if you need it.) In the mean time, you can always use
|
you can always use <option>--empty</option> as the primary input
|
||||||
<option>--empty</option> as the primary input file to avoid
|
file to avoid copying all of that from the first file. For
|
||||||
copying all of that from the first file. For example, to take
|
example, to take pages 1 through 5 from a
|
||||||
pages 1 through 5 from a <filename>infile.pdf</filename> while
|
<filename>infile.pdf</filename> while preserving all metadata
|
||||||
preserving all metadata associated with that file, you could use
|
associated with that file, you could use
|
||||||
|
|
||||||
<programlisting><command>qpdf</command> <option>infile.pdf --pages infile.pdf 1-5 -- outfile.pdf</option>
|
<programlisting><command>qpdf</command> <option>infile.pdf --pages infile.pdf 1-5 -- outfile.pdf</option>
|
||||||
</programlisting>
|
</programlisting>
|
||||||
@ -946,8 +946,8 @@ make
|
|||||||
If, for some reason, you wanted to take the first page of an
|
If, for some reason, you wanted to take the first page of an
|
||||||
encrypted file called <filename>encrypted.pdf</filename> with
|
encrypted file called <filename>encrypted.pdf</filename> with
|
||||||
password <literal>pass</literal> and repeat it twice in an output
|
password <literal>pass</literal> and repeat it twice in an output
|
||||||
file, and if you wanted to drop metadata (like page numbers and
|
file, and if you wanted to drop document-level metadata but
|
||||||
outlines) but preserve encryption, you would use
|
preserve encryption, you would use
|
||||||
|
|
||||||
<programlisting><command>qpdf</command> <option>--empty --copy-encryption=encrypted.pdf --encryption-file-password=pass
|
<programlisting><command>qpdf</command> <option>--empty --copy-encryption=encrypted.pdf --encryption-file-password=pass
|
||||||
--pages encrypted.pdf --password=pass 1 ./encrypted.pdf --password=pass 1 --
|
--pages encrypted.pdf --password=pass 1 ./encrypted.pdf --password=pass 1 --
|
||||||
|
52
qpdf/qpdf.cc
52
qpdf/qpdf.cc
@ -16,6 +16,7 @@
|
|||||||
#include <qpdf/QPDF.hh>
|
#include <qpdf/QPDF.hh>
|
||||||
#include <qpdf/QPDFPageDocumentHelper.hh>
|
#include <qpdf/QPDFPageDocumentHelper.hh>
|
||||||
#include <qpdf/QPDFPageObjectHelper.hh>
|
#include <qpdf/QPDFPageObjectHelper.hh>
|
||||||
|
#include <qpdf/QPDFPageLabelDocumentHelper.hh>
|
||||||
#include <qpdf/QPDFExc.hh>
|
#include <qpdf/QPDFExc.hh>
|
||||||
|
|
||||||
#include <qpdf/QPDFWriter.hh>
|
#include <qpdf/QPDFWriter.hh>
|
||||||
@ -2296,11 +2297,25 @@ static void handle_page_specs(QPDF& pdf, Options& o,
|
|||||||
// Keep track of any pages from the original file that we are
|
// Keep track of any pages from the original file that we are
|
||||||
// selecting.
|
// selecting.
|
||||||
std::set<int> selected_from_orig;
|
std::set<int> selected_from_orig;
|
||||||
|
std::vector<QPDFObjectHandle> new_labels;
|
||||||
|
bool any_page_labels = false;
|
||||||
|
int out_pageno = 0;
|
||||||
for (std::vector<QPDFPageData>::iterator iter =
|
for (std::vector<QPDFPageData>::iterator iter =
|
||||||
parsed_specs.begin();
|
parsed_specs.begin();
|
||||||
iter != parsed_specs.end(); ++iter)
|
iter != parsed_specs.end(); ++iter)
|
||||||
{
|
{
|
||||||
QPDFPageData& page_data = *iter;
|
QPDFPageData& page_data = *iter;
|
||||||
|
ClosedFileInputSource* cis = 0;
|
||||||
|
if (page_spec_cfis.count(page_data.filename))
|
||||||
|
{
|
||||||
|
cis = page_spec_cfis[page_data.filename];
|
||||||
|
cis->stayOpen(true);
|
||||||
|
}
|
||||||
|
QPDFPageLabelDocumentHelper pldh(*page_data.qpdf);
|
||||||
|
if (pldh.hasPageLabels())
|
||||||
|
{
|
||||||
|
any_page_labels = true;
|
||||||
|
}
|
||||||
if (o.verbose)
|
if (o.verbose)
|
||||||
{
|
{
|
||||||
std::cout << whoami << ": adding pages from "
|
std::cout << whoami << ": adding pages from "
|
||||||
@ -2309,22 +2324,14 @@ static void handle_page_specs(QPDF& pdf, Options& o,
|
|||||||
for (std::vector<int>::iterator pageno_iter =
|
for (std::vector<int>::iterator pageno_iter =
|
||||||
page_data.selected_pages.begin();
|
page_data.selected_pages.begin();
|
||||||
pageno_iter != page_data.selected_pages.end();
|
pageno_iter != page_data.selected_pages.end();
|
||||||
++pageno_iter)
|
++pageno_iter, ++out_pageno)
|
||||||
{
|
{
|
||||||
// Pages are specified from 1 but numbered from 0 in the
|
// Pages are specified from 1 but numbered from 0 in the
|
||||||
// vector
|
// vector
|
||||||
int pageno = *pageno_iter - 1;
|
int pageno = *pageno_iter - 1;
|
||||||
ClosedFileInputSource* cis = 0;
|
pldh.getLabelsForPageRange(pageno, pageno, out_pageno,
|
||||||
if (page_spec_cfis.count(page_data.filename))
|
new_labels);
|
||||||
{
|
|
||||||
cis = page_spec_cfis[page_data.filename];
|
|
||||||
cis->stayOpen(true);
|
|
||||||
}
|
|
||||||
dh.addPage(page_data.orig_pages.at(pageno), false);
|
dh.addPage(page_data.orig_pages.at(pageno), false);
|
||||||
if (cis)
|
|
||||||
{
|
|
||||||
cis->stayOpen(false);
|
|
||||||
}
|
|
||||||
if (page_data.qpdf == &pdf)
|
if (page_data.qpdf == &pdf)
|
||||||
{
|
{
|
||||||
// This is a page from the original file. Keep track
|
// This is a page from the original file. Keep track
|
||||||
@ -2332,6 +2339,18 @@ static void handle_page_specs(QPDF& pdf, Options& o,
|
|||||||
selected_from_orig.insert(pageno);
|
selected_from_orig.insert(pageno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (cis)
|
||||||
|
{
|
||||||
|
cis->stayOpen(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (any_page_labels)
|
||||||
|
{
|
||||||
|
QPDFObjectHandle page_labels =
|
||||||
|
QPDFObjectHandle::newDictionary();
|
||||||
|
page_labels.replaceKey(
|
||||||
|
"/Nums", QPDFObjectHandle::newArray(new_labels));
|
||||||
|
pdf.getRoot().replaceKey("/PageLabels", page_labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete page objects for unused page in primary. This prevents
|
// Delete page objects for unused page in primary. This prevents
|
||||||
@ -2574,6 +2593,7 @@ static void write_outfile(QPDF& pdf, Options& o)
|
|||||||
dh.pushInheritedAttributesToPage();
|
dh.pushInheritedAttributesToPage();
|
||||||
dh.removeUnreferencedResources();
|
dh.removeUnreferencedResources();
|
||||||
}
|
}
|
||||||
|
QPDFPageLabelDocumentHelper pldh(pdf);
|
||||||
std::vector<QPDFObjectHandle> const& pages = pdf.getAllPages();
|
std::vector<QPDFObjectHandle> const& pages = pdf.getAllPages();
|
||||||
int pageno_len = QUtil::int_to_string(pages.size()).length();
|
int pageno_len = QUtil::int_to_string(pages.size()).length();
|
||||||
unsigned int num_pages = pages.size();
|
unsigned int num_pages = pages.size();
|
||||||
@ -2592,6 +2612,16 @@ static void write_outfile(QPDF& pdf, Options& o)
|
|||||||
QPDFObjectHandle page = pages.at(pageno - 1);
|
QPDFObjectHandle page = pages.at(pageno - 1);
|
||||||
outpdf.addPage(page, false);
|
outpdf.addPage(page, false);
|
||||||
}
|
}
|
||||||
|
if (pldh.hasPageLabels())
|
||||||
|
{
|
||||||
|
std::vector<QPDFObjectHandle> labels;
|
||||||
|
pldh.getLabelsForPageRange(first - 1, last - 1, 0, labels);
|
||||||
|
QPDFObjectHandle page_labels =
|
||||||
|
QPDFObjectHandle::newDictionary();
|
||||||
|
page_labels.replaceKey(
|
||||||
|
"/Nums", QPDFObjectHandle::newArray(labels));
|
||||||
|
outpdf.getRoot().replaceKey("/PageLabels", page_labels);
|
||||||
|
}
|
||||||
std::string page_range = QUtil::int_to_string(first, pageno_len);
|
std::string page_range = QUtil::int_to_string(first, pageno_len);
|
||||||
if (o.split_pages > 1)
|
if (o.split_pages > 1)
|
||||||
{
|
{
|
||||||
|
@ -360,3 +360,4 @@ qpdf disable keep files open 0
|
|||||||
qpdf keep files open n 0
|
qpdf keep files open n 0
|
||||||
qpdf keep files open y 0
|
qpdf keep files open y 0
|
||||||
qpdf don't disable keep files open 0
|
qpdf don't disable keep files open 0
|
||||||
|
QPDFPageLabelDocumentHelper skip first 0
|
||||||
|
@ -1137,7 +1137,7 @@ my @sp_cases = (
|
|||||||
[11, 'pdf extension', '', 'split-out.Pdf'],
|
[11, 'pdf extension', '', 'split-out.Pdf'],
|
||||||
[4, 'fallback', '--pages 11-pages.pdf 1-3 minimal.pdf --', 'split-out'],
|
[4, 'fallback', '--pages 11-pages.pdf 1-3 minimal.pdf --', 'split-out'],
|
||||||
);
|
);
|
||||||
$n_tests += 9;
|
$n_tests += 12;
|
||||||
for (@sp_cases)
|
for (@sp_cases)
|
||||||
{
|
{
|
||||||
$n_tests += 1 + $_->[0];
|
$n_tests += 1 + $_->[0];
|
||||||
@ -1171,6 +1171,17 @@ foreach my $i (qw(01-04 05-08 09-10))
|
|||||||
{$td->FILE => "shared-split-$i.pdf"});
|
{$td->FILE => "shared-split-$i.pdf"});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$td->runtest("split page with labels",
|
||||||
|
{$td->COMMAND => "qpdf --qdf --static-id --split-pages=6".
|
||||||
|
" 11-pages-with-labels.pdf split-out-labels.pdf"},
|
||||||
|
{$td->STRING => "", $td->EXIT_STATUS => 0});
|
||||||
|
foreach my $i (qw(01-06 07-11))
|
||||||
|
{
|
||||||
|
$td->runtest("check output ($i)",
|
||||||
|
{$td->FILE => "split-out-labels-$i.pdf"},
|
||||||
|
{$td->FILE => "labels-split-$i.pdf"});
|
||||||
|
}
|
||||||
|
|
||||||
foreach my $d (@sp_cases)
|
foreach my $d (@sp_cases)
|
||||||
{
|
{
|
||||||
my ($n, $description, $xargs, $out) = @$d;
|
my ($n, $description, $xargs, $out) = @$d;
|
||||||
@ -1335,7 +1346,7 @@ foreach my $d (@nrange_tests)
|
|||||||
show_ntests();
|
show_ntests();
|
||||||
# ----------
|
# ----------
|
||||||
$td->notify("--- Merging and Splitting ---");
|
$td->notify("--- Merging and Splitting ---");
|
||||||
$n_tests += 16;
|
$n_tests += 18;
|
||||||
|
|
||||||
# Select pages from the same file multiple times including selecting
|
# Select pages from the same file multiple times including selecting
|
||||||
# twice from an encrypted file and specifying the password only the
|
# twice from an encrypted file and specifying the password only the
|
||||||
@ -1368,8 +1379,7 @@ $td->runtest("merge three files",
|
|||||||
" $pages_options --static-id"},
|
" $pages_options --static-id"},
|
||||||
{$td->STRING => "", $td->EXIT_STATUS => 0});
|
{$td->STRING => "", $td->EXIT_STATUS => 0});
|
||||||
# Manually verified about this file: it has the same pages but does
|
# Manually verified about this file: it has the same pages but does
|
||||||
# not contain outlines, page labels, or other things from the original
|
# not contain outlines or other things from the original file.
|
||||||
# file.
|
|
||||||
$td->runtest("check output",
|
$td->runtest("check output",
|
||||||
{$td->FILE => "a.pdf"},
|
{$td->FILE => "a.pdf"},
|
||||||
{$td->FILE => "merge-three-files-2.pdf"});
|
{$td->FILE => "merge-three-files-2.pdf"});
|
||||||
@ -1392,6 +1402,17 @@ $td->runtest("merge with implicit ranges",
|
|||||||
$td->runtest("check output",
|
$td->runtest("check output",
|
||||||
{$td->FILE => "a.pdf"},
|
{$td->FILE => "a.pdf"},
|
||||||
{$td->FILE => "merge-implicit-ranges.pdf"});
|
{$td->FILE => "merge-implicit-ranges.pdf"});
|
||||||
|
$td->runtest("merge with multiple labels",
|
||||||
|
{$td->COMMAND =>
|
||||||
|
"qpdf --empty a.pdf" .
|
||||||
|
" --pages 11-pages-with-labels.pdf 8-11" .
|
||||||
|
" minimal.pdf " .
|
||||||
|
" page-labels-and-outlines.pdf 17-19 --" .
|
||||||
|
" --static-id"},
|
||||||
|
{$td->STRING => "", $td->EXIT_STATUS => 0});
|
||||||
|
$td->runtest("check output",
|
||||||
|
{$td->FILE => "a.pdf"},
|
||||||
|
{$td->FILE => "merge-multiple-labels.pdf"});
|
||||||
|
|
||||||
$td->runtest("split with shared resources",
|
$td->runtest("split with shared resources",
|
||||||
{$td->COMMAND =>
|
{$td->COMMAND =>
|
||||||
|
BIN
qpdf/qtest/qpdf/11-pages-with-labels.pdf
Normal file
BIN
qpdf/qtest/qpdf/11-pages-with-labels.pdf
Normal file
Binary file not shown.
324
qpdf/qtest/qpdf/labels-split-01-06.pdf
Normal file
324
qpdf/qtest/qpdf/labels-split-01-06.pdf
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%¿÷¢þ
|
||||||
|
%QDF-1.0
|
||||||
|
|
||||||
|
%% Original object ID: 1 0
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/PageLabels <<
|
||||||
|
/Nums [
|
||||||
|
0
|
||||||
|
<<
|
||||||
|
/P (pre-)
|
||||||
|
/St 1
|
||||||
|
>>
|
||||||
|
4
|
||||||
|
<<
|
||||||
|
/S /r
|
||||||
|
/St 4
|
||||||
|
>>
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Pages 2 0 R
|
||||||
|
/Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 2 0
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/Count 6
|
||||||
|
/Kids [
|
||||||
|
3 0 R
|
||||||
|
4 0 R
|
||||||
|
5 0 R
|
||||||
|
6 0 R
|
||||||
|
7 0 R
|
||||||
|
8 0 R
|
||||||
|
]
|
||||||
|
/Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 1
|
||||||
|
%% Original object ID: 3 0
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 9 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 11 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 2
|
||||||
|
%% Original object ID: 6 0
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 12 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 11 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 3
|
||||||
|
%% Original object ID: 8 0
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 14 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 11 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 4
|
||||||
|
%% Original object ID: 10 0
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 16 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 11 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 5
|
||||||
|
%% Original object ID: 12 0
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 18 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 11 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 6
|
||||||
|
%% Original object ID: 14 0
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 20 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 11 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 1
|
||||||
|
%% Original object ID: 4 0
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/Length 10 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 1) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
10 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 5 0
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Times-Roman
|
||||||
|
/Encoding /WinAnsiEncoding
|
||||||
|
/Subtype /Type1
|
||||||
|
/Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 2
|
||||||
|
%% Original object ID: 7 0
|
||||||
|
12 0 obj
|
||||||
|
<<
|
||||||
|
/Length 13 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 2) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
13 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 3
|
||||||
|
%% Original object ID: 9 0
|
||||||
|
14 0 obj
|
||||||
|
<<
|
||||||
|
/Length 15 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 3) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
15 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 4
|
||||||
|
%% Original object ID: 11 0
|
||||||
|
16 0 obj
|
||||||
|
<<
|
||||||
|
/Length 17 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 4) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
17 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 5
|
||||||
|
%% Original object ID: 13 0
|
||||||
|
18 0 obj
|
||||||
|
<<
|
||||||
|
/Length 19 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 5) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
19 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 6
|
||||||
|
%% Original object ID: 15 0
|
||||||
|
20 0 obj
|
||||||
|
<<
|
||||||
|
/Length 21 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 6) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
21 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
xref
|
||||||
|
0 22
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000052 00000 n
|
||||||
|
0000000285 00000 n
|
||||||
|
0000000444 00000 n
|
||||||
|
0000000699 00000 n
|
||||||
|
0000000955 00000 n
|
||||||
|
0000001212 00000 n
|
||||||
|
0000001469 00000 n
|
||||||
|
0000001726 00000 n
|
||||||
|
0000001995 00000 n
|
||||||
|
0000002098 00000 n
|
||||||
|
0000002145 00000 n
|
||||||
|
0000002304 00000 n
|
||||||
|
0000002408 00000 n
|
||||||
|
0000002478 00000 n
|
||||||
|
0000002582 00000 n
|
||||||
|
0000002653 00000 n
|
||||||
|
0000002757 00000 n
|
||||||
|
0000002828 00000 n
|
||||||
|
0000002932 00000 n
|
||||||
|
0000003003 00000 n
|
||||||
|
0000003107 00000 n
|
||||||
|
trailer <<
|
||||||
|
/Root 1 0 R
|
||||||
|
/Size 22
|
||||||
|
/ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
3127
|
||||||
|
%%EOF
|
280
qpdf/qtest/qpdf/labels-split-07-11.pdf
Normal file
280
qpdf/qtest/qpdf/labels-split-07-11.pdf
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%¿÷¢þ
|
||||||
|
%QDF-1.0
|
||||||
|
|
||||||
|
%% Original object ID: 1 0
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/PageLabels <<
|
||||||
|
/Nums [
|
||||||
|
0
|
||||||
|
<<
|
||||||
|
/S /r
|
||||||
|
/St 6
|
||||||
|
>>
|
||||||
|
2
|
||||||
|
<<
|
||||||
|
/S /a
|
||||||
|
/St 16
|
||||||
|
>>
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Pages 2 0 R
|
||||||
|
/Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 2 0
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/Count 5
|
||||||
|
/Kids [
|
||||||
|
3 0 R
|
||||||
|
4 0 R
|
||||||
|
5 0 R
|
||||||
|
6 0 R
|
||||||
|
7 0 R
|
||||||
|
]
|
||||||
|
/Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 1
|
||||||
|
%% Original object ID: 3 0
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 8 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 10 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 2
|
||||||
|
%% Original object ID: 6 0
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 11 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 10 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 3
|
||||||
|
%% Original object ID: 8 0
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 13 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 10 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 4
|
||||||
|
%% Original object ID: 10 0
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 15 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 10 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 5
|
||||||
|
%% Original object ID: 12 0
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 17 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 10 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet [
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 1
|
||||||
|
%% Original object ID: 4 0
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Length 9 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 7) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
9 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 5 0
|
||||||
|
10 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Times-Roman
|
||||||
|
/Encoding /WinAnsiEncoding
|
||||||
|
/Subtype /Type1
|
||||||
|
/Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 2
|
||||||
|
%% Original object ID: 7 0
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Length 12 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 8) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
12 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 3
|
||||||
|
%% Original object ID: 9 0
|
||||||
|
13 0 obj
|
||||||
|
<<
|
||||||
|
/Length 14 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 9) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
14 0 obj
|
||||||
|
47
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 4
|
||||||
|
%% Original object ID: 11 0
|
||||||
|
15 0 obj
|
||||||
|
<<
|
||||||
|
/Length 16 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 10) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
16 0 obj
|
||||||
|
48
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 5
|
||||||
|
%% Original object ID: 13 0
|
||||||
|
17 0 obj
|
||||||
|
<<
|
||||||
|
/Length 18 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT /F1 15 Tf 72 720 Td (Original page 11) Tj ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
18 0 obj
|
||||||
|
48
|
||||||
|
endobj
|
||||||
|
|
||||||
|
xref
|
||||||
|
0 19
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000052 00000 n
|
||||||
|
0000000282 00000 n
|
||||||
|
0000000431 00000 n
|
||||||
|
0000000686 00000 n
|
||||||
|
0000000942 00000 n
|
||||||
|
0000001199 00000 n
|
||||||
|
0000001456 00000 n
|
||||||
|
0000001725 00000 n
|
||||||
|
0000001827 00000 n
|
||||||
|
0000001873 00000 n
|
||||||
|
0000002032 00000 n
|
||||||
|
0000002136 00000 n
|
||||||
|
0000002206 00000 n
|
||||||
|
0000002310 00000 n
|
||||||
|
0000002381 00000 n
|
||||||
|
0000002486 00000 n
|
||||||
|
0000002557 00000 n
|
||||||
|
0000002662 00000 n
|
||||||
|
trailer <<
|
||||||
|
/Root 1 0 R
|
||||||
|
/Size 19
|
||||||
|
/ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
2682
|
||||||
|
%%EOF
|
@ -1,7 +1,7 @@
|
|||||||
%PDF-1.3
|
%PDF-1.3
|
||||||
%¿÷¢þ
|
%¿÷¢þ
|
||||||
1 0 obj
|
1 0 obj
|
||||||
<< /Pages 2 0 R /Type /Catalog >>
|
<< /PageLabels << /Nums [ 0 << /St 1 >> 21 << /P () /St 1 >> 23 << /S /r /St 1 >> 28 << /P () /St 1 >> 30 << /S /r /St 6 >> 32 << /P () /St 1 >> 33 << /S /D /St 2 >> 36 << /S /D /St 6 >> 40 << /P () /St 1 >> 41 << /S /D /St 12 >> 43 << /S /D /St 16059 >> 44 << /S /r /St 50 >> 50 << /S /r /St 54 >> ] >> /Pages 2 0 R /Type /Catalog >>
|
||||||
endobj
|
endobj
|
||||||
2 0 obj
|
2 0 obj
|
||||||
<< /Count 51 /Kids [ 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R ] /Type /Pages >>
|
<< /Count 51 /Kids [ 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R ] /Type /Pages >>
|
||||||
@ -514,115 +514,115 @@ xref
|
|||||||
0 110
|
0 110
|
||||||
0000000000 65535 f
|
0000000000 65535 f
|
||||||
0000000015 00000 n
|
0000000015 00000 n
|
||||||
0000000064 00000 n
|
0000000365 00000 n
|
||||||
0000000468 00000 n
|
0000000769 00000 n
|
||||||
0000000614 00000 n
|
0000000915 00000 n
|
||||||
0000000768 00000 n
|
0000001069 00000 n
|
||||||
0000000922 00000 n
|
0000001223 00000 n
|
||||||
0000001076 00000 n
|
0000001377 00000 n
|
||||||
0000001230 00000 n
|
0000001531 00000 n
|
||||||
0000001384 00000 n
|
0000001685 00000 n
|
||||||
0000001538 00000 n
|
0000001839 00000 n
|
||||||
0000001693 00000 n
|
0000001994 00000 n
|
||||||
0000001848 00000 n
|
0000002149 00000 n
|
||||||
0000002003 00000 n
|
0000002304 00000 n
|
||||||
0000002158 00000 n
|
0000002459 00000 n
|
||||||
0000002313 00000 n
|
0000002614 00000 n
|
||||||
0000002468 00000 n
|
0000002769 00000 n
|
||||||
0000002623 00000 n
|
0000002924 00000 n
|
||||||
0000002778 00000 n
|
0000003079 00000 n
|
||||||
0000002933 00000 n
|
0000003234 00000 n
|
||||||
0000003088 00000 n
|
0000003389 00000 n
|
||||||
0000003243 00000 n
|
0000003544 00000 n
|
||||||
0000003398 00000 n
|
0000003699 00000 n
|
||||||
0000003553 00000 n
|
0000003854 00000 n
|
||||||
0000003708 00000 n
|
0000004009 00000 n
|
||||||
0000003855 00000 n
|
0000004156 00000 n
|
||||||
0000004002 00000 n
|
0000004303 00000 n
|
||||||
0000004149 00000 n
|
0000004450 00000 n
|
||||||
0000004296 00000 n
|
0000004597 00000 n
|
||||||
0000004443 00000 n
|
0000004744 00000 n
|
||||||
0000004590 00000 n
|
0000004891 00000 n
|
||||||
0000004737 00000 n
|
0000005038 00000 n
|
||||||
0000004884 00000 n
|
0000005185 00000 n
|
||||||
0000005031 00000 n
|
0000005332 00000 n
|
||||||
0000005178 00000 n
|
0000005479 00000 n
|
||||||
0000005325 00000 n
|
0000005626 00000 n
|
||||||
0000005472 00000 n
|
0000005773 00000 n
|
||||||
0000005619 00000 n
|
0000005920 00000 n
|
||||||
0000005766 00000 n
|
0000006067 00000 n
|
||||||
0000005913 00000 n
|
0000006214 00000 n
|
||||||
0000006060 00000 n
|
0000006361 00000 n
|
||||||
0000006207 00000 n
|
0000006508 00000 n
|
||||||
0000006354 00000 n
|
0000006655 00000 n
|
||||||
0000006501 00000 n
|
0000006802 00000 n
|
||||||
0000006648 00000 n
|
0000006949 00000 n
|
||||||
0000006796 00000 n
|
0000007097 00000 n
|
||||||
0000006944 00000 n
|
0000007245 00000 n
|
||||||
0000007092 00000 n
|
0000007393 00000 n
|
||||||
0000007240 00000 n
|
0000007541 00000 n
|
||||||
0000007388 00000 n
|
0000007689 00000 n
|
||||||
0000007536 00000 n
|
0000007837 00000 n
|
||||||
0000007684 00000 n
|
0000007985 00000 n
|
||||||
0000007832 00000 n
|
0000008133 00000 n
|
||||||
0000007980 00000 n
|
0000008281 00000 n
|
||||||
0000008128 00000 n
|
0000008429 00000 n
|
||||||
0000008247 00000 n
|
0000008548 00000 n
|
||||||
0000008355 00000 n
|
0000008656 00000 n
|
||||||
0000008386 00000 n
|
0000008687 00000 n
|
||||||
0000008510 00000 n
|
0000008811 00000 n
|
||||||
0000008610 00000 n
|
0000008911 00000 n
|
||||||
0000008734 00000 n
|
0000009035 00000 n
|
||||||
0000008858 00000 n
|
0000009159 00000 n
|
||||||
0000008982 00000 n
|
0000009283 00000 n
|
||||||
0000009106 00000 n
|
0000009407 00000 n
|
||||||
0000009230 00000 n
|
0000009531 00000 n
|
||||||
0000009354 00000 n
|
0000009655 00000 n
|
||||||
0000009478 00000 n
|
0000009779 00000 n
|
||||||
0000009602 00000 n
|
0000009903 00000 n
|
||||||
0000009726 00000 n
|
0000010027 00000 n
|
||||||
0000009851 00000 n
|
0000010152 00000 n
|
||||||
0000009976 00000 n
|
0000010277 00000 n
|
||||||
0000010101 00000 n
|
0000010402 00000 n
|
||||||
0000010226 00000 n
|
0000010527 00000 n
|
||||||
0000010351 00000 n
|
0000010652 00000 n
|
||||||
0000010475 00000 n
|
0000010776 00000 n
|
||||||
0000010600 00000 n
|
0000010901 00000 n
|
||||||
0000010725 00000 n
|
0000011026 00000 n
|
||||||
0000010850 00000 n
|
0000011151 00000 n
|
||||||
0000010975 00000 n
|
0000011276 00000 n
|
||||||
0000011096 00000 n
|
0000011397 00000 n
|
||||||
0000011204 00000 n
|
0000011505 00000 n
|
||||||
0000011235 00000 n
|
0000011536 00000 n
|
||||||
0000011356 00000 n
|
0000011657 00000 n
|
||||||
0000011477 00000 n
|
0000011778 00000 n
|
||||||
0000011598 00000 n
|
0000011899 00000 n
|
||||||
0000011719 00000 n
|
0000012020 00000 n
|
||||||
0000011840 00000 n
|
0000012141 00000 n
|
||||||
0000011961 00000 n
|
0000012262 00000 n
|
||||||
0000012082 00000 n
|
0000012383 00000 n
|
||||||
0000012203 00000 n
|
0000012504 00000 n
|
||||||
0000012324 00000 n
|
0000012625 00000 n
|
||||||
0000012446 00000 n
|
0000012747 00000 n
|
||||||
0000012568 00000 n
|
0000012869 00000 n
|
||||||
0000012690 00000 n
|
0000012991 00000 n
|
||||||
0000012812 00000 n
|
0000013113 00000 n
|
||||||
0000012934 00000 n
|
0000013235 00000 n
|
||||||
0000013056 00000 n
|
0000013357 00000 n
|
||||||
0000013178 00000 n
|
0000013479 00000 n
|
||||||
0000013300 00000 n
|
0000013601 00000 n
|
||||||
0000013422 00000 n
|
0000013723 00000 n
|
||||||
0000013544 00000 n
|
0000013845 00000 n
|
||||||
0000013667 00000 n
|
0000013968 00000 n
|
||||||
0000013790 00000 n
|
0000014091 00000 n
|
||||||
0000013913 00000 n
|
0000014214 00000 n
|
||||||
0000014036 00000 n
|
0000014337 00000 n
|
||||||
0000014158 00000 n
|
0000014459 00000 n
|
||||||
0000014281 00000 n
|
0000014582 00000 n
|
||||||
0000014404 00000 n
|
0000014705 00000 n
|
||||||
0000014527 00000 n
|
0000014828 00000 n
|
||||||
0000014650 00000 n
|
0000014951 00000 n
|
||||||
trailer << /Root 1 0 R /Size 110 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >>
|
trailer << /Root 1 0 R /Size 110 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >>
|
||||||
startxref
|
startxref
|
||||||
14773
|
15074
|
||||||
%%EOF
|
%%EOF
|
||||||
|
BIN
qpdf/qtest/qpdf/merge-multiple-labels.pdf
Normal file
BIN
qpdf/qtest/qpdf/merge-multiple-labels.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user