diff --git a/src/PdfSharp/Pdf.IO/Parser.cs b/src/PdfSharp/Pdf.IO/Parser.cs index a5d12ac3..4814450a 100644 --- a/src/PdfSharp/Pdf.IO/Parser.cs +++ b/src/PdfSharp/Pdf.IO/Parser.cs @@ -537,10 +537,41 @@ private void ParseObject(Symbol stop) //case Symbol.StartXRef: //case Symbol.Eof: default: - ParserDiagnostics.HandleUnexpectedToken(_lexer.Token); - SkipCharsUntil(stop); - return; - } + // Any Keyword can be treated as a literal string. + switch (stop) + { + case Symbol.EndArray: + // Arrays are space delimited. + while (true) + { + char ch = _lexer.AppendAndScanNextChar(); + if (Lexer.IsWhiteSpace(ch) || ch == Chars.EOF || ch == Chars.BracketRight) + { + _stack.Shift(new PdfString(_lexer.Token, PdfStringFlags.RawEncoding)); + break; + } + } + break; + case Symbol.EndDictionary: + // Dictionaries are key value pairs where key must be a name. + while (true) + { + char ch = _lexer.AppendAndScanNextChar(); + if (ch == Chars.Slash || ch == Chars.Greater) + { + _stack.Shift(new PdfString(_lexer.Token, PdfStringFlags.RawEncoding)); + break; + } + } + break; + default: + ParserDiagnostics.HandleUnexpectedToken(_lexer.Token); + SkipCharsUntil(stop); + break; + } + + return; + } } ParserDiagnostics.ThrowParserException("Unexpected end of file."); }