1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:07:35 +00:00

LibPDF: Make PDF version accessible on Document

This commit is contained in:
Nico Weber 2023-07-11 12:37:13 -04:00 committed by Tim Flynn
parent 9174ffd7e6
commit ea89053c12
4 changed files with 26 additions and 15 deletions

View file

@ -21,22 +21,25 @@ DocumentParser::DocumentParser(Document* document, ReadonlyBytes bytes)
{
}
PDFErrorOr<void> DocumentParser::initialize()
PDFErrorOr<Version> DocumentParser::initialize()
{
m_reader.set_reading_forwards();
if (m_reader.remaining() == 0)
return error("Empty PDF document");
auto maybe_error = parse_header();
if (maybe_error.is_error()) {
warnln("{}", maybe_error.error().message());
auto maybe_version = parse_header();
if (maybe_version.is_error()) {
warnln("{}", maybe_version.error().message());
warnln("No valid PDF header detected, continuing anyway.");
maybe_version = Version { 1, 6 }; // ¯\_(ツ)_/¯
}
auto const linearization_result = TRY(initialize_linearization_dict());
if (linearization_result == LinearizationResult::NotLinearized)
return initialize_non_linearized_xref_table();
if (linearization_result == LinearizationResult::NotLinearized) {
TRY(initialize_non_linearized_xref_table());
return maybe_version.value();
}
bool is_linearized = m_linearization_dictionary.has_value();
if (is_linearized) {
@ -53,9 +56,11 @@ PDFErrorOr<void> DocumentParser::initialize()
}
if (is_linearized)
return initialize_linearized_xref_table();
TRY(initialize_linearized_xref_table());
else
TRY(initialize_non_linearized_xref_table());
return initialize_non_linearized_xref_table();
return maybe_version.value();
}
PDFErrorOr<Value> DocumentParser::parse_object_with_index(u32 index)
@ -73,9 +78,8 @@ PDFErrorOr<Value> DocumentParser::parse_object_with_index(u32 index)
return indirect_value->value();
}
PDFErrorOr<void> DocumentParser::parse_header()
PDFErrorOr<Version> DocumentParser::parse_header()
{
// FIXME: Do something with the version?
m_reader.move_to(0);
if (m_reader.remaining() < 8 || !m_reader.matches("%PDF-"))
return error("Not a PDF document");
@ -106,7 +110,7 @@ PDFErrorOr<void> DocumentParser::parse_header()
}
}
return {};
return Version { major_ver - '0', minor_ver - '0' };
}
PDFErrorOr<DocumentParser::LinearizationResult> DocumentParser::initialize_linearization_dict()