Commit 57c01ef81ff11b208188bbdedc98b6ce20c786b3

Authored by Jay Berkenbilt
1 parent bbc2f8ff

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.
ChangeLog
1 1 2020-01-26 Jay Berkenbilt <ejb@ql.org>
2 2  
  3 + * Bug fix: in qdf mode, do not write out any XRef streams that may
  4 + have appeared in the original file. These are usually
  5 + unreferenced, but with --preserve-unreferenced, they could be
  6 + written out, which breaks fix-qdf's assumption that there is at
  7 + most one XRef stream and that it appears at the end of the file.
  8 + Fixes #386.
  9 +
3 10 * Bug fix: when externalizing inline images, a colorspace value
4 11 that was a lookup key in the page's /Resource -> /ColorSpace
5 12 dictionary was not properly handled. Fixes #392.
... ...
libqpdf/QPDFWriter.cc
... ... @@ -1241,6 +1241,21 @@ QPDFWriter::enqueueObject(QPDFObjectHandle object)
1241 1241 " another file.");
1242 1242 }
1243 1243  
  1244 + if (this->m->qdf_mode &&
  1245 + object.isStream() && object.getDict().getKey("/Type").isName() &&
  1246 + (object.getDict().getKey("/Type").getName() == "/XRef"))
  1247 + {
  1248 + // As a special case, do not output any extraneous XRef
  1249 + // streams in QDF mode. Doing so will confuse fix-qdf,
  1250 + // which expects to see only one XRef stream at the end of
  1251 + // the file. This case can occur when creating a QDF from
  1252 + // a file with object streams when preserving unreferenced
  1253 + // objects since the old cross reference streams are not
  1254 + // actually referenced by object number.
  1255 + QTC::TC("qpdf", "QPDFWriter ignore XRef in qdf mode");
  1256 + return;
  1257 + }
  1258 +
1244 1259 QPDFObjGen og = object.getObjGen();
1245 1260  
1246 1261 if (this->m->obj_renumber.count(og) == 0)
... ...
qpdf/qpdf.testcov
... ... @@ -448,3 +448,4 @@ QPDFWriter stream in ostream 0
448 448 QPDFObjectHandle duplicate dict key 0
449 449 QPDFWriter no encryption sig contents 0
450 450 QPDFPageObjectHelper colorspace lookup 0
  451 +QPDFWriter ignore XRef in qdf mode 0
... ...
qpdf/qtest/qpdf.test
... ... @@ -2779,7 +2779,7 @@ for (my $n = 16; $n &lt;= 19; ++$n)
2779 2779 show_ntests();
2780 2780 # ----------
2781 2781 $td->notify("--- Specific File Tests ---");
2782   -$n_tests += 4;
  2782 +$n_tests += 7;
2783 2783  
2784 2784 # Special PDF files that caused problems at some point
2785 2785  
... ... @@ -2800,6 +2800,16 @@ $td-&gt;runtest(&quot;compress objstm and xref&quot;,
2800 2800 $td->runtest("check output",
2801 2801 {$td->FILE => "a.pdf"},
2802 2802 {$td->FILE => "compress-objstm-xref.pdf"});
  2803 +$td->runtest("qdf + preserved-unreferenced + xref streams",
  2804 + {$td->COMMAND => "qpdf --qdf --preserve-unreferenced" .
  2805 + " --static-id compress-objstm-xref.pdf a.pdf"},
  2806 + {$td->STRING => "", $td->EXIT_STATUS => 0});
  2807 +$td->runtest("check output",
  2808 + {$td->FILE => "a.pdf"},
  2809 + {$td->FILE => "compress-objstm-xref-qdf.pdf"});
  2810 +$td->runtest("check fix-qdf idempotency",
  2811 + {$td->COMMAND => "fix-qdf a.pdf"},
  2812 + {$td->FILE => "a.pdf", $td->EXIT_STATUS => 0});
2803 2813  
2804 2814 show_ntests();
2805 2815 # ----------
... ...
qpdf/qtest/qpdf/compress-objstm-xref-qdf.pdf 0 → 100644
No preview for this file type