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:
Jay Berkenbilt 2020-01-26 16:43:55 -05:00
parent bbc2f8ffae
commit 57c01ef81f
5 changed files with 34 additions and 1 deletions

View File

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

View File

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

View File

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

View File

@ -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();
# ----------

Binary file not shown.