Хорошо, достаточно людей ошибаются, что я собираюсь опубликовать некоторый код, который я должен идентифицировать TIFF:
private const int kTiffTagLength = 12;
private const int kHeaderSize = 2;
private const int kMinimumTiffSize = 8;
private const byte kIntelMark = 0x49;
private const byte kMotorolaMark = 0x4d;
private const ushort kTiffMagicNumber = 42;
private bool IsTiff(Stream stm)
{
stm.Seek(0);
if (stm.Length < kMinimumTiffSize)
return false;
byte[] header = new byte[kHeaderSize];
stm.Read(header, 0, header.Length);
if (header[0] != header[1] || (header[0] != kIntelMark && header[0] != kMotorolaMark))
return false;
bool isIntel = header[0] == kIntelMark;
ushort magicNumber = ReadShort(stm, isIntel);
if (magicNumber != kTiffMagicNumber)
return false;
return true;
}
private ushort ReadShort(Stream stm, bool isIntel)
{
byte[] b = new byte[2];
_stm.Read(b, 0, b.Length);
return ToShort(_isIntel, b[0], b[1]);
}
private static ushort ToShort(bool isIntel, byte b0, byte b1)
{
if (isIntel)
{
return (ushort)(((int)b1 << 8) | (int)b0);
}
else
{
return (ushort)(((int)b0 << 8) | (int)b1);
}
}
Я взломал немного более общий код, чтобы получить это.
Для PDF у меня есть код, который выглядит следующим образом:
public bool IsPdf(Stream stm)
{
stm.Seek(0, SeekOrigin.Begin);
PdfToken token;
while ((token = GetToken(stm)) != null)
{
if (token.TokenType == MLPdfTokenType.Comment)
{
if (token.Text.StartsWith("%PDF-1."))
return true;
}
if (stm.Position > 1024)
break;
}
return false;
}
Теперь GetToken () - это вызов сканера, который токенизирует поток в токены PDF. Это нетривиально, поэтому я не собираюсь вставлять это здесь. Я использую токенизатор вместо того, чтобы смотреть на подстроку, чтобы избежать такой проблемы:
% the following is a PostScript file, NOT a PDF file
% you'll note that in our previous version, it started with %PDF-1.3,
% incorrectly marking it as a PDF
%
clippath stroke showpage
этот фрагмент кода помечен как НЕ PDF в приведенном выше фрагменте кода, тогда как более упрощенный фрагмент кода неверно пометит его как PDF.
Я должен также отметить, что текущая спецификация ISO не содержит замечаний по реализации, которые были в предыдущей спецификации, принадлежащей Adobe. Наиболее важно из PDF Reference, версия 1.6:
Acrobat viewers require only that the header appear somewhere within
the first 1024 bytes of the file.