2017-05-22 15 views
0
gesetzt

Das folgende Codefragment sendet Postscript-Inhalt an einen CutePDF Drucker (in pBuf Puffer gespeichert):PDF Drucker PDF erzeugt nur dann, wenn Ausgabedateiname nicht

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); 
} 

Während der Ausführung dieses Codes, erscheint ein Dialog wo ich den Namen der Ausgabedatei angeben (zB D:/out.pdf), danach wird die PDF-Datei erzeugt. So weit, ist es gut. Die Probleme beginnen, wenn ich versuche, den Dateinamen Schritt zu vermeiden Angabe von Zeile 4 des Snippets zu ändern:

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

Solcher Code zeigt nicht den Dialog während seiner Ausführung (wie erwartet), aber das Ergebnis D:/out.pdf isn In einer PDF-Datei ist es eine Kopie der PostScript-Datei, die an den Drucker gesendet wird (Kopie des Inhalts von pBuf Puffer). PDF Writer verhält sich auf die gleiche Weise. Warum verhalten sich PDF-Drucker so und wie kann ich das gewünschte Verhalten erreichen (PDF-Datei generieren, ohne den Namen in der Benutzeroberfläche anzugeben)?

Antwort

1

Das Windows-Drucksystem verhält sich auf diese Weise, weil, um ehrlich zu sein, sich sein Verhalten so verhält. Wenn Sie an dieser Stelle einen Dateinamen angeben, sendet das Drucksystem die Ausgabe an diese Datei. Wenn Sie keinen Dateinamen angeben, wird mit der normalen Verarbeitung fortgefahren.

Normalerweise würden Sie die Druckertreiber-Ausgabe an einen Port senden, und im Fall von PDF-Druckern würde ein benutzerdefinierter Port-Monitor die Ausgabe (in diesem Fall PostScript) übernehmen und weiterverarbeiten. Bei PDF-Druckern senden sie das PostScript an einen Prozess, der das PostScript in PDF umwandelt (fast immer mit Ghostscript, obwohl die Adobe PDF-Tools auf die gleiche Weise funktionieren).

Wenn Sie die Ausgabe des PDF-Prozesses ändern möchten (dh schreiben Sie es in eine andere Datei), dann müssen Sie die Port-Monitor funktioniert ändern, nicht die Art, wie das Druck-Subsystem funktioniert, was ist Ihr Code macht gerade. Indem Sie einen Dateinamen an der Stelle setzen, an der Sie sich befinden, schließen Sie den Prozess einfach kurz und rufen niemals den Port-Monitor auf. Deshalb wird das Dialogfeld "Datei speichern" nicht angezeigt und die Ausgabe ist PostScript.

Möglicherweise gibt es eine Möglichkeit, die Ausgabedatei anzugeben, die für den von Ihnen verwendeten PDF-Drucker dokumentiert ist. Wenn dies nicht der Fall ist, können Sie für Open-Source-Produkte (und wenn GS eingebaut ist, sollten sie GPL-lizenziert sein) eine Kopie des Quellcodes für das Produkt anfordern und diese nach Belieben ändern.

Alternativ können Sie eine Kopie von Ghostscript und RedMon (Open-Source-Port-Monitor) abholen und ein eigenes Werkzeug für den gleichen Job erstellen.