Как узнать количество страниц в файле spl

Я работаю над проектом, целью которого является мониторинг заданий на печать. Я копирую файлы spl и shd из папки spool во временную папку и пытаюсь проанализировать, чтобы получить нужные данные, такие как количество напечатанных страниц, владелец, дата и время …

Я использую следующий код для разбора файлов Spooler Spl (получить структуру файла EMF)

#include "stdafx.h"#include <windows.h>
#include <winspool.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>
#include <iostream>
using namespace std;

BOOL AnalyseFile(const char* pszFileName);

void UPFM(const wchar_t pszInfo[])
{
wprintf(L"%s\n",pszInfo);
}

static char* ID_Func[] =
{
"EMF_HEADER", "EMF_POLYBEZIER", /*....*/
};

int main()
{
setlocale(LC_ALL,"");

const char* pszFileName = "~MyTempFolder\\00031.SPL";

if(!AnalyseFile(pszFileName))
printf("Analyse File Failed!");
else
printf("Analyse File Successed Completed!");

return 0;
}BOOL AnalyseFile(const char* pszFileName)
{
BOOL bRet = FALSE;

DWORD dwStartPos = 0;
FILE * f ;
f = fopen("log.txt", "w");
FILE* pFile = fopen(pszFileName,"rb");

if(!pFile)
{
fprintf(f,"Open File Failed!");
return bRet;
}

/* =======================Headers================================ */
DWORD dwTmp = 0;

fseek(pFile,0,0);

fread(&dwTmp,sizeof(DWORD),1,pFile);

fread(&dwTmp,sizeof(DWORD),1,pFile);

dwStartPos = dwTmp;

fread(&dwTmp,sizeof(DWORD),1,pFile);

long pos = ftell(pFile);

fseek(pFile,dwTmp,SEEK_SET);

wchar_t pszInfo[256] = {0};
pszInfo[0] = L'(';

WORD wTmp;
int i;
for( i = 1;;i++)
{
fread(&wTmp,sizeof(wTmp),1,pFile);

if(!wTmp)
break;

memcpy((char*)&pszInfo[i],&wTmp,sizeof(wTmp));
}
pszInfo[i] = L')';
UPFM(pszInfo);

fseek(pFile,pos,SEEK_SET);

fread(&dwTmp,sizeof(DWORD),1,pFile);

fseek(pFile,dwTmp,SEEK_SET);

memset(pszInfo,0,sizeof(wchar_t)*256);
pszInfo[0] = L'(';
for(i = 1;;i++)
{
fread(&wTmp,sizeof(wTmp),1,pFile);

if(!wTmp)
break;

memcpy((char*)&pszInfo[i],&wTmp,sizeof(wTmp));
}
pszInfo[i] = L')';
UPFM(pszInfo);

/* ======================== Unknown datas ================================= */
fseek(pFile,dwStartPos,SEEK_SET);

fread(&dwTmp,sizeof(DWORD),1,pFile);

fread(&dwTmp,sizeof(DWORD),1,pFile);

/* ======================== Record datas ================================= */
DWORD dwTmp2 = 0;
for(int i=0;;i++)
{
pos = ftell(pFile);

fread(&dwTmp,sizeof(DWORD),1,pFile);

fread(&dwTmp2,sizeof(DWORD),1,pFile);
FILE *f;
f = fopen("log.txt", "a");

fprintf(f,"index: (%04d)  type: 0x%04X  size: %04d  0x%08X (%s)\n",i,dwTmp,dwTmp2,pos,ID_Func[dwTmp-1]);
fclose (f);

if(dwTmp == 0x0E)
{
break;
}

fseek(pFile,pos+dwTmp2,SEEK_SET);
}
fclose (f);
if(pFile) fclose(pFile);
bRet = TRUE;

return bRet;
}

Есть ли способ рассчитать количество страниц в файле spl с помощью этого метода?

1

Решение

Для расчета страниц вы должны рассчитывать заголовки страниц.

Вот часть кода, которая делает это

 SpoolFilename = Path.ChangeExtension(SpoolFilename, ".SPL")

'\\ Open a binary reader for the spool file
Dim SpoolFileStream As New System.IO.FileStream(SpoolFilename, FileMode.Open, FileAccess.Read)
Dim SpoolBinaryReader As New BinaryReader(SpoolFileStream, System.Text.Encoding.UTF8)

'Read the spooler records and count the total pages
Dim recNext As EMFMetaRecordHeader = NextHeader(SpoolBinaryReader)
While recNext.iType <> SpoolerRecordTypes.SRT_EOF
If recNext.iType = SpoolerRecordTypes.SRT_PAGE Then
_Pages += 1
End If
'SpoolfileReaderPerformaceCounter.Increment()
Call SkipAHeader(recNext, SpoolBinaryReader)
recNext = NextHeader(SpoolBinaryReader)
End While

Код получает имя файла, открывает для него двоичный поток и читает заголовок за заголовком. Если код заголовка SRT_PAGE, увеличить счетчик страниц.

более подробная информация и источник Вот

0

Другие решения

Вот как вы делаете это в C ++

struct EMFMetaRecordHeader {
long Seek;
SpoolerRecordTypes iType;
int Size;
};

if (splfile)
{
EMFMetaRecordHeader recNext = NextHeader(splfile);
while (recNext.iType != SpoolerRecordTypes::SRT_EOF)
{
if (recNext.iType == SpoolerRecordTypes::SRT_PAGE)
{
nPages++;
}
recNext = NextHeader(splfile);

}

nEmf_record_code = 0;
}

EMFMetaRecordHeader EMFSpoolfileReader::NextHeader(FILE* splfile){
EMFMetaRecordHeader recRet;
recRet.Seek = ftell(splfile);

fread(&recRet.iType, sizeof(int), 1, splfile);
if (feof(splfile))
{
recRet.iType = SpoolerRecordTypes::SRT_EOF;
return recRet;
}
fread(&recRet.Size, sizeof(int), 1, splfile);

return recRet;
}

splfile — указатель файла спула

более подробная информация и источник Вот

0

По вопросам рекламы [email protected]