Commit 31bde2f9d7517d3cf2433c2ea787eb9542532496

Authored by Jay Berkenbilt
1 parent 74cc3440

Handle empty DecodeParams array for (fixes #331)

On read, ignore /DecodeParms when empty list; on write, delete it.
Some files have been found that include an empty list for
/DecodeParms, but this is not technically compliant with the spec, and
the only sensible interpretation is to treat it as if there are no
decode parameters.
ChangeLog
  1 +2019-06-09 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * When /DecodeParms is an empty list, ignore it on read and delete
  4 + it on write. Fixes #331.
  5 +
1 6 2019-05-18 Jay Berkenbilt <ejb@ql.org>
2 7  
3 8 * 8.4.2: release
... ...
libqpdf/QPDFWriter.cc
... ... @@ -1604,6 +1604,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
1604 1604 // Suppress /Length since we will write it manually
1605 1605 object.removeKey("/Length");
1606 1606  
  1607 + // If /DecodeParms is an empty list, remove it.
  1608 + if (object.getKey("/DecodeParms").isArray() &&
  1609 + (0 == object.getKey("/DecodeParms").getArrayNItems()))
  1610 + {
  1611 + QTC::TC("qpdf", "QPDFWriter remove empty DecodeParms");
  1612 + object.removeKey("/DecodeParms");
  1613 + }
  1614 +
1607 1615 if (flags & f_filtered)
1608 1616 {
1609 1617 // We will supply our own filter and decode
... ...
libqpdf/QPDF_Stream.cc
... ... @@ -391,6 +391,10 @@ QPDF_Stream::filterable(std::vector&lt;std::string&gt;&amp; filters,
391 391  
392 392 QPDFObjectHandle decode_obj = this->stream_dict.getKey("/DecodeParms");
393 393 std::vector<QPDFObjectHandle> decode_parms;
  394 + if (decode_obj.isArray() && (decode_obj.getArrayNItems() == 0))
  395 + {
  396 + decode_obj = QPDFObjectHandle::newNull();
  397 + }
394 398 if (decode_obj.isArray())
395 399 {
396 400 for (int i = 0; i < decode_obj.getArrayNItems(); ++i)
... ...
qpdf/qpdf.testcov
... ... @@ -439,3 +439,4 @@ QPDFPageObjectHelper externalize inline image 0
439 439 QPDFPageObjectHelper keep inline image 0
440 440 qpdf image optimize colorspace 0
441 441 qpdf image optimize bits per component 0
  442 +QPDFWriter remove empty DecodeParms 0
... ...
qpdf/qtest/qpdf.test
... ... @@ -847,7 +847,7 @@ $td-&gt;runtest(&quot;get stream data&quot;,
847 847 show_ntests();
848 848 # ----------
849 849 $td->notify("--- Decode parameter problems ---");
850   -$n_tests += 4;
  850 +$n_tests += 6;
851 851  
852 852 # Make sure we ignore decode parameters that we don't understand
853 853 $td->runtest("unknown decode parameters",
... ... @@ -870,6 +870,13 @@ $td-&gt;runtest(&quot;check file&quot;,
870 870 {$td->FILE => "a.pdf"},
871 871 {$td->FILE => "indirect-decode-parms-out.pdf"});
872 872  
  873 +$td->runtest("decode parameters empty list",
  874 + {$td->COMMAND => "qpdf --static-id empty-decode-parms.pdf a.pdf"},
  875 + {$td->STRING => "", $td->EXIT_STATUS => 0});
  876 +$td->runtest("check file",
  877 + {$td->FILE => "a.pdf"},
  878 + {$td->FILE => "empty-decode-parms-out.pdf"});
  879 +
873 880 show_ntests();
874 881 # ----------
875 882 $td->notify("--- Cross reference streams ---");
... ...