diff --git a/src/UglyToad.PdfPig.Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs b/src/UglyToad.PdfPig.Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs index 6a63d94b..02accd22 100644 --- a/src/UglyToad.PdfPig.Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs +++ b/src/UglyToad.PdfPig.Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs @@ -860,8 +860,8 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings return new Type2CharStrings.CommandSequence.CommandIdentifier(precedingValues.Count, false, 255); } - private static int CalculatePrecedingHintBytes(IReadOnlyList precedingValues, - IReadOnlyList precedingCommands) + private static int CalculatePrecedingHintBytes(List precedingValues, + List precedingCommands) { int SafeStemCount(int counts) { @@ -873,7 +873,7 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings return (counts - 1) / 2; } - + /* * The hintmask operator is followed by one or more data bytes that specify the stem hints which are to be active for the * subsequent path construction. The number of data bytes must be exactly the number needed to represent the number of @@ -891,8 +891,14 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings precedingNumbers++; } - foreach (var identifier in precedingCommands.Where(x => x.CommandIndex == i + 1)) + for (var j = 0; j < precedingCommands.Count; j++) { + var identifier = precedingCommands[j]; + if (identifier.CommandIndex != i + 1) + { + continue; + } + if (!identifier.IsMultiByteCommand && (identifier.CommandId == HintmaskByte || identifier.CommandId == CntrmaskByte) && !hasEncounteredInitialHintMask) diff --git a/src/UglyToad.PdfPig.Tests/Parser/Parts/FileHeaderParserTests.cs b/src/UglyToad.PdfPig.Tests/Parser/Parts/FileHeaderParserTests.cs index cc3a1cda..a292e9bd 100644 --- a/src/UglyToad.PdfPig.Tests/Parser/Parts/FileHeaderParserTests.cs +++ b/src/UglyToad.PdfPig.Tests/Parser/Parts/FileHeaderParserTests.cs @@ -4,6 +4,7 @@ using Logging; using PdfPig.Core; using PdfPig.Parser.FileStructure; + using PdfPig.Tokenization.Scanner; using Xunit; public class FileHeaderParserTests @@ -137,5 +138,17 @@ three %PDF-1.6"); Assert.Equal(0, scanner.CurrentPosition); Assert.Equal(0, result.OffsetInFile); } + + [Fact] + public void Issue334() + { + var input = OtherEncodings.StringAsLatin1Bytes("%PDF-1.7\r\n%âãÏÓ\r\n1 0 obj\r\n<>\r\nendobj"); + + var scanner = new CoreTokenScanner(new ByteArrayInputBytes(input), ScannerScope.None); + + var result = FileHeaderParser.Parse(scanner, false, log); + + Assert.Equal(1.7m, result.Version); + } } }