From a85007cb0d9bb8af8f0a32bda3ace19aaff97816 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 15 Jun 2013 12:38:25 -0400 Subject: Handle more broken files Space rather than newline after xref, missing /ID in trailer for encrypted file. This enables qpdf to handle some files that xpdf can handle. Adobe reader can't necessarily handle them. --- libqpdf/QPDF.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'libqpdf/QPDF.cc') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 00e13ca0..ad742daa 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -430,11 +430,22 @@ QPDF::read_xref(qpdf_offset_t xref_offset) std::map free_table; while (xref_offset) { + char buf[7]; + memset(buf, 0, sizeof(buf)); this->file->seek(xref_offset, SEEK_SET); - std::string line = this->file->readLine(50); - if (line == "xref") + this->file->read(buf, sizeof(buf) - 1); + // The PDF spec says xref must be followed by a line + // terminator, but files exist in the wild where it is + // terminated by arbitrary whitespace. + PCRE xref_re("^xref\\s+"); + PCRE::Match m = xref_re.match(buf); + if (m) { - xref_offset = read_xrefTable(this->file->tell()); + QTC::TC("qpdf", "QPDF xref space", + ((buf[4] == '\n') ? 0 : + (buf[4] == '\r') ? 1 : + (buf[4] == ' ') ? 2 : 9999)); + xref_offset = read_xrefTable(xref_offset + m.getMatch(0).length()); } else { -- cgit v1.2.3-70-g09d2