2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-12-22 10:58:58 +00:00

Move QPDF::readTrailer to QPDF::Xref_table

This commit is contained in:
m-holger 2024-08-12 16:01:37 +01:00
parent 3ddc51a9dc
commit d64b14912d
3 changed files with 11 additions and 10 deletions

View File

@ -760,7 +760,6 @@ class QPDF
void parse(char const* password);
void inParse(bool);
void setLastObjectDescription(std::string const& description, QPDFObjGen const& og);
QPDFObjectHandle readTrailer();
QPDFObjectHandle readObject(std::string const& description, QPDFObjGen og);
void readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset);
void validateStreamLineEnd(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset);

View File

@ -596,7 +596,7 @@ QPDF::Xref_table::reconstruct(QPDFExc& e)
file->seek(pos, SEEK_SET);
} else if (!trailer && t1.isWord("trailer")) {
auto pos = file->tell();
QPDFObjectHandle t = qpdf.readTrailer();
QPDFObjectHandle t = read_trailer();
if (!t.isDictionary()) {
// Oh well. It was worth a try.
} else {
@ -994,7 +994,7 @@ QPDF::Xref_table::read_table(qpdf_offset_t xref_offset)
}
// Set offset to previous xref table if any
auto cur_trailer = qpdf.readTrailer();
auto cur_trailer = read_trailer();
if (!cur_trailer.isDictionary()) {
QTC::TC("qpdf", "QPDF missing trailer");
throw qpdf.damagedPDF("", "expected trailer dictionary");
@ -1456,21 +1456,21 @@ QPDF::setLastObjectDescription(std::string const& description, QPDFObjGen const&
}
QPDFObjectHandle
QPDF::readTrailer()
QPDF::Xref_table::read_trailer()
{
qpdf_offset_t offset = m->file->tell();
qpdf_offset_t offset = file->tell();
bool empty = false;
auto object =
QPDFParser(*m->file, "trailer", m->tokenizer, nullptr, this, true).parse(empty, false);
QPDFParser(*qpdf.m->file, "trailer", *tokenizer, nullptr, &qpdf, true).parse(empty, false);
if (empty) {
// Nothing in the PDF spec appears to allow empty objects, but they have been encountered in
// actual PDF files and Adobe Reader appears to ignore them.
warn(damagedPDF("trailer", "empty object treated as null"));
} else if (object.isDictionary() && readToken(*m->file).isWord("stream")) {
warn(damagedPDF("trailer", m->file->tell(), "stream keyword found in trailer"));
qpdf.warn(qpdf.damagedPDF("trailer", "empty object treated as null"));
} else if (object.isDictionary() && read_token().isWord("stream")) {
qpdf.warn(qpdf.damagedPDF("trailer", file->tell(), "stream keyword found in trailer"));
}
// Override last_offset so that it points to the beginning of the object we just read
m->file->setLastOffset(offset);
file->setLastOffset(offset);
return object;
}

View File

@ -54,6 +54,8 @@ class QPDF::Xref_table: public std::map<QPDFObjGen, QPDFXRefEntry>
int max_num_entries,
std::function<QPDFExc(std::string_view)> damaged);
QPDFObjectHandle read_trailer();
QPDFTokenizer::Token
read_token(size_t max_len = 0)
{