diff --git a/ChangeLog b/ChangeLog index 96e7f82f..deece77c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-06-09 Jay Berkenbilt + + * When /DecodeParms is an empty list, ignore it on read and delete + it on write. Fixes #331. + 2019-05-18 Jay Berkenbilt * 8.4.2: release diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index fee287bc..0cc0547d 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -1604,6 +1604,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, // Suppress /Length since we will write it manually object.removeKey("/Length"); + // If /DecodeParms is an empty list, remove it. + if (object.getKey("/DecodeParms").isArray() && + (0 == object.getKey("/DecodeParms").getArrayNItems())) + { + QTC::TC("qpdf", "QPDFWriter remove empty DecodeParms"); + object.removeKey("/DecodeParms"); + } + if (flags & f_filtered) { // We will supply our own filter and decode diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 3733940d..3ddb1498 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -391,6 +391,10 @@ QPDF_Stream::filterable(std::vector& filters, QPDFObjectHandle decode_obj = this->stream_dict.getKey("/DecodeParms"); std::vector decode_parms; + if (decode_obj.isArray() && (decode_obj.getArrayNItems() == 0)) + { + decode_obj = QPDFObjectHandle::newNull(); + } if (decode_obj.isArray()) { for (int i = 0; i < decode_obj.getArrayNItems(); ++i) diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index b62dc663..f6a1cedf 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -439,3 +439,4 @@ QPDFPageObjectHelper externalize inline image 0 QPDFPageObjectHelper keep inline image 0 qpdf image optimize colorspace 0 qpdf image optimize bits per component 0 +QPDFWriter remove empty DecodeParms 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index e95c22bc..fa2b5113 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -847,7 +847,7 @@ $td->runtest("get stream data", show_ntests(); # ---------- $td->notify("--- Decode parameter problems ---"); -$n_tests += 4; +$n_tests += 6; # Make sure we ignore decode parameters that we don't understand $td->runtest("unknown decode parameters", @@ -870,6 +870,13 @@ $td->runtest("check file", {$td->FILE => "a.pdf"}, {$td->FILE => "indirect-decode-parms-out.pdf"}); +$td->runtest("decode parameters empty list", + {$td->COMMAND => "qpdf --static-id empty-decode-parms.pdf a.pdf"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); +$td->runtest("check file", + {$td->FILE => "a.pdf"}, + {$td->FILE => "empty-decode-parms-out.pdf"}); + show_ntests(); # ---------- $td->notify("--- Cross reference streams ---");