Commit 31bde2f9d7517d3cf2433c2ea787eb9542532496
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.
Showing
5 changed files
with
26 additions
and
1 deletions
ChangeLog
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<std::string>& 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
qpdf/qtest/qpdf.test
| ... | ... | @@ -847,7 +847,7 @@ $td->runtest("get stream data", |
| 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->runtest("check file", |
| 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 ---"); | ... | ... |