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,6 +1604,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, | ||
| 1604 | // Suppress /Length since we will write it manually | 1604 | // Suppress /Length since we will write it manually |
| 1605 | object.removeKey("/Length"); | 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 | if (flags & f_filtered) | 1615 | if (flags & f_filtered) |
| 1608 | { | 1616 | { |
| 1609 | // We will supply our own filter and decode | 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,6 +391,10 @@ QPDF_Stream::filterable(std::vector<std::string>& filters, | ||
| 391 | 391 | ||
| 392 | QPDFObjectHandle decode_obj = this->stream_dict.getKey("/DecodeParms"); | 392 | QPDFObjectHandle decode_obj = this->stream_dict.getKey("/DecodeParms"); |
| 393 | std::vector<QPDFObjectHandle> decode_parms; | 393 | std::vector<QPDFObjectHandle> decode_parms; |
| 394 | + if (decode_obj.isArray() && (decode_obj.getArrayNItems() == 0)) | ||
| 395 | + { | ||
| 396 | + decode_obj = QPDFObjectHandle::newNull(); | ||
| 397 | + } | ||
| 394 | if (decode_obj.isArray()) | 398 | if (decode_obj.isArray()) |
| 395 | { | 399 | { |
| 396 | for (int i = 0; i < decode_obj.getArrayNItems(); ++i) | 400 | for (int i = 0; i < decode_obj.getArrayNItems(); ++i) |
qpdf/qpdf.testcov
| @@ -439,3 +439,4 @@ QPDFPageObjectHelper externalize inline image 0 | @@ -439,3 +439,4 @@ QPDFPageObjectHelper externalize inline image 0 | ||
| 439 | QPDFPageObjectHelper keep inline image 0 | 439 | QPDFPageObjectHelper keep inline image 0 |
| 440 | qpdf image optimize colorspace 0 | 440 | qpdf image optimize colorspace 0 |
| 441 | qpdf image optimize bits per component 0 | 441 | qpdf image optimize bits per component 0 |
| 442 | +QPDFWriter remove empty DecodeParms 0 |
qpdf/qtest/qpdf.test
| @@ -847,7 +847,7 @@ $td->runtest("get stream data", | @@ -847,7 +847,7 @@ $td->runtest("get stream data", | ||
| 847 | show_ntests(); | 847 | show_ntests(); |
| 848 | # ---------- | 848 | # ---------- |
| 849 | $td->notify("--- Decode parameter problems ---"); | 849 | $td->notify("--- Decode parameter problems ---"); |
| 850 | -$n_tests += 4; | 850 | +$n_tests += 6; |
| 851 | 851 | ||
| 852 | # Make sure we ignore decode parameters that we don't understand | 852 | # Make sure we ignore decode parameters that we don't understand |
| 853 | $td->runtest("unknown decode parameters", | 853 | $td->runtest("unknown decode parameters", |
| @@ -870,6 +870,13 @@ $td->runtest("check file", | @@ -870,6 +870,13 @@ $td->runtest("check file", | ||
| 870 | {$td->FILE => "a.pdf"}, | 870 | {$td->FILE => "a.pdf"}, |
| 871 | {$td->FILE => "indirect-decode-parms-out.pdf"}); | 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 | show_ntests(); | 880 | show_ntests(); |
| 874 | # ---------- | 881 | # ---------- |
| 875 | $td->notify("--- Cross reference streams ---"); | 882 | $td->notify("--- Cross reference streams ---"); |