2010-04-08 16 views
9

Chciałbym wydrukować plik (e) PDF na drukarce sieciowej Windows za pośrednictwem GhostScript.
(nie chcę używać Adobe Reader)Jak wydrukować plik PDF na domyślnej drukarce sieciowej za pomocą polecenia powłoki GhostScript (gswin32c.exe)

Czytałem gswin32c.exe, które mogą wykonać zadanie.
Eksperymentowałem z wieloma komendami i nie mogłem znaleźć sposobu, jak wymusić gs, aby wydrukować plik PDF na moim (domyślnym systemie Windows) napędzie sieciowym.

Nie potrzebuję dokładnej drukarki sieciowej - domyślnie można użyć. Ale jeśli nie ma takiej opcji, z przyjemnością przekazuję nazwę drukarki. (Próbowałem z param -sDEVICE = "\ IP_serwera \ PRINTER_NAME", ale to nie działał, jak również ...)

poleceń cmd działa pod Windows:

gswin32c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile="\\spool\\\Server_Name\Printer_name" "C:\test.pdf" 

metodzie stworzonej bazy na wyżej - nie robi wyjątek od pracy i thorwsa. (Kod błędu = 1)

/// <summary> 
    /// Prints the PDF. 
    /// </summary> 
    /// <param name="ghostScriptPath">The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe"</param> 
    /// <param name="numberOfCopies">The number of copies.</param> 
    /// <param name="printerName">Name of the printer. Eg \\server_name\printer_name</param> 
    /// <param name="pdfFileName">Name of the PDF file.</param> 
    /// <returns></returns> 
    public bool PrintPDF (string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName) { 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.Arguments   = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\" + printerName + "\" \"" + pdfFileName + "\""; 
     startInfo.FileName   = ghostScriptPath; 
     startInfo.UseShellExecute = false; 

     Process process = Process.Start(startInfo); 

     return process.ExitCode == 0; 
    } 

Każdy pomysł, jak sprawić, by działał pod C#?

+1

Przepraszam, ale tylko dlatego, że planujesz wywołać to z poziomu aplikacji C#, nie oznacza to, że jest to problem programistyczny, sugeruję SuperUser dla tego pytania Ghostscript i zagłosowałem na to pytanie. – Lazarus

+0

Edytowałem post, aby być bardziej specyficznym dla C# teraz – Maciej

Odpowiedz

12

W końcu sprawiło, że działa i jest łatwe do debugowania.
Moja ostatnia metoda kod dla zainteresowanych:

/// <summary> 
    /// Prints the PDF. 
    /// </summary> 
    /// <param name="ghostScriptPath">The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe"</param> 
    /// <param name="numberOfCopies">The number of copies.</param> 
    /// <param name="printerName">Name of the printer. Eg \\server_name\printer_name</param> 
    /// <param name="pdfFileName">Name of the PDF file.</param> 
    /// <returns></returns> 
    public bool PrintPDF (string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName) { 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.Arguments   = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\" + printerName + "\" \"" + pdfFileName + "\" "; 
     startInfo.FileName   = ghostScriptPath; 
     startInfo.UseShellExecute = false; 

     startInfo.RedirectStandardError = true; 
     startInfo.RedirectStandardOutput = true; 

     Process process = Process.Start(startInfo); 

     Console.WriteLine(process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd()); 

     process.WaitForExit(30000); 
     if (process.HasExited == false) process.Kill(); 


     return process.ExitCode == 0; 
    } 
+1

Powinieneś również wywołać process.Close(), po otrzymaniu kodu wyjścia. –

+0

Masz rację - dzięki – Maciej

+0

Jedynym problemem jaki mam z powyższą metodą są marginesy strony. Nie mogę znaleźć rozwiązania, jak je skonfigurować. W związku z tym zawartość mojej strony głównej jest często wycinana. Zastanawiam się, czy ktoś wie, jak to rozwiązać? – Maciej

3

należy przetestować opcje z pierwszego wiersza polecenia, a następnie przełożyć sukcesy w kodzie.

Plik PDF zwykle zawiera już marginesy strony. Często "wycinanie" zawartości strony może wynikać z pliku PDF przeznaczonego do formatu strony A4 wydrukowanego w formacie Letter.

PDF wykorzystuje również pewne wewnętrzne pola, które organizują strona (i obiektu) zawartość: MediaBox, TrimBox, CropBox, Bleedbox.

Istnieją różne opcje sterowania dla którego „wielkość media” Ghostscript czyni daną wejściowe:

-dPDFFitPage 
-dUseTrimBox 
-dUseCropBox 

Z PDFFitPage Ghostscript odda bieżącego rozmiaru urządzenia strona (zazwyczaj domyślny rozmiar strony).

Z UseTrimBox użyje ona TrimBox (i jednocześnie ustawi tę wartość na PageSize).

Z UseCropBox użyje on CropBox (i jednocześnie ustawi tę wartość na PageSize).

Domyślnie (brak parametru), Ghostscript wyrenderuje za pomocą MediaBox.

Uwaga: możesz dodatkowo kontrolować całkowity rozmiar wydruku, korzystając z -sPAPERSIZE (wybierz spośród wszystkich wstępnie zdefiniowanych wartości, które zna Ghostscript) lub (dla większej elastyczności) użyj -dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN, aby skonfigurować niestandardowe rozmiary stron.

3

Nie jestem pewien, czy to pomaga nikomu, ale dodać drukowania dokumentów do kolejki zamiast natychmiastowego drukowania dokonać zmian w powyższym punkcie z

startInfo.Arguments = " -dPrinted -dNoCancel=true -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%" + printerName + " \"" + pdfFullFileName + "\""; 

wstępne: Konfigurowanie drukarki typ zadania do "Hold Print": W naszym przypadku mamy Rico Aficio MP 4000 Printer, a naszym użyciem jest prowadzenie nocnej pracy, aby wydrukować kilka plików PDF wygenerowanych przez SSRS.

+0

jak to wygląda w linii poleceń? Nie mogę uzyskać części drukarki sieciowej do pracy. Wykonuję go w zadaniu wsadowym – user3015739

Powiązane problemy