如果您有原始的postscript数据,是否有可靠的方法从postscript打印作业中提取文档名称或作业名称?
我见过打印发布站软件,用打印的文档名称或网址标记每个作业,这似乎是可能的。
答案 0 :(得分:2)
没有可靠的方法可以做到这一点,因为PostScript语言中没有这样的(元数据)信息。 如果您的文件符合DSC(文档结构公约),那么您可以查找评论。这些记录在DSC参考手册中。有效的PostScript文件无需符合DSC标准。
除此之外,没有任何信息可以提取,至少就PostScript而言。
答案 1 :(得分:1)
使用C ++从打印作业中提取文档名称。
#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;
}
答案 2 :(得分:0)
您可能会看到应用程序提交给打印后台处理程序的文档名称。此外,它可能不太可靠,但大多数打印驱动程序将文档名称放在打印作业顶部的PJL或XML中。通过一些灵活的规则,您可以放心地提取这些数据。
当然,这假设PS数据是由打印机驱动程序生成的。