rawprint printer print imprimir form clprint c# winforms pdf printing

printer - print pdf windows form c#



Cómo imprimir un PDF con C# (11)

¿Qué pasa con el uso de la clase PrintDocument ?

http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx

Solo debe pasar el nombre de archivo del archivo que desea imprimir (según el ejemplo).

HTH

Estoy tratando de resolver este problema durante casi 2 días. Hay muchas más o menos buenas soluciones en la red, pero ninguna de ellas se ajusta perfectamente a mi tarea.

Tarea:

  • Imprima un PDF programáticamente
  • Hazlo con una impresora fija.
  • No dejes que el usuario haga más de un botón_Click
  • Hazlo en silencio - cuanto más, mejor
  • Hazlo del lado del cliente

Primeras soluciones:

Hazlo con un Forms.WebBrowser

Si tenemos instalado Adobe Reader, hay un complemento para mostrar los PDF en el navegador web. Con esta solución tenemos una vista previa agradable y con webbrowserControlName.Print () podemos activar el control para imprimir su contenido.

Problema - todavía tenemos un PrintDialog.

Inicie el AcroRd32.exe con argumentos de inicio

El siguiente comando de CMD nos permite usar Adobe Reader para imprimir nuestro PDF.

InsertPathTo .. / AcroRd32.exe / t "C: / sample.pdf" "/ printerNetwork / printerName"

Problemas: necesitamos la ruta de acceso absoluta a AcroRd32.exe | hay una ventana de Adobe Reader que se abre y debe abrirse hasta que la tarea de impresión esté lista.

Usar Windows presets

Process process = new Process(); process.StartInfo.FileName = pathToPdf; process.StartInfo.Verb = "printto"; process.StartInfo.Arguments = "/"" + printerName + "/""; process.Start(); process.WaitForInputIdle(); process.Kill();

Problema: sigue apareciendo una ventana de Adobe Reader, pero una vez finalizada la impresión, generalmente se cierra.

Solución: convencer al cliente de que use Foxit Reader (no use las dos últimas líneas de código).

Convertir páginas PDF a Drawing.Image

No tengo idea de cómo hacerlo con código, pero cuando consigo que esto funcione, el resto es solo un pedazo de pastel. Printing.PrintDocument puede satisfacer todas las demandas.

¿Alguien tiene una idea para obtener algunos Drawing.Image´s de esos PDF u otro enfoque de cómo hacerlo?

Saludos cordiales, Max


A partir de July 2018 , todavía no hay respuesta para el OP. No hay una forma gratuita de 1) imprimir en silencio su pdf para un proyecto de código cerrado 2).

1) Puede utilizar un proceso, por ejemplo, Adobe Acrobat o Foxit Reader.

2) Las soluciones gratuitas tienen una GPL (licencia pública general de GNU). Esto significa que debe abrir su código fuente si le da el software, incluso de forma gratuita, a cualquier persona que no pertenezca a su empresa.

Como dice el OP, si puede obtener un PDF en Drawing.Image, puede imprimirlo con métodos .NET. Lamentablemente, el software para hacer esto también requiere pago o una GPL.


El método más flexible, fácil y con mejor rendimiento que pude encontrar fue usar GhostScript. Puede imprimir en impresoras de Windows directamente por nombre de impresora.

"C: / Archivos de programa / gs / gs9.07 / bin / gswin64c.exe" -dPrinted -dBATCH -dNOPAUSE -sDEVICE = mswinpr2 -dNoCancel -sOutputFile = "% printer% nombre de impresora " " pdfdocument.pdf "

Agregue estos interruptores para reducir el documento a una página A4.

-sPAPERSIZE = a4 -dPDFFitPage



Otro enfoque sería utilizar la función de cola de impresión en .NET para enviar los datos de la impresora preformateados a una impresora. Pero desafortunadamente necesitas trabajar con la API de spooler win32

puede consultar Cómo enviar datos sin procesar a una impresora usando Visual C # .NET

solo puede utilizar este enfoque cuando la impresora admite documentos PDF de forma nativa.


Probé muchas cosas y la que mejor me funcionó fue lanzar un SumatraPDF desde la línea de comandos:

// Launch SumatraPDF Reader to print String arguments = "-print-to-default -silent /"" + fileName + "/""; System.Diagnostics.Process.Start("SumatraPDF.exe", arguments);

Hay tantas ventajas para esto:

  1. SumatraPDF es mucho más rápido que Adobe Acrobat Reader.
  2. La interfaz de usuario no se carga. Sólo imprime.
  3. Puede usar SumatraPDF como una aplicación independiente para que pueda incluirla en su aplicación para que pueda usar su propio pa. Tenga en cuenta que no leí el acuerdo de licencia; Probablemente debería comprobarlo usted mismo.

Puede utilizar ghostscript para convertir PDF en formatos de imagen.

El siguiente ejemplo convierte un solo PDF en una secuencia de archivos PNG:

private static void ExecuteGhostscript(string input, string tempDirectory) { // %d will be replaced by ghostscript with a number for each page string filename = Path.GetFileNameWithoutExtension(input) + "-%d.png"; string output = Path.Combine(tempDirectory, filename); Process ghostscript = new Process(); ghostscript.StartInfo.FileName = _pathToGhostscript; ghostscript.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; ghostscript.StartInfo.Arguments = string.Format( "-dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r300 -sOutputFile=/"{0}/" /"{1}/"", output, input); ghostscript.Start(); ghostscript.WaitForExit(); }

Si prefieres usar Adobe Reader, puedes ocultar su ventana:

process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;


Sé que la etiqueta tiene Windows Forms ; sin embargo, debido al título general, algunas personas pueden preguntarse si pueden usar ese espacio de nombres con una aplicación WPF , pero sí pueden.

Aquí está el código:

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); }

Ahora, este espacio de nombres debe usarse con una aplicación WPF . 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 utilizando el código anterior.

Tenga en cuenta que si su impresora no admite la impresión directa para archivos PDF, esto no funcionará.


Si le interesan las soluciones comerciales que hacen exactamente lo que necesita, hay varias opciones. Mi empresa proporciona una de esas opciones en un kit de herramientas para desarrolladores llamado Debenu Quick PDF Library .

Aquí hay un ejemplo de código (las funciones clave son PrintOptions y PrintDocument ):

/* Print a document */ // Load a local sample file from the input folder DPL.LoadFromFile("Test.pdf", ""); // Configure print options iPrintOptions = DPL.PrintOptions(0, 0, "Printing Sample") // Print the current document to the default // printing using the options as configured above. // You can also specify the specific printer. DPL.PrintDocument(DPL.GetDefaultPrinterName(), 1, 1, iPrintOptions);


Si una biblioteca comercial es una opción, puede probar con Amyuni PDF Creator. Red.

Imprimiendo directamente con la biblioteca:
Para abrir un archivo PDF y enviarlo a imprimir directamente, puede utilizar el método IacDocument.Print . El código en C # se verá así:

// Open PDF document from file<br> FileStream file1 = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read); IacDocument doc1 = new IacDocument (null); doc1.Open (file1, "" ); // print document to a specified printer with no prompt doc1.Print ("My Laser Printer", false);

Exportando a imágenes (luego imprimiendo si es necesario):
Opción 1: puede utilizar el método IacDocument.ExportToJPeg para convertir todas las páginas en un PDF a imágenes JPG que puede imprimir o mostrar usando Drawing.Image

Opción 2: puede dibujar cada página en un mapa de bits utilizando el método IacDocument.DrawCurrentPage con el método System.Drawing.Graphics.FromImage . El código en C # debería verse así:

FileStream myFile = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read); IacDocument doc = new IacDocument(null); doc.Open(myFile); doc.CurrentPage = 1; Image img = new Bitmap(100,100); Graphics gph = Graphics.FromImage(img); IntPtr hdc = gph.GetHDC(); doc.DrawCurrentPage(hdc, false); gph.ReleaseHdc( hdc );

Descargo de responsabilidad: trabajo para Amyuni Technologies


Process proc = new Process(); proc.StartInfo.FileName = @"C:/Program Files/Adobe/Acrobat 7.0/Reader/AcroRd32.exe"; proc.StartInfo.Arguments = @"/p /h C:/Documents and Settings/brendal/Desktop/Test.pdf"; proc.StartInfo.UseShellExecute = false; proc.StartInfo.CreateNoWindow = true; proc.Start(); for (int i = 0; i < 5; i++) { if (!proc.HasExited) { proc.Refresh(); Thread.Sleep(2000); } else break; } if (!proc.HasExited) { proc.CloseMainWindow(); }