From 2643ed4dd9bd1a8e9bb3dcd95794273e9cf5de0c Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 8 Jul 2023 00:38:50 +0100 Subject: [PATCH] Add new private method QPDF::readTrailer() --- include/qpdf/QPDF.hh | 1 + libqpdf/QPDF.cc | 23 ++- qpdf/qtest/qpdf/issue-100.out | 14 +- qpdf/qtest/qpdf/issue-101.out | 40 +---- qpdf/qtest/qpdf/issue-335a.out | 299 +-------------------------------- 5 files changed, 25 insertions(+), 352 deletions(-) diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index afe9e8ec..c836b5fd 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -1006,6 +1006,7 @@ class QPDF void insertFreeXrefEntry(QPDFObjGen); void insertReconstructedXrefEntry(int obj, qpdf_offset_t f1, int f2); void setLastObjectDescription(std::string const& description, QPDFObjGen const& og); + QPDFObjectHandle readTrailer(); QPDFObjectHandle readObject(std::string const& description, QPDFObjGen og); QPDFObjectHandle readObjectInStream(std::shared_ptr, QPDFObjGen og); size_t recoverStreamLength( diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 3a486457..48f1e186 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -567,7 +567,7 @@ QPDF::reconstruct_xref(QPDFExc& e) insertReconstructedXrefEntry(obj, token_start, gen); } } else if (!m->trailer.isInitialized() && t1.isWord("trailer")) { - QPDFObjectHandle t = readObject("trailer", QPDFObjGen()); + QPDFObjectHandle t = readTrailer(); if (!t.isDictionary()) { // Oh well. It was worth a try. } else { @@ -855,7 +855,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) } // Set offset to previous xref table if any - QPDFObjectHandle cur_trailer = readObject("trailer", QPDFObjGen()); + QPDFObjectHandle cur_trailer = readTrailer(); if (!cur_trailer.isDictionary()) { QTC::TC("qpdf", "QPDF missing trailer"); throw damagedPDF("", "expected trailer dictionary"); @@ -1267,6 +1267,25 @@ QPDF::setLastObjectDescription(std::string const& description, QPDFObjGen const& } } +QPDFObjectHandle +QPDF::readTrailer() +{ + qpdf_offset_t offset = m->file->tell(); + bool empty = false; + auto object = QPDFParser(m->file, "trailer", m->tokenizer, nullptr, this).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")); + } + // Override last_offset so that it points to the beginning of the object we just read + m->file->setLastOffset(offset); + return object; +} + + QPDFObjectHandle QPDF::readObject(std::string const& description, QPDFObjGen og) { diff --git a/qpdf/qtest/qpdf/issue-100.out b/qpdf/qtest/qpdf/issue-100.out index 81b8a7e0..7373ab63 100644 --- a/qpdf/qtest/qpdf/issue-100.out +++ b/qpdf/qtest/qpdf/issue-100.out @@ -1,17 +1,5 @@ WARNING: issue-100.pdf: file is damaged WARNING: issue-100.pdf (offset 736): xref not found WARNING: issue-100.pdf: Attempting to reconstruct cross-reference table -WARNING: issue-100.pdf (object 5 0, offset 268): unknown token while reading object; treating as string -WARNING: issue-100.pdf (object 5 0, offset 286): unknown token while reading object; treating as string -WARNING: issue-100.pdf (object 5 0, offset 289): unknown token while reading object; treating as string -WARNING: issue-100.pdf (object 5 0, offset 294): unknown token while reading object; treating as string -WARNING: issue-100.pdf (object 5 0, offset 297): unknown token while reading object; treating as string -WARNING: issue-100.pdf (object 5 0, offset 304): unknown token while reading object; treating as string -WARNING: issue-100.pdf (object 5 0, offset 304): too many errors; giving up on reading object -WARNING: issue-100.pdf (object 5 0, offset 308): expected endobj -WARNING: issue-100.pdf (object 5 0, offset 418): stream dictionary lacks /Length key -WARNING: issue-100.pdf (object 5 0, offset 489): attempting to recover stream length -WARNING: issue-100.pdf (object 5 0, offset 489): recovered stream length: 12 -WARNING: issue-100.pdf (trailer, offset 953): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-100.pdf (trailer, offset 953): dictionary ended prematurely; using null as value for last key +WARNING: issue-100.pdf (trailer, offset 488): stream keyword found in trailer qpdf: issue-100.pdf: unable to find /Root dictionary diff --git a/qpdf/qtest/qpdf/issue-101.out b/qpdf/qtest/qpdf/issue-101.out index 8905c19a..cffe8da0 100644 --- a/qpdf/qtest/qpdf/issue-101.out +++ b/qpdf/qtest/qpdf/issue-101.out @@ -1,43 +1,5 @@ WARNING: issue-101.pdf: file is damaged WARNING: issue-101.pdf (offset 3526): xref not found WARNING: issue-101.pdf: Attempting to reconstruct cross-reference table -WARNING: issue-101.pdf (object 5 0, offset 1242): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-101.pdf (object 5 0, offset 1242): dictionary ended prematurely; using null as value for last key -WARNING: issue-101.pdf (object 5 0, offset 1438): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (object 5 0, offset 1509): attempting to recover stream length -WARNING: issue-101.pdf (object 5 0, offset 1509): recovered stream length: 8 -WARNING: issue-101.pdf (trailer, offset 1631): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 1702): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 1702): recovered stream length: 12 -WARNING: issue-101.pdf (trailer, offset 2026): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 2097): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 2097): recovered stream length: 257 -WARNING: issue-101.pdf (trailer, offset 2613): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 2684): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 2684): recovered stream length: 74 -WARNING: issue-101.pdf (trailer, offset 2928): unknown token while reading object; treating as string -WARNING: issue-101.pdf (trailer, offset 2930): unknown token while reading object; treating as string -WARNING: issue-101.pdf (trailer, offset 2928): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-101.pdf (trailer, offset 2928): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-101.pdf (trailer, offset 2928): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-101.pdf (trailer, offset 2925): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 2996): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 2996): recovered stream length: 12 -WARNING: issue-101.pdf (trailer, offset 3339): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 3410): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 3410): recovered stream length: 12 -WARNING: issue-101.pdf (trailer, offset 3560): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 3631): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 3631): recovered stream length: 8 -WARNING: issue-101.pdf (trailer, offset 4113): /Length key in stream dictionary is not an integer -WARNING: issue-101.pdf (trailer, offset 4184): attempting to recover stream length -WARNING: issue-101.pdf (trailer, offset 4184): recovered stream length: 8 -WARNING: issue-101.pdf (object 11 0, offset 591): unknown token while reading object; treating as string -WARNING: issue-101.pdf (object 11 0, offset 625): treating unexpected brace token as null -WARNING: issue-101.pdf (object 11 0, offset 626): unknown token while reading object; treating as string -WARNING: issue-101.pdf (object 11 0, offset 637): unknown token while reading object; treating as string -WARNING: issue-101.pdf (object 11 0, offset 639): unknown token while reading object; treating as string -WARNING: issue-101.pdf (object 11 0, offset 644): unknown token while reading object; treating as string -WARNING: issue-101.pdf (object 11 0, offset 644): too many errors; giving up on reading object -WARNING: issue-101.pdf (object 11 0, offset 647): expected endobj +WARNING: issue-101.pdf (trailer, offset 1508): stream keyword found in trailer qpdf: issue-101.pdf: unable to find /Root dictionary diff --git a/qpdf/qtest/qpdf/issue-335a.out b/qpdf/qtest/qpdf/issue-335a.out index 75bfb235..456bc475 100644 --- a/qpdf/qtest/qpdf/issue-335a.out +++ b/qpdf/qtest/qpdf/issue-335a.out @@ -1015,302 +1015,5 @@ WARNING: issue-335a.pdf (trailer, offset 20606): treating unexpected brace token WARNING: issue-335a.pdf (trailer, offset 20606): too many errors; giving up on reading object WARNING: issue-335a.pdf (trailer, offset 20684): unknown token while reading object; treating as string WARNING: issue-335a.pdf (trailer, offset 20683): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 20748): stream keyword followed by extraneous whitespace -WARNING: issue-335a.pdf (trailer, offset 20679): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 20749): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 20749): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 20756): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 20787): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 20787): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 20812): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 20803): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 20803): dictionary has duplicated key /Length; last occurrence overrides earlier ones -WARNING: issue-335a.pdf (trailer, offset 20843): stream keyword followed by extraneous whitespace -WARNING: issue-335a.pdf (trailer, offset 20800): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 20844): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 20844): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 20851): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 20882): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 20882): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 20914): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 20898): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 20895): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 20929): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 20929): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 20949): unexpected > -WARNING: issue-335a.pdf (trailer, offset 20957): unexpected > -WARNING: issue-335a.pdf (trailer, offset 20958): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 20960): unexpected > -WARNING: issue-335a.pdf (trailer, offset 20961): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 20972): treating unexpected brace token as null -WARNING: issue-335a.pdf (trailer, offset 20973): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 20973): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21042): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21026): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 21023): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 21057): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 21057): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 21077): unexpected > -WARNING: issue-335a.pdf (trailer, offset 21085): unexpected > -WARNING: issue-335a.pdf (trailer, offset 21086): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21088): unexpected > -WARNING: issue-335a.pdf (trailer, offset 21089): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21100): treating unexpected brace token as null -WARNING: issue-335a.pdf (trailer, offset 21101): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21101): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21118): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21158): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21202): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21205): treating unexpected brace token as null -WARNING: issue-335a.pdf (trailer, offset 21207): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21212): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21212): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21132): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21138): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21156): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21157): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21158): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21202): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21202): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21154): treating unexpected brace token as null -WARNING: issue-335a.pdf (trailer, offset 21155): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21156): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21157): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21158): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21202): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21202): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21172): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21199): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21201): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21202): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21205): treating unexpected brace token as null -WARNING: issue-335a.pdf (trailer, offset 21207): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21207): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21228): treating unexpected brace token as null -WARNING: issue-335a.pdf (trailer, offset 21229): unexpected ) -WARNING: issue-335a.pdf (trailer, offset 21230): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21262): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21267): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21277): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21277): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21277): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21287): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21389): unexpected dictionary close token -WARNING: issue-335a.pdf (trailer, offset 21392): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21400): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21430): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21438): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21441): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21444): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21452): invalid character (-) in hexstring -WARNING: issue-335a.pdf (trailer, offset 21819): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21819): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21287): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21389): unexpected dictionary close token -WARNING: issue-335a.pdf (trailer, offset 21392): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21400): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21430): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21438): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21441): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21444): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21452): invalid character (-) in hexstring -WARNING: issue-335a.pdf (trailer, offset 21819): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21819): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21407): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 21438): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 21438): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 21452): invalid character (-) in hexstring -WARNING: issue-335a.pdf (trailer, offset 21837): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21850): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 21892): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21900): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21903): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21906): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21918): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21925): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21925): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21918): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21925): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21937): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21962): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21991): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22000): invalid character (t) in hexstring -WARNING: issue-335a.pdf (trailer, offset 22003): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22028): unexpected > -WARNING: issue-335a.pdf (trailer, offset 22030): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22038): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake4 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake5 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake6 -WARNING: issue-335a.pdf (trailer, offset 21936): dictionary has duplicated key /Length; last occurrence overrides earlier ones -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake7 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake8 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake9 -WARNING: issue-335a.pdf (trailer, offset 22044): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22052): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22064): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22064): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 21937): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21962): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21991): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22000): invalid character (t) in hexstring -WARNING: issue-335a.pdf (trailer, offset 22003): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22028): unexpected > -WARNING: issue-335a.pdf (trailer, offset 22030): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22038): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake4 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake5 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake6 -WARNING: issue-335a.pdf (trailer, offset 21936): dictionary has duplicated key /Length; last occurrence overrides earlier ones -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake7 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake8 -WARNING: issue-335a.pdf (trailer, offset 21936): expected dictionary key but found non-name object; inserting key /QPDFFake9 -WARNING: issue-335a.pdf (trailer, offset 21932): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22052): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22052): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22000): invalid character (t) in hexstring -WARNING: issue-335a.pdf (trailer, offset 22088): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22087): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22083): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22136): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22136): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22178): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22190): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22202): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22218): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22201): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22201): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22230): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22238): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22177): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22177): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22177): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 22177): expected dictionary key but found non-name object; inserting key /QPDFFake4 -WARNING: issue-335a.pdf (trailer, offset 22177): expected dictionary key but found non-name object; inserting key /QPDFFake5 -WARNING: issue-335a.pdf (trailer, offset 22276): stream keyword followed by carriage return only -WARNING: issue-335a.pdf (trailer, offset 22173): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22276): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22276): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22202): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22218): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22201): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22201): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22197): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22238): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22238): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22327): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22336): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22338): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22355): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22360): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22326): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22326): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22326): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 22326): expected dictionary key but found non-name object; inserting key /QPDFFake4 -WARNING: issue-335a.pdf (trailer, offset 22326): expected dictionary key but found non-name object; inserting key /QPDFFake5 -WARNING: issue-335a.pdf (trailer, offset 22322): /Length key in stream dictionary is not an integer -WARNING: issue-335a.pdf (trailer, offset 22373): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22373): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22437): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22436): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22432): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22484): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22484): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22650): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22656): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22675): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22687): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22690): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22702): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22701): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22740): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22748): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22761): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22791): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22794): unexpected > -WARNING: issue-335a.pdf (trailer, offset 22796): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22804): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake4 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake5 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake6 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake7 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake8 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake9 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake10 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake11 -WARNING: issue-335a.pdf (trailer, offset 22810): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22817): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22817): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 22687): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22690): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22702): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22701): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22740): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22748): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22761): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22791): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22794): unexpected > -WARNING: issue-335a.pdf (trailer, offset 22796): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22804): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake4 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake5 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake6 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake7 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake8 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake9 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake10 -WARNING: issue-335a.pdf (trailer, offset 22686): expected dictionary key but found non-name object; inserting key /QPDFFake11 -WARNING: issue-335a.pdf (trailer, offset 22817): stream keyword followed by carriage return only -WARNING: issue-335a.pdf (trailer, offset 22682): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22817): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22817): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22702): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22701): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22697): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (trailer, offset 22748): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22748): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 22845): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22869): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 22844): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (trailer, offset 22844): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (trailer, offset 22844): expected dictionary key but found non-name object; inserting key /QPDFFake3 -WARNING: issue-335a.pdf (trailer, offset 22898): expected endstream -WARNING: issue-335a.pdf (trailer, offset 22882): attempting to recover stream length -WARNING: issue-335a.pdf (trailer, offset 22882): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (trailer, offset 23098): invalid character (t) in hexstring -WARNING: issue-335a.pdf (trailer, offset 23101): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23108): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23130): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23147): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23155): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23155): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 23108): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23130): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23147): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23155): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23196): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23324): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (trailer, offset 23324): too many errors; giving up on reading object -WARNING: issue-335a.pdf (trailer, offset 23411): dictionary ended prematurely; using null as value for last key -WARNING: issue-335a.pdf (object 5 0, offset 23451): invalid character (ÿ) in hexstring -WARNING: issue-335a.pdf (object 5 0, offset 23458): unknown token while reading object; treating as string -WARNING: issue-335a.pdf (object 5 0, offset 23444): expected dictionary key but found non-name object; inserting key /QPDFFake1 -WARNING: issue-335a.pdf (object 5 0, offset 23444): expected dictionary key but found non-name object; inserting key /QPDFFake2 -WARNING: issue-335a.pdf (object 5 0, offset 23440): stream dictionary lacks /Length key -WARNING: issue-335a.pdf (object 5 0, offset 23485): attempting to recover stream length -WARNING: issue-335a.pdf (object 5 0, offset 23485): unable to recover stream data; treating stream as empty -WARNING: issue-335a.pdf (object 5 0, offset 24974): expected endobj -WARNING: issue-335a.pdf (object 5 0, offset 24974): EOF after endobj +WARNING: issue-335a.pdf (trailer, offset 20747): stream keyword found in trailer qpdf: issue-335a.pdf: unable to find /Root dictionary