Cómo imprimir PDF en una impresora de red predeterminada con el comando de shell GhostScript (gswin32c.exe)

Me gustaría imprimir archivos PDF en la impresora de red de Windows a través de GhostScript.
(No quiero usar Adobe Reader)

He leído gswin32c.exe que puede hacer el trabajo.
Experimenté con muchos comandos y no encontré la manera de forzar gs para imprimir PDF en mi unidad de red (predeterminada de Windows).

No necesito el punto exacto de la impresora de red: se puede usar el predeterminado. Pero si no existe tal opción, me alegra pasar el nombre de la impresora también. (He intentado con param -SDevice = “\ server_IP \ printer_name” pero esto tampoco funcionó …)

Comando que trabaja bajo Windows cmd:

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

Método creado en la base de arriba: no funciona y es una excepción. (Código de error = 1)

  ///  /// Prints the PDF. ///  /// The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe" /// The number of copies. /// Name of the printer. Eg \\server_name\printer_name /// Name of the PDF file. ///  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; } 

¿Alguna idea de cómo hacerlo funcionar bajo C #?

Finalmente he hecho que funcione y sea fácil de depurar.
Mi código de método final para los interesados:

  ///  /// Prints the PDF. ///  /// The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe" /// The number of copies. /// Name of the printer. Eg \\server_name\printer_name /// Name of the PDF file. ///  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; } 

Primero debe probar sus opciones desde la línea de comando y luego traducir los éxitos a su código.

Un archivo PDF generalmente ya incluye los márgenes de página. El contenido de la página “a menudo cortado” puede ser el resultado de un PDF destinado a tamaño de página A4 impreso en formato Carta.

PDF también usa algunos cuadros internos que organizan el contenido de la página (y el objeto): MediaBox , TrimBox , CropBox , Bleedbox .

Hay varias opciones para controlar para las cuales el “tamaño de los medios” Ghostscript representa una entrada dada:

 -dPDFFitPage -dUseTrimBox -dUseCropBox 

Con PDFFitPage Ghostscript mostrará el tamaño del dispositivo de la página actual (generalmente el tamaño de página predeterminado).

Con UseTrimBox usará la TrimBox (y al mismo tiempo establecerá el PageSize de PageSize en ese valor).

Con UseCropBox utilizará CropBox (y al mismo tiempo establecerá el PageSize de PageSize en ese valor).

Por defecto (no da ningún parámetro), Ghostscript renderizará usando el MediaBox .

Tenga en cuenta que también puede controlar el tamaño total de su salida utilizando -sPAPERSIZE (seleccione entre todos los valores predefinidos que Ghostscript conoce) o (para mayor flexibilidad) use -dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN para configurar tamaños de página personalizados.

No estoy seguro si ayuda a alguien, pero para agregar los documentos de impresión a una cola en lugar de imprimirlos inmediatamente, realice los cambios en la sección anterior con

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

Prerrequisitos: configure el tipo de trabajo de su impresora en “Mantener impresión”: en nuestro caso, tenemos una impresora Rico Aficio MP 4000 y nuestro uso es ejecutar un trabajo nocturno para imprimir un grupo de archivos PDF generados a través de SSRS.