2017-05-22 3 views
0

Le code suivant envoie le contenu PostScript (enregistré dans pBuf tampon) à une imprimante CutePDF:PDF imprimante génère PDF uniquement lorsque le nom du fichier de sortie n'est pas réglé

if (OpenPrinter(printerName, &hPrinter, NULL)) 
{ 
    DOC_INFO_1 di1; 
    di1.pDatatype = L"RAW"; 
    di1.pDocName = L"Raw print document"; 
    di1.pOutputFile = NULL; 
    StartDocPrinter(hPrinter, 1, (LPBYTE)&di1); 
    StartPagePrinter(hPrinter); 
    DWORD dwWritten = 0; 
    WritePrinter(hPrinter, pBuf, dwBufSize, &dwWritten); 
    EndPagePrinter(hPrinter); 
    EndDocPrinter(hPrinter); 
} 

Au cours de l'exécution de ce code, une boîte de dialogue apparaît où je spécifie le nom du fichier de sortie (par exemple D:/out.pdf), après que le fichier pdf est généré. Jusqu'ici tout va bien. Les problèmes commencent quand je suis en train d'éviter le nom de fichier étape de spécification en changeant la ligne 4 de l'extrait:

di1.pOutputFile = L"D:/out.pdf"; 

tel code ne montre pas la boîte de dialogue lors de son exécution (comme prévu), mais le résultat D:/out.pdf ISN 't un fichier pdf, c'est une copie du fichier PostScript envoyé à l'imprimante (copie du contenu du tampon pBuf). PDF Writer se comporte de la même manière. Pourquoi les imprimantes PDF se comportent-elles de cette manière et comment puis-je obtenir le comportement nécessaire (générer un fichier PDF sans spécifier son nom dans l'interface utilisateur)?

Répondre

1

Le système d'impression Windows se comporte de cette façon, car, pour être franc, c'est ainsi que son comportement est censé se comporter. Si vous spécifiez un nom de fichier à ce moment-là, le système d'impression envoie la sortie à ce fichier. Si vous ne spécifiez pas de nom de fichier, il passe au traitement normal.

Normalement, vous enverriez la sortie du pilote d'imprimante à un port, et dans le cas des imprimantes PDF, un moniteur de port personnalisé ramasserait la sortie (PostScript dans ce cas) et la traiterait davantage. Pour les imprimantes PDF, ils envoient le PostScript à un processus qui convertit le PostScript en PDF (en utilisant presque toujours Ghostscript, bien que les outils Adobe print to PDF fonctionnent de la même manière). Si vous souhaitez modifier la sortie du processus PDF (c'est-à-dire l'écrire dans un fichier différent), vous devez modifier le fonctionnement du moniteur de port , et non le fonctionnement du sous-système d'impression. votre code est en train de faire. En définissant un nom de fichier où vous êtes, vous court-circuitez simplement le processus, sans invoquer le moniteur de port, ce qui explique pourquoi la boîte de dialogue «Enregistrer le fichier» n'apparaît pas et pourquoi la sortie est PostScript.

Il existe peut-être un moyen de spécifier le fichier de sortie documenté pour l'imprimante PDF spécifique que vous utilisez. Si ce n'est pas le cas, alors pour les produits open source (et si GS est intégré, ils doivent être sous licence GPL), vous pouvez demander une copie du code source du produit et le modifier en fonction de vous. Alternativement, vous pouvez prendre une copie de Ghostscript et RedMon (open source Port Monitor) et créer votre propre outil pour faire le même travail.