mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-10-15 19:54:52 +08:00
#71 ignore malformed dates in true type header table. fix reading of dates from bytes
This commit is contained in:
@@ -48,15 +48,15 @@
|
||||
Assert.Equal(2048, font.TableRegister.HeaderTable.UnitsPerEm);
|
||||
|
||||
Assert.Equal(2008, font.TableRegister.HeaderTable.Created.Year);
|
||||
Assert.Equal(10, font.TableRegister.HeaderTable.Created.Month);
|
||||
Assert.Equal(13, font.TableRegister.HeaderTable.Created.Day);
|
||||
Assert.Equal(09, font.TableRegister.HeaderTable.Created.Month);
|
||||
Assert.Equal(12, font.TableRegister.HeaderTable.Created.Day);
|
||||
Assert.Equal(12, font.TableRegister.HeaderTable.Created.Hour);
|
||||
Assert.Equal(29, font.TableRegister.HeaderTable.Created.Minute);
|
||||
Assert.Equal(34, font.TableRegister.HeaderTable.Created.Second);
|
||||
|
||||
Assert.Equal(2011, font.TableRegister.HeaderTable.Modified.Year);
|
||||
Assert.Equal(12, font.TableRegister.HeaderTable.Modified.Month);
|
||||
Assert.Equal(31, font.TableRegister.HeaderTable.Modified.Day);
|
||||
Assert.Equal(11, font.TableRegister.HeaderTable.Modified.Month);
|
||||
Assert.Equal(30, font.TableRegister.HeaderTable.Modified.Day);
|
||||
Assert.Equal(5, font.TableRegister.HeaderTable.Modified.Hour);
|
||||
Assert.Equal(13, font.TableRegister.HeaderTable.Modified.Minute);
|
||||
Assert.Equal(10, font.TableRegister.HeaderTable.Modified.Second);
|
||||
@@ -158,6 +158,20 @@
|
||||
var name = font.Name;
|
||||
|
||||
Assert.Equal("Andada Regular", name);
|
||||
|
||||
Assert.Equal(1.001999m, font.TableRegister.HeaderTable.Revision);
|
||||
|
||||
Assert.Equal(11, font.TableRegister.HeaderTable.Flags);
|
||||
|
||||
Assert.Equal(1000, font.TableRegister.HeaderTable.UnitsPerEm);
|
||||
|
||||
Assert.Equal(2011, font.TableRegister.HeaderTable.Created.Year);
|
||||
Assert.Equal(9, font.TableRegister.HeaderTable.Created.Month);
|
||||
Assert.Equal(30, font.TableRegister.HeaderTable.Created.Day);
|
||||
|
||||
Assert.Equal(2017, font.TableRegister.HeaderTable.Modified.Year);
|
||||
Assert.Equal(5, font.TableRegister.HeaderTable.Modified.Month);
|
||||
Assert.Equal(4, font.TableRegister.HeaderTable.Modified.Day);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
@@ -2,6 +2,7 @@
|
||||
{
|
||||
using System;
|
||||
using Geometry;
|
||||
using PdfPig.Exceptions;
|
||||
|
||||
/// <summary>
|
||||
/// The 'head' table contains global information about the font.
|
||||
@@ -99,8 +100,26 @@
|
||||
throw new InvalidOperationException($"The units per em for this TrueType font was incorrect, value should be between 16 and 16384 but found {unitsPerEm} istead.");
|
||||
}
|
||||
|
||||
var created = data.ReadInternationalDate();
|
||||
var modified = data.ReadInternationalDate();
|
||||
DateTime created;
|
||||
try
|
||||
{
|
||||
created = data.ReadInternationalDate();
|
||||
}
|
||||
catch (PdfDocumentFormatException)
|
||||
{
|
||||
created = DateTime.MinValue;
|
||||
}
|
||||
|
||||
DateTime modified;
|
||||
try
|
||||
{
|
||||
modified = data.ReadInternationalDate();
|
||||
}
|
||||
catch (PdfDocumentFormatException)
|
||||
{
|
||||
modified = DateTime.MinValue;
|
||||
}
|
||||
|
||||
var xMin = data.ReadSignedShort();
|
||||
var yMin = data.ReadSignedShort();
|
||||
var xMax = data.ReadSignedShort();
|
||||
|
@@ -4,6 +4,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using IO;
|
||||
using PdfPig.Exceptions;
|
||||
|
||||
internal class TrueTypeDataBytes
|
||||
{
|
||||
@@ -99,25 +100,28 @@
|
||||
|
||||
public long ReadLong()
|
||||
{
|
||||
ReadBuffered(internalBuffer, 8);
|
||||
|
||||
var result = FromBytes(internalBuffer, 0, 8);
|
||||
|
||||
var upper = (long)ReadSignedInt();
|
||||
var lower = ReadSignedInt();
|
||||
var result = (upper << 32) + (lower & 0xFFFFFFFF);
|
||||
return result;
|
||||
}
|
||||
|
||||
public DateTime ReadInternationalDate()
|
||||
{
|
||||
// TODO: this returns the wrong value, investigate...
|
||||
long secondsSince1904 = ReadLong();
|
||||
var secondsSince1904 = ReadLong();
|
||||
|
||||
var date = new DateTime(1904, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
||||
|
||||
var result = date.AddSeconds(secondsSince1904);
|
||||
result = result.AddMonths(1);
|
||||
result = result.AddDays(1);
|
||||
try
|
||||
{
|
||||
var result = date.AddSeconds(secondsSince1904);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
catch (ArgumentOutOfRangeException)
|
||||
{
|
||||
throw new PdfDocumentFormatException($"Invalid date offset ({secondsSince1904} seconds) encountered in TrueType header table.");
|
||||
}
|
||||
}
|
||||
|
||||
public void Seek(long position)
|
||||
@@ -125,17 +129,6 @@
|
||||
inputBytes.Seek(position);
|
||||
}
|
||||
|
||||
private long FromBytes(byte[] buffer, int startIndex, int bytesToConvert)
|
||||
{
|
||||
long ret = 0;
|
||||
for (int i = 0; i < bytesToConvert; i++)
|
||||
{
|
||||
ret = unchecked((ret << 8) | buffer[startIndex + i]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public int ReadSignedByte()
|
||||
{
|
||||
ReadBuffered(internalBuffer, 1);
|
||||
|
Reference in New Issue
Block a user