Printing 从打印作业中提取文档名称

Printing 从打印作业中提取文档名称,printing,postscript,Printing,Postscript,如果您有原始postscript数据,是否有可靠的方法从postscript打印作业中提取文档名或作业名 我见过print release station软件,它用打印作业的文档名或url标记每个作业,因此这似乎是可能的。没有可靠的方法来做到这一点,因为PostScript语言中没有此类(元数据)信息如果您的文件符合DSC(文档结构约定),则可以查找注释。这些记录在DSC参考手册中。有效的PostScript文件不需要符合DSC 除此之外,至少就PostScript而言,这里没有可提取的信息。您

如果您有原始postscript数据,是否有可靠的方法从postscript打印作业中提取文档名或作业名

我见过print release station软件,它用打印作业的文档名或url标记每个作业,因此这似乎是可能的。

没有可靠的方法来做到这一点,因为PostScript语言中没有此类(元数据)信息如果您的文件符合DSC(文档结构约定),则可以查找注释。这些记录在DSC参考手册中。有效的PostScript文件不需要符合DSC


除此之外,至少就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;
}

您不需要包含某种头文件吗?还有函数定义?这个答案感觉不完整。对此我很抱歉。。我添加了头文件和函数定义。