
Thread
1999.12.17 15:54 "RE: TIFF previews in EPS files", by Dean Grimm
Hi Flemming,
I use the following C++ code on Windows:
#define EPS_BUFFER_LEN 8192
#define EPS_THUMBTYPE_ERROR -2
#define EPS_THUMBTYPE_NONE -1
#define EPS_THUMBTYPE_TIFF 0
#define EPS_THUMBTYPE_META 1
const BYTE EPS_HDR_MAGIC_PS_ASCII[] = "%!";
const BYTE EPS_HDR_MAGIC_PS_WIN[] = {0xc5,0xd0,0xd3,0xc6};
typedef struct tagEPSHEADER {
BYTE magic[4];
DWORD offPS;
DWORD lenPS;
DWORD offMeta;
DWORD lenMeta;
DWORD offTiff;
DWORD lenTiff;
WORD checksum;
}EPSHEADER;
int ExtractEPSThumbnail(LPCTSTR pszEPSPath, LPCTSTR pszOutPath)
{
int result = EPS_THUMBTYPE_NONE;
HANDLE hf;
// open the EPS file
if ((hf=FOPEN(pszEPSPath)) != INVALID_HANDLE_VALUE)
{
EPSHEADER hdr;
DWORD dwRead, dwOffset=0, dwLength=0;
// read the header
if (!ReadFile(hf, &hdr, sizeof(EPSHEADER), &dwRead, NULL)
|| dwRead != sizeof(EPSHEADER))
{
CloseHandle(hf);
return EPS_THUMBTYPE_NONE;
}
// check the type
if (hdr.magic[0] == EPS_HDR_MAGIC_PS_ASCII[0]
&& hdr.magic[1] == EPS_HDR_MAGIC_PS_ASCII[1])
{
result = EPS_THUMBTYPE_NONE;
}
else if (hdr.magic[0] == EPS_HDR_MAGIC_PS_WIN[0]
&& hdr.magic[1] == EPS_HDR_MAGIC_PS_WIN[1]
&& hdr.magic[2] == EPS_HDR_MAGIC_PS_WIN[2]
&& hdr.magic[3] == EPS_HDR_MAGIC_PS_WIN[3])
{
// thumbnail is TIFF
if (hdr.lenTiff>0)
{
result = EPS_THUMBTYPE_TIFF;
dwOffset = hdr.offTiff;
dwLength = hdr.lenTiff;
}
// thumbnail is metafile
else if (hdr.lenMeta>0)
{
result = EPS_THUMBTYPE_META;
dwOffset = hdr.offMeta;
dwLength = hdr.lenMeta;
}
else
result = EPS_THUMBTYPE_NONE;
// extract the file
if (dwLength > 0)
{
HANDLE hfOut;
DWORD dwOut = 0, dwSize, dwWrite;
// open the EPS file
if ((hfOut=FOPEN(pszOutPath, GENERIC_WRITE, CREATE_ALWAYS)) != INVALID_HANDLE_VALUE)
{
char buf[EPS_BUFFER_LEN];
// seek to the thumbnail offset
if (SetFilePointer(hf, dwOffset, NULL, FILE_BEGIN) != 0xFFFFFFFF)
{
while (dwOut < dwLength)
{
// read, at most, bufferlen bytes from input file
dwSize = min(EPS_BUFFER_LEN, dwLength-dwOut);
if (!ReadFile(hf, buf, dwSize, &dwRead, NULL)
|| dwRead != dwSize)
{
result = EPS_THUMBTYPE_ERROR;
break;
}
// write bytes to output file
if (!WriteFile(hfOut, buf, dwRead, &dwWrite, NULL)
|| dwWrite != dwRead)
{
result = EPS_THUMBTYPE_ERROR;
break;
}
dwOut += dwSize;
}
}
else
result = EPS_THUMBTYPE_ERROR;
CloseHandle(hfOut);
}
}
}
CloseHandle(hf);
}
return result;
}