mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
In qdf mode, don't write extra XRef streams (fixes #386)
fix-qdf assumes there is exactly one XRef stream and that it is at the end of the file.
This commit is contained in:
parent
bbc2f8ffae
commit
57c01ef81f
@ -1,5 +1,12 @@
|
||||
2020-01-26 Jay Berkenbilt <ejb@ql.org>
|
||||
|
||||
* Bug fix: in qdf mode, do not write out any XRef streams that may
|
||||
have appeared in the original file. These are usually
|
||||
unreferenced, but with --preserve-unreferenced, they could be
|
||||
written out, which breaks fix-qdf's assumption that there is at
|
||||
most one XRef stream and that it appears at the end of the file.
|
||||
Fixes #386.
|
||||
|
||||
* Bug fix: when externalizing inline images, a colorspace value
|
||||
that was a lookup key in the page's /Resource -> /ColorSpace
|
||||
dictionary was not properly handled. Fixes #392.
|
||||
|
@ -1241,6 +1241,21 @@ QPDFWriter::enqueueObject(QPDFObjectHandle object)
|
||||
" another file.");
|
||||
}
|
||||
|
||||
if (this->m->qdf_mode &&
|
||||
object.isStream() && object.getDict().getKey("/Type").isName() &&
|
||||
(object.getDict().getKey("/Type").getName() == "/XRef"))
|
||||
{
|
||||
// As a special case, do not output any extraneous XRef
|
||||
// streams in QDF mode. Doing so will confuse fix-qdf,
|
||||
// which expects to see only one XRef stream at the end of
|
||||
// the file. This case can occur when creating a QDF from
|
||||
// a file with object streams when preserving unreferenced
|
||||
// objects since the old cross reference streams are not
|
||||
// actually referenced by object number.
|
||||
QTC::TC("qpdf", "QPDFWriter ignore XRef in qdf mode");
|
||||
return;
|
||||
}
|
||||
|
||||
QPDFObjGen og = object.getObjGen();
|
||||
|
||||
if (this->m->obj_renumber.count(og) == 0)
|
||||
|
@ -448,3 +448,4 @@ QPDFWriter stream in ostream 0
|
||||
QPDFObjectHandle duplicate dict key 0
|
||||
QPDFWriter no encryption sig contents 0
|
||||
QPDFPageObjectHelper colorspace lookup 0
|
||||
QPDFWriter ignore XRef in qdf mode 0
|
||||
|
@ -2779,7 +2779,7 @@ for (my $n = 16; $n <= 19; ++$n)
|
||||
show_ntests();
|
||||
# ----------
|
||||
$td->notify("--- Specific File Tests ---");
|
||||
$n_tests += 4;
|
||||
$n_tests += 7;
|
||||
|
||||
# Special PDF files that caused problems at some point
|
||||
|
||||
@ -2800,6 +2800,16 @@ $td->runtest("compress objstm and xref",
|
||||
$td->runtest("check output",
|
||||
{$td->FILE => "a.pdf"},
|
||||
{$td->FILE => "compress-objstm-xref.pdf"});
|
||||
$td->runtest("qdf + preserved-unreferenced + xref streams",
|
||||
{$td->COMMAND => "qpdf --qdf --preserve-unreferenced" .
|
||||
" --static-id compress-objstm-xref.pdf a.pdf"},
|
||||
{$td->STRING => "", $td->EXIT_STATUS => 0});
|
||||
$td->runtest("check output",
|
||||
{$td->FILE => "a.pdf"},
|
||||
{$td->FILE => "compress-objstm-xref-qdf.pdf"});
|
||||
$td->runtest("check fix-qdf idempotency",
|
||||
{$td->COMMAND => "fix-qdf a.pdf"},
|
||||
{$td->FILE => "a.pdf", $td->EXIT_STATUS => 0});
|
||||
|
||||
show_ntests();
|
||||
# ----------
|
||||
|
BIN
qpdf/qtest/qpdf/compress-objstm-xref-qdf.pdf
Normal file
BIN
qpdf/qtest/qpdf/compress-objstm-xref-qdf.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user