diff --git a/src/UglyToad.PdfPig.Tests/Integration/GithubIssuesTests.cs b/src/UglyToad.PdfPig.Tests/Integration/GithubIssuesTests.cs index 04b3b60a2..8ec946158 100644 --- a/src/UglyToad.PdfPig.Tests/Integration/GithubIssuesTests.cs +++ b/src/UglyToad.PdfPig.Tests/Integration/GithubIssuesTests.cs @@ -472,19 +472,13 @@ public void Issue874() { var doc = IntegrationHelpers.GetDocumentPath("ErcotFacts.pdf"); - using (var document = PdfDocument.Open(doc, new ParsingOptions() { UseLenientParsing = true, SkipMissingFonts = true })) + using (var document = PdfDocument.Open(doc, new ParsingOptions() { UseLenientParsing = true, SkipMissingFonts = false })) { var page1 = document.GetPage(1); - Assert.Equal(1788, page1.Letters.Count); + Assert.Equal(1939, page1.Letters.Count); var page2 = document.GetPage(2); - Assert.Equal(2430, page2.Letters.Count); - } - - using (var document = PdfDocument.Open(doc, new ParsingOptions() { UseLenientParsing = true, SkipMissingFonts = false })) - { - var ex = Assert.Throws(() => document.GetPage(1)); - Assert.StartsWith("Value cannot be null.", ex.Message); + Assert.Equal(2434, page2.Letters.Count); } } diff --git a/src/UglyToad.PdfPig/CrossReference/CrossReferenceTableBuilder.cs b/src/UglyToad.PdfPig/CrossReference/CrossReferenceTableBuilder.cs index 8ea75530e..7f32fb66a 100644 --- a/src/UglyToad.PdfPig/CrossReference/CrossReferenceTableBuilder.cs +++ b/src/UglyToad.PdfPig/CrossReference/CrossReferenceTableBuilder.cs @@ -56,16 +56,16 @@ public CrossReferenceTable Build(long firstCrossReferenceOffset, long offsetCorr // add this and follow chain defined by 'Prev' keys xrefPartToBytePositionOrder.Add(firstCrossReferenceOffset); - // Get any streams that are tied to this table. - var activePart = currentPart; - var dependents = parts.Where(x => x.TiedToXrefAtOffset == activePart.Offset); - foreach (var dependent in dependents) - { - xrefPartToBytePositionOrder.Add(dependent.Offset); - } - while (currentPart.Dictionary != null) { + // Get any streams that are tied to this table. + var activePart = currentPart; + var dependents = parts.Where(x => x.TiedToXrefAtOffset == activePart.Offset); + foreach (var dependent in dependents) + { + xrefPartToBytePositionOrder.Add(dependent.Offset); + } + long prevBytePos = currentPart.GetPreviousOffset(); if (prevBytePos == -1) { diff --git a/src/UglyToad.PdfPig/Parser/FileStructure/FirstPassParser.cs b/src/UglyToad.PdfPig/Parser/FileStructure/FirstPassParser.cs index 078023517..a0b847e37 100644 --- a/src/UglyToad.PdfPig/Parser/FileStructure/FirstPassParser.cs +++ b/src/UglyToad.PdfPig/Parser/FileStructure/FirstPassParser.cs @@ -153,6 +153,23 @@ private static IReadOnlyList GetXrefPartsDirectly( { results.Add(table); nextLocation = table.GetPrevious(); + + // Also add any optional associated Stream + var xRefStm = table.GetXRefStm(); + if (xRefStm is long xRefStmValue) + { + var stream = GetXrefStreamOrTable( + offset, + input, + scanner, + xRefStmValue, + log); + + if (stream != null) + { + results.Add(stream); + } + } } else if (streamOrTable is XrefStream stream) { diff --git a/src/UglyToad.PdfPig/Parser/FileStructure/XrefTable.cs b/src/UglyToad.PdfPig/Parser/FileStructure/XrefTable.cs index c02a1aa8d..011b25ba4 100644 --- a/src/UglyToad.PdfPig/Parser/FileStructure/XrefTable.cs +++ b/src/UglyToad.PdfPig/Parser/FileStructure/XrefTable.cs @@ -44,4 +44,14 @@ public XrefTable( return null; } + + public long? GetXRefStm() + { + if (Dictionary != null && Dictionary.TryGet(NameToken.XrefStm, out NumericToken xRefStm)) + { + return xRefStm.Long; + } + + return null; + } } \ No newline at end of file