diff --git a/Userland/Libraries/LibPDF/Parser.cpp b/Userland/Libraries/LibPDF/Parser.cpp index 16b678ec53..6c79431392 100644 --- a/Userland/Libraries/LibPDF/Parser.cpp +++ b/Userland/Libraries/LibPDF/Parser.cpp @@ -435,6 +435,46 @@ PDFErrorOr> Parser::parse_dict() return make_object(move(map)); } +PDFErrorOr Parser::unfilter_stream(NonnullRefPtr stream_object) +{ + auto const& dict = stream_object->dict(); + if (!dict->contains(CommonNames::Filter)) + return {}; + + Vector filters = TRY(m_document->read_filters(dict)); + + // Every filter may get its own parameter dictionary + Vector> decode_parms_vector; + RefPtr decode_parms_object; + if (dict->contains(CommonNames::DecodeParms)) { + decode_parms_object = TRY(dict->get_object(m_document, CommonNames::DecodeParms)); + if (decode_parms_object->is()) { + auto decode_parms_array = decode_parms_object->cast(); + for (size_t i = 0; i < decode_parms_array->size(); ++i) { + RefPtr decode_parms; + auto entry = decode_parms_array->at(i); + if (entry.has>()) + decode_parms = entry.get>()->cast(); + decode_parms_vector.append(decode_parms); + } + } else { + decode_parms_vector.append(decode_parms_object->cast()); + } + } + + VERIFY(decode_parms_vector.is_empty() || decode_parms_vector.size() == filters.size()); + + for (size_t i = 0; i < filters.size(); ++i) { + RefPtr decode_parms; + if (!decode_parms_vector.is_empty()) + decode_parms = decode_parms_vector.at(i); + + stream_object->buffer() = TRY(Filter::decode(stream_object->bytes(), filters.at(i), decode_parms)); + } + + return {}; +} + PDFErrorOr> Parser::parse_stream(NonnullRefPtr dict) { if (!m_reader.matches("stream")) @@ -474,38 +514,8 @@ PDFErrorOr> Parser::parse_stream(NonnullRefPtrsecurity_handler() && m_enable_encryption) m_document->security_handler()->decrypt(stream_object, m_current_reference_stack.last()); - if (dict->contains(CommonNames::Filter) && m_enable_filters) { - Vector filters = TRY(m_document->read_filters(dict)); - - // Every filter may get its own parameter dictionary - Vector> decode_parms_vector; - RefPtr decode_parms_object; - if (dict->contains(CommonNames::DecodeParms)) { - decode_parms_object = TRY(dict->get_object(m_document, CommonNames::DecodeParms)); - if (decode_parms_object->is()) { - auto decode_parms_array = decode_parms_object->cast(); - for (size_t i = 0; i < decode_parms_array->size(); ++i) { - RefPtr decode_parms; - auto entry = decode_parms_array->at(i); - if (entry.has>()) - decode_parms = entry.get>()->cast(); - decode_parms_vector.append(decode_parms); - } - } else { - decode_parms_vector.append(decode_parms_object->cast()); - } - } - - VERIFY(decode_parms_vector.is_empty() || decode_parms_vector.size() == filters.size()); - - for (size_t i = 0; i < filters.size(); ++i) { - RefPtr decode_parms; - if (!decode_parms_vector.is_empty()) - decode_parms = decode_parms_vector.at(i); - - stream_object->buffer() = TRY(Filter::decode(stream_object->bytes(), filters.at(i), decode_parms)); - } - } + if (m_enable_filters) + TRY(unfilter_stream(stream_object)); return stream_object; } diff --git a/Userland/Libraries/LibPDF/Parser.h b/Userland/Libraries/LibPDF/Parser.h index 1e24d913aa..9f3fe69cc1 100644 --- a/Userland/Libraries/LibPDF/Parser.h +++ b/Userland/Libraries/LibPDF/Parser.h @@ -55,6 +55,7 @@ public: PDFErrorOr> parse_array(); PDFErrorOr> parse_dict_contents_until(char const*); PDFErrorOr> parse_dict(); + PDFErrorOr unfilter_stream(NonnullRefPtr); PDFErrorOr> parse_stream(NonnullRefPtr dict); PDFErrorOr> parse_operators();