diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs b/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs
index 5d2045b4..363e48d2 100644
--- a/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs
+++ b/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs
@@ -80,9 +80,13 @@
data.Seek(position);
- var str = data.ReadString(nameRecord.Length, encoding);
+ if (data.TryReadString(nameRecord.Length, encoding, out var str))
+ {
+ return nameRecord.ToNameRecord(str);
+ }
- return nameRecord.ToNameRecord(str);
+ // Damaged font
+ return null;
}
catch
{
diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs b/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs
index 134f0d56..6f521b26 100644
--- a/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs
+++ b/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs
@@ -203,7 +203,10 @@
for (var i = 0; i < namesLength; i++)
{
var numberOfCharacters = data.ReadByte();
- nameArray[i] = data.ReadString(numberOfCharacters, Encoding.UTF8);
+ if (data.TryReadString(numberOfCharacters, Encoding.UTF8, out var str))
+ {
+ nameArray[i] = str;
+ }
}
}
diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs b/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs
index 80686282..6cc3bf1b 100644
--- a/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs
+++ b/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs
@@ -1,7 +1,6 @@
namespace UglyToad.PdfPig.Fonts.TrueType
{
using System;
- using System.IO;
using System.Text;
using Core;
@@ -81,22 +80,33 @@
///
public string ReadTag()
{
- return ReadString(4, Encoding.UTF8);
+ if (TryReadString(4, Encoding.UTF8, out var result))
+ {
+ return result;
+ }
+
+ throw new InvalidOperationException($"Could not read Tag from TrueType file at {inputBytes.CurrentOffset}.");
}
///
/// Read a of the given number of bytes in length with the specified encoding.
///
- public string ReadString(int bytesToRead, Encoding encoding)
+ public bool TryReadString(int bytesToRead, Encoding encoding, out string result)
{
+ result = null;
if (encoding == null)
{
- throw new ArgumentNullException(nameof(encoding));
+ return false;
}
byte[] data = new byte[bytesToRead];
- ReadBuffered(data, bytesToRead);
- return encoding.GetString(data, 0, data.Length);
+ if (ReadBuffered(data, bytesToRead))
+ {
+ result = encoding.GetString(data, 0, data.Length);
+ return true;
+ }
+
+ return false;
}
///
@@ -234,13 +244,15 @@
return $"@: {Position} of {inputBytes.Length} bytes.";
}
- private void ReadBuffered(byte[] buffer, int length)
+ private bool ReadBuffered(byte[] buffer, int length)
{
var read = inputBytes.Read(buffer, length);
if (read < length)
{
- throw new EndOfStreamException($"Could not read a buffer of {length} bytes.");
+ return false;
}
+
+ return true;
}
}
}