2010-04-08 51 views
9

Me gustaría imprimir archivos PDF en la impresora de red de Windows a través de GhostScript.
(no quiero utilizar Adobe Reader)Cómo imprimir PDF en una impresora de red predeterminada usando el comando de shell GhostScript (gswin32c.exe)

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 -sDEVICE parámetro = "\ server_IP \ nombre_impresora" pero esto no funcionó, así ...)

comando cmd trabajando bajo Windows: Método

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

base creada en la anterior - doesnt excepción de trabajo y errores. (Código de error = 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; 
    } 

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

+1

Lo siento, pero solo porque está planeando llamar esto desde su aplicación C# no lo convierte en un problema de programación, sugeriría SuperUser para esta pregunta de Ghostscript y he votado a favor de que esta pregunta se traslade allí para usted. – Lazarus

+0

He editado la publicación para que sea más específica de C# ahora – Maciej

Respuesta

12

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

/// <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

También debe llamar a process.Close() después de obtener el código de salida. –

+0

Tiene usted razón, gracias – Maciej

+0

El único problema que tengo con el método anterior son los márgenes de página. No pude encontrar una solución para configurarlos. ASÍ QUE el contenido de mi página principal a menudo se corta. Me pregunto si alguien sabe cómo resolver eso. – Maciej

3

Debe probar las opciones de la línea de comandos, y luego traducir los éxitos en 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 utiliza algunas cajas internas que organizan la página (y objeto) contenido: MediaBox, TrimBox, CropBox, Bleedbox.

Hay varias opciones para controlar por lo que "el tamaño del material" Ghostscript hace una entrada dada:

-dPDFFitPage 
-dUseTrimBox 
-dUseCropBox 

Con PDFFitPage Ghostscript pagará al tamaño del dispositivo página actual (por lo general el tamaño de página por defecto).

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

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

De forma predeterminada (no da ningún parámetro), Ghostscript mostrará el MediaBox.

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

3

No está seguro si ayuda a nadie, pero para agregar los documentos de impresión a una cola en lugar de imprimir inmediatamente realizar cambios en el apartado anterior con

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

Pre-requisitos: Configurar el tipo de trabajo de la impresora para "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.

+0

cómo se ve en la línea de comando? No puedo hacer que la parte de la impresora de red funcione. Lo estoy ejecutando en un trabajo por lotes – user3015739

Cuestiones relacionadas