diff --git a/src/UglyToad.PdfPig.Tests/Tokenization/NameTokenizerTests.cs b/src/UglyToad.PdfPig.Tests/Tokenization/NameTokenizerTests.cs index a048cfa9..aa3c11f4 100644 --- a/src/UglyToad.PdfPig.Tests/Tokenization/NameTokenizerTests.cs +++ b/src/UglyToad.PdfPig.Tests/Tokenization/NameTokenizerTests.cs @@ -112,6 +112,42 @@ Assert.Equal(expected, AssertNameToken(token).Data.Name); } + [Fact] + public void IgnoredInvalidHex() + { + var input = StringBytesTestConverter.Convert("/Invalid#AZBadHex"); + + var result = tokenizer.TryTokenize(input.First, input.Bytes, out var token); + + Assert.True(result); + + Assert.Equal("Invalid#AZBadHex", AssertNameToken(token).Data.Name); + } + + [Fact] + public void IgnoreInvalidSingleHex() + { + var input = StringBytesTestConverter.Convert("/Invalid#Z"); + + var result = tokenizer.TryTokenize(input.First, input.Bytes, out var token); + + Assert.True(result); + + Assert.Equal("Invalid#Z", AssertNameToken(token).Data.Name); + } + + [Fact] + public void EndsNameFollowingInvalidHex() + { + var input = StringBytesTestConverter.Convert("/Hex#/Name"); + + var result = tokenizer.TryTokenize(input.First, input.Bytes, out var token); + + Assert.True(result); + + Assert.Equal("Hex#", AssertNameToken(token).Data.Name); + } + private static NameToken AssertNameToken(IToken token) { Assert.NotNull(token); diff --git a/src/UglyToad.PdfPig/Tokenization/NameTokenizer.cs b/src/UglyToad.PdfPig/Tokenization/NameTokenizer.cs index ae85f876..5aba0928 100644 --- a/src/UglyToad.PdfPig/Tokenization/NameTokenizer.cs +++ b/src/UglyToad.PdfPig/Tokenization/NameTokenizer.cs @@ -25,7 +25,7 @@ bool escapeActive = false; int postEscapeRead = 0; var escapedChars = new char[2]; - + while (inputBytes.MoveNext()) { var b = inputBytes.CurrentByte; @@ -43,16 +43,10 @@ if (postEscapeRead == 2) { - string hex = new string(escapedChars); - try - { - var characterToWrite = (byte)Convert.ToInt32(hex, 16); - bytes.Add(characterToWrite); - } - catch (FormatException e) - { - throw new InvalidOperationException("Error: expected hex digit, actual='" + hex + "'", e); - } + var hex = new string(escapedChars); + + var characterToWrite = (byte)Convert.ToInt32(hex, 16); + bytes.Add(characterToWrite); escapeActive = false; postEscapeRead = 0;