获取jobid

#define SRT_EXT_EMBED_FONT    0x00000015 /* 21 an offset to embedded font identifiers   */
#endif
#endif
#endif
/*****************************************************************************
 * SPL_HEADER
 *----------------------------------------------------------------------------
 * SPL file header for EMFSPL files
 *****************************************************************************/
typedef struct tagSPLHEADER { 
    DWORD SIGNATURE; 
    DWORD nSize;            // record size INCLUDING header 
    DWORD offDocumentName;  // offset of Job Title from start 
    DWORD offPort;          // offset of portname from start
    BYTE* HeaderData; 
} SPL_HEADER, *PSPL_HEADER;
 
/*****************************************************************************
 * SMR - Base record
 *----------------------------------------------------------------------------
 * Base record type for the Spool Metafile.
 *****************************************************************************/
typedef struct tagSMR{ 
    DWORD iType; // Spool metafile record type 
    DWORD nSize; // length of the following data 
                 // NOT INCLUDING this header 
} SMR, *PSMR;
 
/*****************************************************************************
 * SMREXT - Extended record
 *----------------------------------------------------------------------------
 * Contains neg. distance to start of Data
 *****************************************************************************/
typedef struct tagSMREXT{ 
    SMR smr; 
    DWORD DistanceLow; 
    DWORD DistanceHigh;
} SMREXT, *PSMREXT;
 
/*****************************************************************************
 * SMRPRESTARTPAGE - PRESTARTPAGE
 *----------------------------------------------------------------------------
 * Written before pagedata is written to spoolfile
 * Used as a temporary "end of file" indicating following data is not
 * fully spooled yet
 *****************************************************************************/
typedef struct tagSMRPRESTARTPAGE{ 
    SMR smr; 
    DWORD Unknown1; 
    DWORD Unknown2; //0xFFFFFFFF
} SMRPRESTARTPAGE, *PSMRPRESTARTPAGE;
 
/*****************************************************************************
 * SMR_PAGE - EMF/Page data
 *----------------------------------------------------------------------------
 * EMF/Page data
 *****************************************************************************/
typedef struct tagSMRPAGE{ 
    SMR smr;   // if smr.nSize == 0, this indicates EndOfFile
    BYTE* EMFData;
} SMR_PAGE, *PSMR_PAGE;
 
/*****************************************************************************
 * SMR_DEVMODE - DEVMODE data
 *----------------------------------------------------------------------------
 * DEVMODE data
 *****************************************************************************/
typedef struct tagSMRDEVMODE{ 
    SMR smr; 
    BYTE* DEVMODEData;
} SMR_DEVMODE, *PSMR_DEVMODE;
 
/*****************************************************************************
 * SMR_FONT - FONT data
 *****************************************************************************/
typedef struct tagSMRFONT{ 
    SMR smr; 
    BYTE* FONTData;
} SMR_FONT, *PSMR_FONT;
 
/*****************************************************************************
 * SMR_EXTFONT - Extended Font Data
 *----------------------------------------------------------------------------
 * Contains neg. distance to start of
 * Font Data
 * Font data is typically embedded as
 * GDICOMMENT in the prev EMF data
 *****************************************************************************/
typedef struct tagEXTFONT{ 
    SMREXT smrext;
} SMR_EXTFONT, *PSMR_EXTFONT;


/*****************************************************************************
 * SMR_EOPAGE - End of Page
 *----------------------------------------------------------------------------
 * Contains neg. distance to
 * start of page record
 *****************************************************************************/
typedef struct tagSMREOPAGE{ 
    SMREXT smrext; 
} SMR_EOPAGE, *PSMR_EOPAGE;




bool GetMetaFileFromSpoolFile(WCHAR *SpoolFileName , int PageNbr , WCHAR *MetaFileName, void* v_pOemPDEV)
{
FM_PRINT_LOG(("GetMetaFileFromSpoolFile:%ws", SpoolFileName));


POEMPDEV pOemPDEV = (POEMPDEV)v_pOemPDEV;
FILE* f = _wfopen( SpoolFileName, L"rb");
if ( NULL == f)
{
FM_PRINT_LOG(("cannot fopen spoolfile(%ws)<%d>",SpoolFileName,GetLastError()));
return false;
}


HANDLE hFile = (HANDLE)_get_osfhandle (_fileno (f));


    /* HANDLE   hFile = CreateFile( SpoolFileName,
             GENERIC_READ,              // open for reading 
             FILE_SHARE_READ,           // share for reading 
             NULL,                      // no security 
             OPEN_EXISTING,             // existing file only 
             FILE_ATTRIBUTE_NORMAL,     // normal file 
             NULL);                     // no attr. template */
if ( INVALID_HANDLE_VALUE == hFile)
{
FM_PRINT_LOG(("CreateFile Failed:%d", GetLastError()));
fclose(f);
return false;
}
     HANDLE hMapFile = CreateFileMapping(
             hFile,                       // handle to file
             NULL, // security
             PAGE_READONLY,                    // protection
             0,            // high-order DWORD of size
             0,             // low-order DWORD of size
             NULL                      // object name
             );
if ( INVALID_HANDLE_VALUE == hMapFile)
{
CloseHandle(hFile);
fclose(f);
return false;
}
     LPBYTE pMapFile = (LPBYTE)MapViewOfFileEx(
             hMapFile,   // handle to file-mapping object
             FILE_MAP_READ,       // access mode
             0,      // high-order DWORD of offset
             0,       // low-order DWORD of offset
             0, // number of bytes to map
             NULL         // starting address
             );
if ( NULL == pMapFile)
{
CloseHandle(hMapFile);
CloseHandle(hFile);
fclose(f);
return false;
}
     
PSPL_HEADER pHeader = (PSPL_HEADER)pMapFile;
if ( SPLMETA_SIGNATURE != pHeader->SIGNATURE)
{
UnmapViewOfFile( pMapFile   // starting address
             );
CloseHandle(hMapFile);
CloseHandle(hFile);
fclose(f);
return false;
}


pMapFile += pHeader->nSize;
PSMR pSMR = (PSMR)pMapFile;
bool bFoundEMF = false;
for(int Nbr = 1 ; Nbr <= PageNbr ; Nbr++)
{  
while(true)
{
pSMR = (PSMR)pMapFile;
pMapFile += sizeof(SMR);
switch( pSMR->iType)
{
case SRT_METAFILE:
case SRT_FORM_METAFILE:
case SRT_BW_METAFILE:
case SRT_BW_FORM_METAFILE:
case SRT_METAFILE_DATA:
if ( Nbr == PageNbr)
{
bFoundEMF = true;
}
break;
}
if ( bFoundEMF)
break;


pMapFile += pSMR->nSize;
if (( pSMR->nSize == 8) || ( pSMR->nSize == 0))
break;
}


if  ( pSMR->nSize == 0)
break;
}


if ( bFoundEMF)
{
FM_PRINT_LOG(("==>bFoundEMF=True"));
DWORD metafilelen = pSMR->nSize;
if ( 0 == metafilelen)
{
bFoundEMF = false;
}
else
{
// #ifdef DEBUG
WCHAR wszMetaFileName[MAX_PATH];
//wsprintf( wszMetaFileName, L"c:\\print\\Meta_%d.emf"
//, PageNbr);
wsprintf( wszMetaFileName, L"%s\\%s_%d.emf", pOemPDEV->wszFileName, pOemPDEV->wszPreviewFileName, pOemPDEV->dwPageNo );
HANDLE   hMetaFile = CreateFile( wszMetaFileName,
GENERIC_READ | GENERIC_WRITE,              // open for reading 
FILE_SHARE_READ,           // share for reading 
NULL,                      // no security 
CREATE_ALWAYS,             // existing file only 
FILE_ATTRIBUTE_NORMAL,     // normal file 
NULL);                     // no attr. template 


DWORD numWritten;
WriteFile(
hMetaFile,                                       // handle to output file
pMapFile,                                   // data buffer
metafilelen,                        // number of bytes to write
&numWritten,
NULL                          // overlapped buffer
);


CloseHandle(hMetaFile);
// #endif


/*COemPDEV* pOemPDEV=(COemPDEV*)v_pOemPDEV;
if ( IMAGE_EMF == pOemPDEV->ParamNode.byImageType)
{
SaveToLmf( pMapFile, metafilelen, v_pOemPDEV, IMAGE_EMF, 0);
}
else
{
//SaveToLmf( pMapFile, metafilelen, v_pOemPDEV, IMAGE_EMF);
if ( metafilelen > 10 * 1024 * 1024)
{//如果大于10M,返回false,改成打印图片
bFoundEMF = false;
}
else
{
if ( 2 == SaveToLmf( pMapFile, metafilelen, v_pOemPDEV, IMAGE_EMF, 1))
{
bFoundEMF = false;
}
}
}*/
}
}


     UnmapViewOfFile( pMapFile   // starting address
             );
     CloseHandle(hMapFile);
     CloseHandle(hFile);


fclose(f);


if ( bFoundEMF)
return true;
else
return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值