From 54704e60a86247f18f590f0d88aa2d5dba6a9860 Mon Sep 17 00:00:00 2001 From: Matthew Laukala Date: Thu, 9 Nov 2017 12:18:42 -0800 Subject: [PATCH 1/2] No longer assumes object number. --- src/PdfSharp/Pdf.IO/Parser.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/PdfSharp/Pdf.IO/Parser.cs b/src/PdfSharp/Pdf.IO/Parser.cs index a5d12ac3..217d20bf 100644 --- a/src/PdfSharp/Pdf.IO/Parser.cs +++ b/src/PdfSharp/Pdf.IO/Parser.cs @@ -1068,20 +1068,26 @@ private PdfTrailer ReadXRefTableAndTrailer(PdfCrossReferenceTable xrefTable) symbol = ScanNextToken(); if (symbol == Symbol.Integer) { - int start = _lexer.TokenToInteger; int length = ReadInteger(); - for (int id = start; id < start + length; id++) + for (int idx = 0; idx < length; idx++) { int position = ReadInteger(); int generation = ReadInteger(); ReadSymbol(Symbol.Keyword); string token = _lexer.Token; // Skip start entry - if (id == 0) + if (idx == 0) continue; // Skip unused entries. if (token != "n") continue; + + // Some PDF producers don't follow xref specs. Can't assume object number. + int pos = _lexer.Position; + _lexer.Position = position; + int id = ReadInteger(); + _lexer.Position = pos; + // Even it is restricted, an object can exists in more than one subsection. // (PDF Reference Implementation Notes 15). PdfObjectID objectID = new PdfObjectID(id, generation); From f4b982d3f044ab0f199fb4274a501b63dddc0af7 Mon Sep 17 00:00:00 2001 From: Matthew Laukala Date: Mon, 13 Nov 2017 09:08:02 -0800 Subject: [PATCH 2/2] First entry of secondary subsection are now read. --- src/PdfSharp/Pdf.IO/Parser.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/PdfSharp/Pdf.IO/Parser.cs b/src/PdfSharp/Pdf.IO/Parser.cs index 217d20bf..9523e1fb 100644 --- a/src/PdfSharp/Pdf.IO/Parser.cs +++ b/src/PdfSharp/Pdf.IO/Parser.cs @@ -1075,9 +1075,12 @@ private PdfTrailer ReadXRefTableAndTrailer(PdfCrossReferenceTable xrefTable) int generation = ReadInteger(); ReadSymbol(Symbol.Keyword); string token = _lexer.Token; + + // Start entry should be marked as free. // Skip start entry - if (idx == 0) - continue; + //if (idx == 0) + // continue; + // Skip unused entries. if (token != "n") continue;