Printing 从打印作业中提取文档名称
如果您有原始postscript数据,是否有可靠的方法从postscript打印作业中提取文档名或作业名 我见过print release station软件,它用打印作业的文档名或url标记每个作业,因此这似乎是可能的。没有可靠的方法来做到这一点,因为PostScript语言中没有此类(元数据)信息如果您的文件符合DSC(文档结构约定),则可以查找注释。这些记录在DSC参考手册中。有效的PostScript文件不需要符合DSCPrinting 从打印作业中提取文档名称,printing,postscript,Printing,Postscript,如果您有原始postscript数据,是否有可靠的方法从postscript打印作业中提取文档名或作业名 我见过print release station软件,它用打印作业的文档名或url标记每个作业,因此这似乎是可能的。没有可靠的方法来做到这一点,因为PostScript语言中没有此类(元数据)信息如果您的文件符合DSC(文档结构约定),则可以查找注释。这些记录在DSC参考手册中。有效的PostScript文件不需要符合DSC 除此之外,至少就PostScript而言,这里没有可提取的信息。您
除此之外,至少就PostScript而言,这里没有可提取的信息。您可能看到的是应用程序提交给后台打印程序的文档名。此外,它可能不可靠,但大多数打印驱动程序将PJL或XML格式的文档名放在打印作业的顶部。有了一些灵活的规则,您可能能够自信地提取这些数据
这当然是假定PS数据是由打印机驱动程序生成的。
< P>从C++打印作业中提取文档名。p> #include <WinSpool.h>
wstring GetDocumentName(wstring m_strFriendlyName)
{
wstring strDocName = L"";
HANDLE hPrinter ;
if ( OpenPrinter(const_cast<LPWSTR>(m_strFriendlyName.c_str()), &hPrinter, NULL) == 0 )
{
/*OpenPrinter call failed*/
return false;
}
DWORD dwBufsize = 0;
PRINTER_INFO_2* pinfo = 0;
GetPrinter(hPrinter, 2,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize
PRINTER_INFO_2* pinfo2 = (PRINTER_INFO_2*)malloc(dwBufsize); //Allocate with dwBufsize
GetPrinter(hPrinter, 2,(LPBYTE)pinfo2, dwBufsize, &dwBufsize);
DWORD numJobs = pinfo2->cJobs;
free(pinfo2);
JOB_INFO_1 *pJobInfo = 0;
DWORD bytesNeeded = 0, jobsReturned = 0;
//Get info about jobs in queue.
EnumJobs(hPrinter, 0, numJobs, 1, (LPBYTE)pJobInfo, 0,&bytesNeeded,&jobsReturned);
pJobInfo = (JOB_INFO_1*) malloc(bytesNeeded);
EnumJobs(hPrinter, 0, numJobs, 1, (LPBYTE)pJobInfo, bytesNeeded, &bytesNeeded, &jobsReturned);
JOB_INFO_1 *pJobInfoInitial = pJobInfo;
for(unsigned short count = 0; count < jobsReturned; count++)
{
if (pJobInfo != NULL)
{
strDocName = pJobInfo->pDocument; // Document name
DWORD dw = pJobInfo->Status;
}
pJobInfo++;
}
free(pJobInfoInitial);
ClosePrinter( hPrinter );
return strDocName;
}
#包括
wstring GetDocumentName(wstring m_strFriendlyName)
{
wstring strDocName=L“”;
手柄式打印机;
if(OpenPrinter(const_cast(m_strFriendlyName.c_str()),&hPrinter,NULL)==0)
{
/*OpenPrinter调用失败*/
返回false;
}
DWORD dwBufsize=0;
打印机信息2*pinfo=0;
GetPrinter(hPrinter,2,(LPBYTE)pinfo、dwBufsize和dwBufsize);//获取dwBufsize
打印机_INFO_2*pinfo2=(打印机_INFO_2*)malloc(dwBufsize);//使用dwBufsize分配
GetPrinter(hPrinter,2,(LPBYTE)pinfo2、dwBufsize和dwBufsize);
DWORD numJobs=pinfo2->cJobs;
免费(pinfo2);
作业信息1*pJobInfo=0;
DWORD字节数needed=0,jobsreturn=0;
//获取有关队列中作业的信息。
枚举作业(hPrinter,0,numJobs,1,(LPBYTE)pJobInfo,0,&bytesRequired,&jobsReturn);
pJobInfo=(作业信息1*)malloc(需要字节);
枚举作业(hPrinter,0,numJobs,1,(LPBYTE)pJobInfo,bytesRequired,&bytesRequired,&jobsReturn);
作业信息1*pJobInfoInitial=pJobInfo;
对于(无符号短计数=0;计数<作业返回;计数++)
{
如果(pJobInfo!=NULL)
{
strDocName=pJobInfo->pDocument;//文档名
DWORD dw=pJobInfo->状态;
}
pJobInfo++;
}
免费(pJobInfoInitial);
闭式打印机(hPrinter);
返回strDocName;
}
您不需要包含某种头文件吗?还有函数定义?这个答案感觉不完整。对此我很抱歉。。我添加了头文件和函数定义。