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

时间:2012-02-16 22:17:25

标签: printing postscript

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

我见过打印发布站软件,用打印的文档名称或网址标记每个作业,这似乎是可能的。

3 个答案:

答案 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数据是由打印机驱动程序生成的。