diff --git a/Userland/Libraries/LibPDF/Document.cpp b/Userland/Libraries/LibPDF/Document.cpp index bdf0eea509..e0425ab605 100644 --- a/Userland/Libraries/LibPDF/Document.cpp +++ b/Userland/Libraries/LibPDF/Document.cpp @@ -419,7 +419,11 @@ PDFErrorOr Document::build_outline() if (!m_catalog->contains(CommonNames::Outlines)) return {}; - auto outline_dict = TRY(m_catalog->get_dict(this, CommonNames::Outlines)); + auto outlines = TRY(resolve(m_catalog->get_value(CommonNames::Outlines))); + if (outlines.has()) + return {}; + + auto outline_dict = cast_to(outlines); if (!outline_dict->contains(CommonNames::First)) return {}; if (!outline_dict->contains(CommonNames::Last)) diff --git a/Userland/Libraries/LibPDF/DocumentParser.cpp b/Userland/Libraries/LibPDF/DocumentParser.cpp index b711180358..5b59bac0ee 100644 --- a/Userland/Libraries/LibPDF/DocumentParser.cpp +++ b/Userland/Libraries/LibPDF/DocumentParser.cpp @@ -65,6 +65,12 @@ PDFErrorOr DocumentParser::parse_object_with_index(u32 index) { VERIFY(m_xref_table->has_object(index)); + // PDF spec 1.7, Indirect Objects: + // "An indirect reference to an undefined object is not an error; it is simply treated as a reference to the null object." + // FIXME: Should this apply to the !has_object() case right above too? + if (!m_xref_table->is_object_in_use(index)) + return nullptr; + if (m_xref_table->is_object_compressed(index)) // The object can be found in a object stream return parse_compressed_object_with_index(index);