¿Cómo puedo enviar un documento de archivo a la impresora y hacer que se imprima?

Aquí está la premisa básica:

Mi usuario hace clic en algunos artilugios y un archivo PDF se escupe en su escritorio. ¿Hay alguna forma de enviar este archivo a la cola de la impresora y hacer que se imprima en la impresora conectada localmente?

string filePath = "filepathisalreadysethere"; SendToPrinter(filePath); //Something like this? 

Él hará este proceso muchas veces. Para cada alumno en el aula, tiene que imprimir una pequeña libreta de calificaciones. Así que genero un PDF para cada estudiante y me gustaría automatizar el proceso de impresión en lugar de generar el pdf, imprimir, generar PDF, imprimir, generar PDF, imprimir.

¿Alguna sugerencia sobre cómo abordar esto? Me estoy ejecutando en Windows XP con Windows Forms .NET 4.

Encontré esta pregunta de StackOverflow donde sugiere la respuesta aceptada:

Una vez que haya creado sus archivos, puede imprimirlos a través de una línea de comando (puede usar la clase Command que se encuentra en el espacio de nombres System.Diagnostics para eso)

¿Cómo podría lograr esto?

Puede decirle a Acrobat Reader que imprima el archivo usando (como alguien ya mencionó aquí) el verbo ‘imprimir’. Deberá cerrar Acrobat Reader programáticamente después de eso también:

 private void SendToPrinter() { ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "print"; info.FileName = @"c:\output.pdf"; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process p = new Process(); p.StartInfo = info; p.Start(); p.WaitForInputIdle(); System.Threading.Thread.Sleep(3000); if (false == p.CloseMainWindow()) p.Kill(); } 

Esto abre Acrobat Reader y le dice que envíe el PDF a la impresora predeterminada, y luego apaga Acrobat después de tres segundos.

Si está dispuesto a enviar otros productos con su aplicación, puede usar GhostScript (gratis) o una impresora de línea de comando como http://www.commandlinepdf.com/ (comercial).

Nota: el código de muestra abre el PDF en la aplicación actual registrada para imprimir archivos PDF , que es el Adobe Acrobat Reader en las máquinas de la mayoría de las personas. Sin embargo, es posible que utilicen un visor de PDF diferente, como Foxit ( http://www.foxitsoftware.com/pdf/reader/ ). Sin embargo, el código de muestra aún debería funcionar.

Agregar una nueva respuesta a esto, ya que la cuestión de la impresión de PDF en .net ha existido por mucho tiempo y la mayoría de las respuestas son anteriores a la biblioteca Google Pdfium, que ahora tiene un contenedor .net. Para mí, yo misma estaba investigando este problema y seguía apareciendo en blanco, tratando de hacer soluciones hacky como el engendro de Acrobat u otros lectores de PDF, o entrando en bibliotecas comerciales que son caras y no tienen términos de licencia muy compatibles. Pero la biblioteca Google Pdfium y el contenedor .net PdfiumViewer son de código abierto, por lo que son una gran solución para muchos desarrolladores, incluido yo mismo. PdfiumViewer está licenciado bajo la licencia Apache 2.0.

Puede obtener el paquete NuGet aquí:

https://www.nuget.org/packages/PdfiumViewer/

y puedes encontrar el código fuente aquí:

https://github.com/pvginkel/PdfiumViewer

Aquí hay un código simple que imprimirá silenciosamente cualquier número de copias de un archivo PDF desde su nombre de archivo. También puedes cargar archivos PDF desde una transmisión (que es la forma en que normalmente lo hacemos), y puedes averiguarlo fácilmente mirando el código o los ejemplos. También hay una vista de archivo PDF WinForm para que también pueda renderizar los archivos PDF en una vista o imprimir una vista previa de ellos. Para nosotros simplemente necesitaba una forma de imprimir silenciosamente el archivo PDF a una impresora específica a pedido.

 public bool PrintPDF( string printer, string paperName, string filename, int copies) { try { // Create the printer settings for our printer var printerSettings = new PrinterSettings { PrinterName = printer, Copies = (short)copies, }; // Create our page settings for the paper size selected var pageSettings = new PageSettings(printerSettings) { Margins = new Margins(0, 0, 0, 0), }; foreach (PaperSize paperSize in printerSettings.PaperSizes) { if (paperSize.PaperName == paperName) { pageSettings.PaperSize = paperSize; break; } } // Now print the PDF document using (var document = PdfDocument.Load(filename)) { using (var printDocument = document.CreatePrintDocument()) { printDocument.PrinterSettings = printerSettings; printDocument.DefaultPageSettings = pageSettings; printDocument.PrintController = new StandardPrintController(); printDocument.Print(); } } return true; } catch { return false; } } 

Sé que la etiqueta dice Windows Forms … pero, si alguien está interesado en un método de aplicación WPF , System.Printing funciona como un encanto.

 var file = File.ReadAllBytes(pdfFilePath); var printQueue = LocalPrintServer.GetDefaultPrintQueue(); using (var job = printQueue.AddJob()) using (var stream = job.JobStream) { stream.Write(file, 0, file.Length); } 

Solo recuerda incluir la referencia de System.Printing , si aún no está incluida. Ahora, este método no funciona bien con ASP.NET o Windows Service . No debe usarse con Windows Forms , ya que tiene System.Drawing.Printing . No tengo un solo problema con mi impresión de PDF usando el código anterior.

Debo mencionar, sin embargo, que si su impresora no es compatible con Direct Print para formato de archivo PDF, no tiene suerte con este método.

Esta es una solución ligeramente modificada. El proceso se eliminará cuando esté inactivo durante al menos 1 segundo. Tal vez deberías agregar un tiempo de X segundos y llamar a la función desde un hilo separado.

 private void SendToPrinter() { ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "print"; info.FileName = @"c:\output.pdf"; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process p = new Process(); p.StartInfo = info; p.Start(); long ticks = -1; while (ticks != p.TotalProcessorTime.Ticks) { ticks = p.TotalProcessorTime.Ticks; Thread.Sleep(1000); } if (false == p.CloseMainWindow()) p.Kill(); } 

System.Diagnostics.Process.Start se puede usar para imprimir un documento. Establezca UseShellExecute en True y configure el verbo para “imprimir”.

El siguiente fragmento de código es una adaptación del código de Kendall Bennett para imprimir archivos PDF utilizando la biblioteca PdfiumViewer. La principal diferencia es que se usa un Stream en lugar de un archivo.

public bool PrintPDF (impresora de cuerdas, string paperName, int copies, secuencia de transmisión) {try {// Crear la configuración de impresora para nuestra impresora var printerSettings = new PrinterSettings {PrinterName = printer, Copies = (short) copias,};

  // Create our page settings for the paper size selected var pageSettings = new PageSettings(printerSettings) { Margins = new Margins(0, 0, 0, 0), }; foreach (PaperSize paperSize in printerSettings.PaperSizes) { if (paperSize.PaperName == paperName) { pageSettings.PaperSize = paperSize; break; } } // Now print the PDF document using (var document = PdfiumViewer.PdfDocument.Load(stream)) { using (var printDocument = document.CreatePrintDocument()) { printDocument.PrinterSettings = printerSettings; printDocument.DefaultPageSettings = pageSettings; printDocument.PrintController = new StandardPrintController(); printDocument.Print(); } } return true; } catch (System.Exception e) { return false; } } 

En mi caso, estoy generando el archivo PDF usando una biblioteca llamada PdfSharp y luego guardando el documento en un Stream como sigue:

  PdfDocument pdf = PdfGenerator.GeneratePdf(printRequest.html, PageSize.A4); pdf.AddPage(); MemoryStream stream = new MemoryStream(); pdf.Save(stream); MemoryStream stream2 = new MemoryStream(stream.ToArray()); 

Una cosa que quiero señalar que podría ser útil para otros desarrolladores es que tuve que instalar la versión de 32 bits del dll nativo pdfuim para que la impresión funcionara aunque estoy ejecutando Windows 10 de 64 bits. Instalé los siguientes dos paquetes NuGet usando el administrador de paquetes NuGet en Visual Studio:

  • PdfiumViewer
  • PdfiumViewer.Native.x86.v8-xfa

Puedes probar con GhostScript como en esta publicación:

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

La manera fácil:

 var pi=new ProcessStartInfo("C:\file.docx"); pi.UseShellExecute = true; pi.Verb = "print"; var process = System.Diagnostics.Process.Start(pi); 

esta es una respuesta tardía, pero también podría usar el método File.Copy del espacio de nombres System.IO top para enviar un archivo a la impresora:

 System.IO.File.Copy(filename, printerName); 

Esto funciona bien

Sé que Edwin respondió eso arriba pero su único documento imprime. Uso este código para imprimir todos los archivos de un directorio determinado.

 public void PrintAllFiles() { System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(); info.Verb = "print"; System.Diagnostics.Process p = new System.Diagnostics.Process(); //Load Files in Selected Folder string[] allFiles = System.IO.Directory.GetFiles(Directory); foreach (string file in allFiles) { info.FileName = @file; info.CreateNoWindow = true; info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; p.StartInfo = info; p.Start(); } //p.Kill(); Can Create A Kill Statement Here... but I found I don't need one MessageBox.Show("Print Complete"); } 

Básicamente recorre cada archivo en la variable de directorio determinada Directorio -> para mí fue @ “C: \ Users \ Owner \ Documents \ SalesVaultTesting \” e imprime esos archivos en su impresora predeterminada .