2017-12-29 34 views
0

Ich erstelle Prn-Code aus PDFs und senden Sie sie an Drucker in einem C# -Code, um Druckaufträge zu automatisieren. Um dies zu tun, verwende ich Ghost-Skript mit folgenden Parametern.Ghost-Skript spiegelt nicht die richtigen Informationen in der PRN-Datei

gswin32c -dNOPAUSE -dBATCH -sDEVICE=laserjet -sOutputFile="c:/temp/out.prn" "NumberedPages.pdf" 

enter image description here

Diese Kommandozeilenargumente generiert eine PRN-Datei namens out.prn. Wenn ich diese Datei mit folgendem C# -Code an den Drucker sende, wird die PDF-Datei erfolgreich gedruckt.

public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount) 
     { 
      uint returnedValue = 0; 
      Int32 dwError = 0, dwWritten = 0; 
      IntPtr hPrinter = new IntPtr(0); 
      DOCINFOA di = new DOCINFOA(); 
      bool bSuccess = false; // Assume failure unless you specifically succeed. 

      di.pDocName = "My C#.NET RAW Document"; 
      di.pDataType = "RAW"; 

      // Open the printer. 
      if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
      { 
       // Start a document. 
       returnedValue = StartDocPrinter(hPrinter, 1, di); 

       if (0 != returnedValue) 
       { 
        // Start a page. 
        if (StartPagePrinter(hPrinter)) 
        { 
         // Write your bytes. 
         bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); 
         EndPagePrinter(hPrinter); 
        } 
        EndDocPrinter(hPrinter); 
       } 
       ClosePrinter(hPrinter); 
      } 
      // If you did not succeed, GetLastError may give more information 
      // about why not. 
      if (bSuccess == false) 
      { 
       dwError = Marshal.GetLastWin32Error(); 
      } 
      return bSuccess; 
     } 

(https://stackoverflow.com/a/29564132/3079364)

ich auch die Druckaufträge überwachen möchten, wenn sie durch den Drucker erfolgreich gedruckt werden oder nicht. Aber die prn-Datei, die von Ghost-Skript generiert wird, spiegelt nicht die richtige Anzahl der Seiten wider. Siehe unten

Printed by ghostscript

Captured von CZ Print Job Tracker

Wenn ich dieses Dokument drucken mit Word oder Adobe, CZ Print Job Tracker die richtige Anzahl der Seiten zeigt.

When printed by Word

Gibt es einen Parameter, die ich Ghost Script-Befehl hinzufügen, können diese Informationen zu korrigieren?

Antwort

2

Die Ausgabedatei ist einfach eine PCL-Datei, denn das verstehen die Laserjet-Geräte. Dies enthält keine Informationen über die Anzahl der Seiten in der Datei.

Der Grund, warum der Druckerspooler denkt, dass es nur eine Seite gibt, liegt daran, dass Sie es nicht anders gesagt haben. Sie haben eine Datei geöffnet, eine Seite gestartet und den Inhalt direkt an den Drucker ausgegeben, es gibt keine Möglichkeit für den Spooler zu wissen, wie viele Seiten dieser Stream enthält, wenn Sie nicht wissen, wo jeder beginnt und stoppt.

Sie rufen StartPagePrinter einmal auf, so nimmt der Druckspooler (nicht unangemessen) an, dass es nur eine Seite gibt. Wenn Sie für jede Seite StartPagePrinter und EndPagePrinter einmal aufrufen, erhalten Sie die richtige Anzahl an Seiten. Das bedeutet natürlich, dass Sie wissen, wo jede Seite beginnt und endet in der von Ghostscript ausgegebenen Datei, die Sie nicht kennen.

Am besten verwenden Sie das% d-Format für OutputFile, um eine Datei pro Seite zu erstellen. Die Seitenzählung ist dann korrekt.

Es scheint keine Möglichkeit zu geben, dem Druckspooler mitzuteilen, wie viele Seiten es gibt, wenn Sie Daten direkt an den Drucker senden. Ich denke, das ist nicht überraschend, da der Druckspooler nicht wirklich involviert ist.

Verwandte Themen