Как получить количество страниц в TIFF-файле с кодом в Windows Service
У меня есть служба Windows, которая пытается получить количество страниц в файле TIFF, используя класс Image в пространстве имен System.Drawing.
using System.Drawing;
private int GetNumberOfPagesFromTiffFile(string filePath)
{
int pageCount = 0;
Image Tiff = Image.FromFile(filePath);
pageCount = Tiff.GetFrameCount(FrameDimension.Page);
Tiff.Dispose();
return pageCount;
}
Но в документации Microsoft http://msdn.microsoft.com/en-us/library/system.drawing.aspx говорится, что не следует использовать System.Drawing в службе Windows. Они предложили использовать Windows Imaging Component. Я скачал его, чтобы узнать, есть ли способ узнать количество страниц в файле TIFF, но я получил ошибку при его установке. Так что у меня пока нет ответа.
Мне любопытно, что другие используют, чтобы получить количество страниц в файле TIFF в службе Windows.
1 ответ
Вот общая функция C для подсчета количества страниц в файле TIFF
uint16_t TIFFSHORT(unsigned char *buffer, bool bMotorola)
{
uint16_t s;
if (bMotorola)
s = (buffer[0] << 8) + buffer[1];
else
s = buffer[0] + (buffer[1] << 8);
return s;
}
uint32_t TIFFLONG(unsigned char *buffer, bool bMotorola)
{
uint32_t l;
if (bMotorola)
l = (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3];
else
l = buffer[0] + (buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24);
return l;
}
int TIFFPageCount(char *filename)
{
int i, iTags, IFD;
int iOffset, iTotalPages;
unsigned char buf[8];
FILE *handle;
bool bMotorola;
int iFileSize;
handle = fopen((char *)filename, "rb");
if (handle == NULL)
return 0;
// get the file size
fseek(handle, 0, SEEK_END);
iFileSize = (int)ftell(handle);
fseek(handle, 0, SEEK_SET);
i = fread(buf, 1, 8, handle); // Read TIFF header and first IFD offset
if (buf[0] != 'I' && buf[0] != 'M')
{
fclose(handle);
return 0; // Not a TIFF file
}
bMotorola = (buf[0] == 'M'); // get the byte order
IFD = TIFFLONG(&buf[4], bMotorola); // Read the first IFD pointer
if (IFD < 8 || IFD > iFileSize) // corrupt file, don't process it
{
fclose(handle);
return 0;
}
iTotalPages = 0;
while(IFD != 0 && IFD < iFileSize-4) // count the number of pages
{
fseek(handle, IFD, SEEK_SET);
fread(buf, 1, 2, handle); // get the number of tags in this page
iTags = TIFFSHORT(buf, bMotorola); // Number of tags in this dir
i = iTags * 12 + 2; // Offset to next IFD in chain
if (iTags > 256) // Invalid header, abort
break;
fseek(handle, IFD+i, SEEK_SET);
fread(buf, 1, 4, handle); // read the next IFD value; 0 means end of chain
IFD = TIFFLONG(buf, bMotorola);
iTotalPages++;
}
fclose(handle);
return iTotalPages;
} // TIFFPageCount()