Извлечь название документа из задания на печать - PullRequest
1 голос
/ 17 февраля 2012

Есть ли надежный способ извлечь имя документа или имя задания из задания печати postscript, если у вас есть необработанные данные postscript?

Я видел программное обеспечение станции выпуска печати, которое маркирует каждое задание документомимя или URL-адрес, с которого оно было напечатано, поэтому это представляется возможным.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Не существует надежного способа сделать это, так как на языке PostScript такой информации (метаданных) нет. Если ваши файлы совместимы с DSC (Document Structuring Convention), тогда вы можете искать комментарии. Они задокументированы в справочном руководстве по DSC. Допустимые файлы PostScript не обязательно должны быть совместимы с DSC.

Кроме этого, там нет информации для извлечения, по крайней мере, в том, что касается PostScript.

1 голос
/ 12 октября 2012

Для извлечения имени документа из задания на печать с использованием 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;
}
0 голосов
/ 06 марта 2012

Возможно, вы увидите имя документа, которое приложение отправило в диспетчер очереди печати. Кроме того, это может быть ненадежно, но большинство драйверов печати помещают имя документа в формате PJL или XML вверху задания на печать. С некоторыми гибкими правилами вы можете получить эти данные с некоторой уверенностью.

Это, конечно, предполагает, что данные PS были сгенерированы драйверами принтера.

...