mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 04:57:44 +00:00
LibPDF: Refine the distinction between the Document and Parser
The Parser should hold information relevant for parsing, whereas the Document should hold information relevant for displaying pages. With this in mind, there is no reason for the Document to hold the xref table and trailer. These objects have been moved to the Parser, which allows the Parser to expose less public methods (which will be even more evident once linearized PDFs are supported).
This commit is contained in:
parent
69410d7f4e
commit
78bc9d1539
4 changed files with 43 additions and 56 deletions
|
@ -38,43 +38,47 @@ Parser::Parser(const ReadonlyBytes& bytes)
|
|||
{
|
||||
}
|
||||
|
||||
bool Parser::perform_validation()
|
||||
bool Parser::initialize()
|
||||
{
|
||||
return !sloppy_is_linearized() && parse_header();
|
||||
}
|
||||
if (!parse_header())
|
||||
return {};
|
||||
|
||||
Optional<Parser::XRefTableAndTrailer> Parser::parse_last_xref_table_and_trailer()
|
||||
{
|
||||
m_reader.move_to(m_reader.bytes().size() - 1);
|
||||
if (!navigate_to_before_eof_marker())
|
||||
return {};
|
||||
return false;
|
||||
if (!navigate_to_after_startxref())
|
||||
return {};
|
||||
return false;
|
||||
if (m_reader.done())
|
||||
return {};
|
||||
return false;
|
||||
|
||||
m_reader.set_reading_forwards();
|
||||
auto xref_offset_value = parse_number();
|
||||
if (!xref_offset_value.is_int())
|
||||
return {};
|
||||
return false;
|
||||
auto xref_offset = xref_offset_value.as_int();
|
||||
|
||||
m_reader.move_to(xref_offset);
|
||||
auto xref_table = parse_xref_table();
|
||||
if (!xref_table.has_value())
|
||||
return {};
|
||||
return false;
|
||||
auto trailer = parse_file_trailer();
|
||||
if (!trailer)
|
||||
return {};
|
||||
return false;
|
||||
|
||||
return XRefTableAndTrailer { xref_table.value(), trailer.release_nonnull() };
|
||||
m_xref_table = xref_table.value();
|
||||
m_trailer = trailer;
|
||||
return true;
|
||||
}
|
||||
|
||||
RefPtr<IndirectValue> Parser::parse_indirect_value_at_offset(size_t offset)
|
||||
Value Parser::parse_object_with_index(u32 index)
|
||||
{
|
||||
m_reader.set_reading_forwards();
|
||||
m_reader.move_to(offset);
|
||||
return parse_indirect_value();
|
||||
VERIFY(m_xref_table.has_object(index));
|
||||
auto byte_offset = m_xref_table.byte_offset_for_object(index);
|
||||
m_reader.move_to(byte_offset);
|
||||
auto indirect_value = parse_indirect_value();
|
||||
VERIFY(indirect_value);
|
||||
VERIFY(indirect_value->index() == index);
|
||||
return indirect_value->value();
|
||||
}
|
||||
|
||||
bool Parser::parse_header()
|
||||
|
@ -647,11 +651,14 @@ RefPtr<DictObject> Parser::parse_dict()
|
|||
return make_object<DictObject>(map);
|
||||
}
|
||||
|
||||
RefPtr<DictObject> Parser::conditionally_parse_page_tree_node_at_offset(size_t offset, bool& ok)
|
||||
RefPtr<DictObject> Parser::conditionally_parse_page_tree_node(u32 object_index, bool& ok)
|
||||
{
|
||||
ok = true;
|
||||
|
||||
m_reader.move_to(offset);
|
||||
VERIFY(m_xref_table.has_object(object_index));
|
||||
auto byte_offset = m_xref_table.byte_offset_for_object(object_index);
|
||||
|
||||
m_reader.move_to(byte_offset);
|
||||
parse_number();
|
||||
parse_number();
|
||||
if (!m_reader.matches("obj")) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue