diff --git a/src/UglyToad.Pdf.Tests/Integration/Documents/Multiple Page - from Mortality Statistics.pdf b/src/UglyToad.Pdf.Tests/Integration/Documents/Multiple Page - from Mortality Statistics.pdf new file mode 100644 index 00000000..3751ea8c Binary files /dev/null and b/src/UglyToad.Pdf.Tests/Integration/Documents/Multiple Page - from Mortality Statistics.pdf differ diff --git a/src/UglyToad.Pdf.Tests/Integration/MultiplePageMortalityStatistics.cs b/src/UglyToad.Pdf.Tests/Integration/MultiplePageMortalityStatistics.cs new file mode 100644 index 00000000..e7223409 --- /dev/null +++ b/src/UglyToad.Pdf.Tests/Integration/MultiplePageMortalityStatistics.cs @@ -0,0 +1,36 @@ +namespace UglyToad.Pdf.Tests.Integration +{ + using System; + using System.IO; + using Xunit; + + public class MultiplePageMortalityStatistics + { + private static string GetFilename() + { + var documentFolder = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "Integration", "Documents")); + + return Path.Combine(documentFolder, "Multiple Page - from Mortality Statistics.pdf"); + } + + [Fact] + public void HasCorrectNumberOfPages() + { + var file = GetFilename(); + + using (var document = PdfDocument.Open(File.ReadAllBytes(file))) + { + Assert.Equal(6, document.NumberOfPages); + } + } + + [Fact] + public void HasCorrectVersion() + { + using (var document = PdfDocument.Open(GetFilename())) + { + Assert.Equal(1.7m, document.Version); + } + } + } +} diff --git a/src/UglyToad.Pdf.Tests/UglyToad.Pdf.Tests.csproj b/src/UglyToad.Pdf.Tests/UglyToad.Pdf.Tests.csproj index 0a38ce05..47c2014f 100644 --- a/src/UglyToad.Pdf.Tests/UglyToad.Pdf.Tests.csproj +++ b/src/UglyToad.Pdf.Tests/UglyToad.Pdf.Tests.csproj @@ -12,6 +12,7 @@ + @@ -32,6 +33,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/UglyToad.Pdf/Fonts/Parser/Handlers/Type0FontHandler.cs b/src/UglyToad.Pdf/Fonts/Parser/Handlers/Type0FontHandler.cs index 9ebfc28a..6503f7c5 100644 --- a/src/UglyToad.Pdf/Fonts/Parser/Handlers/Type0FontHandler.cs +++ b/src/UglyToad.Pdf/Fonts/Parser/Handlers/Type0FontHandler.cs @@ -11,6 +11,7 @@ using IO; using Parts; using Pdf.Parser; + using Pdf.Parser.Parts; internal class Type0FontHandler : IFontHandler { @@ -37,7 +38,7 @@ if (TryGetFirstDescendant(dictionary, out var descendantObject)) { - var parsed = pdfObjectParser.Parse(descendantObject.ToIndirectReference(), reader, isLenientParsing); + var parsed = DirectObjectFinder.Find(descendantObject, pdfObjectParser, reader, isLenientParsing); if (parsed is PdfDictionary descendantFontDictionary) { diff --git a/src/UglyToad.Pdf/Parser/Parts/DirectObjectFinder.cs b/src/UglyToad.Pdf/Parser/Parts/DirectObjectFinder.cs new file mode 100644 index 00000000..753cc26b --- /dev/null +++ b/src/UglyToad.Pdf/Parser/Parts/DirectObjectFinder.cs @@ -0,0 +1,32 @@ +namespace UglyToad.Pdf.Parser.Parts +{ + using System; + using Cos; + using IO; + + internal static class DirectObjectFinder + { + public static CosBase Find(CosObject baseObject, IPdfObjectParser parser, IRandomAccessRead reader, + bool isLenientParsing) where T : CosBase + { + var result = parser.Parse(baseObject.ToIndirectReference(), reader, isLenientParsing); + + if (result is T resultT) + { + return resultT; + } + + if (result is CosObject obj) + { + return Find(obj, parser, reader, isLenientParsing); + } + + if (result is COSArray arr && arr.Count == 1 && arr.get(0) is CosObject arrayObject) + { + return Find(arrayObject, parser, reader, isLenientParsing); + } + + throw new InvalidOperationException($"Could not find the object {baseObject.ToIndirectReference()} with type {typeof(T).Name}."); + } + } +}