2012-02-16 3 views
1

Existe-t-il un moyen fiable d'extraire un nom de document ou un nom de travail d'un travail d'impression postscript si vous avez les données postscript brutes?Extraction du nom du document à partir du travail d'impression

J'ai vu un logiciel de station d'impression qui étiquetait chaque travail avec un nom de document ou une URL à partir de laquelle il était imprimé, donc cela semble possible.

Répondre

2

Il n'y a pas fiable pour ce faire, car il n'y a pas de telles informations (métadonnées) dans le langage PostScript. Si vos fichiers sont conformes DSC (Document Structuring Convention), vous pouvez rechercher des commentaires. Ceux-ci sont documentés dans le manuel de référence DSC. Les fichiers PostScript valides ne doivent pas être compatibles DSC.

À part cela, il n'y a pas d'informations à extraire, du moins en ce qui concerne PostScript.

0

Ce que vous pouvez voir est le nom de document que l'application a soumis au spouleur d'impression. En outre, il peut ne pas être fiable, mais la plupart des pilotes d'impression placent le nom du document en PJL ou XML en haut du travail d'impression. Avec certaines règles flexibles, vous pourriez être en mesure de tirer ces données avec une certaine confiance. Cela suppose, bien sûr, que les données PS ont été générées par des pilotes d'imprimante.

1

Pour extraire le nom du document du travail d'impression en utilisant 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

Vous n'avez pas besoin d'une sorte d'inclusion d'en-tête? Et une définition de fonction? Cette réponse semble incomplète. –

+0

désolé pour cela .. j'ai ajouté le fichier d'en-tête et la définition de la fonction. –

+0

Beaucoup mieux. +1! –

Questions connexes