Genera un PDF que imprime automáticamente

Tengo una aplicación web ASP.NET que genera un PDF. Estoy usando iTextSharp. Lo que sucede es que haces clic en un botón y se descarga. Mi empleador quiere poder hacer clic en el botón y abrirlo con el cuadro de diálogo Imprimir.

Método 1: Usar JavaScript incorporado dentro de sus archivos PDF Puede intentar crear un objeto iText PDFAction con una llamada javascript this.print(false) (puede usar la new PdfAction(PdfAction.PRINTDIALOG) para esto) y asociarlo con el evento OpenAction de su archivo pdf.

El código en iText Java debería verse así:

 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("file.pdf")); ... PdfAction action = new PdfAction(PdfAction.PRINTDIALOG); writer.setOpenAction(action); ... 

No debería ser muy diferente en C #.

Como nota al margen, esto también es posible con Amyuni PDF Creator .Net al establecer el atributo “AutoPrint” en TRUE en la clase de documento (se aplica el descargo de responsabilidad habitual ).

 acPDFCreatorLib.Initialize(); acPDFCreatorLib.SetLicenseKey("Amyuni Tech.", "07EFCDA00...BC4FB9CFD"); Amyuni.PDFCreator.IacDocument document = pdfCreator1.Document; // Open a PDF document from file System.IO.FileStream file1 = new System.IO.FileStream("test_input.pdf", FileMode.Open, FileAccess.Read, FileShare.Read); IacDocument document = new IacDocument(null); if (document.Open(file1, "")) { //Set AutoPrint document.Attribute("AutoPrint").Value = true; //Save the document System.IO.FileStream file2 = new System.IO.FileStream("test_output.pdf", System.IO.FileMode.Create, System.IO.FileAccess.Write); document.Save(file2, Amyuni.PDFCreator.IacFileSaveOption.acFileSaveView); } // Disposing the document before closing the stream clears out any data structures used by the Document object document.Dispose(); file1.Close(); // terminate library to free resources acPDFCreatorLib.Terminate(); 

Este enfoque requiere que el archivo PDF se abra en un lector que se encargará de la impresión, y tiene el inconveniente de que si el archivo se guarda localmente, cada vez que se abra el archivo aparecerá el cuadro de diálogo de impresión.

Método 2: Usar javascript desde el navegador para comunicarse con el lector que muestra el archivo.
Encontré este otro enfoque en esta pregunta SO que podría valer la pena intentar:

       

La idea es usar javascript en el navegador para indicar al lector de PDF que imprima el archivo. Este enfoque funcionará en archivos PDF incrustados en una página HTML.

Otra solución en este sitio … Utilizo esta solución y funciono muy bien

Tengo un informe PDF Stream de Crystal, y agrego la apertura con pdfsharp

enlace: http://www.vo1dmain.info/pdfsharp-howto-inject-javascript-into-pdf-autoprinting-functionality#comments

 public static MemoryStream AddAutoPrint(Stream pdfStream, bool ShowPrintDialog = true, int NumCopies = 1) { PdfSharp.Pdf.PdfDocument doc = PdfSharp.Pdf.IO.PdfReader.Open(pdfStream, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import); PdfSharp.Pdf.PdfDocument outputDocument = new PdfSharp.Pdf.PdfDocument(); for (int idx = 0; idx < doc.PageCount; idx++) { PdfSharp.Pdf.PdfPage p = doc.Pages[idx]; outputDocument.AddPage(p); } outputDocument.Info.Author = "author name"; string JSScript = string.Empty; JSScript += "var pp = this.getPrintParams(); "; if(NumCopies > 0) { JSScript += "pp.NumCopies = " + NumCopies.ToString() + "; "; } if(!ShowPrintDialog) { JSScript += "pp.interactive = pp.constants.interactionLevel.automatic; "; } JSScript += "this.print({printParams: pp}); "; PdfSharp.Pdf.PdfDictionary dictJS = new PdfSharp.Pdf.PdfDictionary(); dictJS.Elements["/S"] = new PdfSharp.Pdf.PdfName("/JavaScript"); //dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, "print(true);"); //dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, "this.print({bUI: false, bSilent: true, bShrinkToFit: true});"); //dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, "var pp = this.getPrintParams(); pp.NumCopies = 2; pp.interactive = pp.constants.interactionLevel.automatic; this.print({printParams: pp});"); dictJS.Elements["/JS"] = new PdfSharp.Pdf.PdfStringObject(outputDocument, JSScript); outputDocument.Internals.AddObject(dictJS); PdfSharp.Pdf.PdfDictionary dict = new PdfSharp.Pdf.PdfDictionary(); PdfSharp.Pdf.PdfArray a = new PdfSharp.Pdf.PdfArray(); dict.Elements["/Names"] = a; a.Elements.Add(new PdfSharp.Pdf.PdfString("EmbeddedJS")); a.Elements.Add(PdfSharp.Pdf.Advanced.PdfInternals.GetReference(dictJS)); outputDocument.Internals.AddObject(dict); PdfSharp.Pdf.PdfDictionary group = new PdfSharp.Pdf.PdfDictionary(); group.Elements["/JavaScript"] = PdfSharp.Pdf.Advanced.PdfInternals.GetReference(dict); outputDocument.Internals.Catalog.Elements["/Names"] = group; MemoryStream ms = new MemoryStream(); outputDocument.Save(ms, false); return ms; } 

Como se mencionó en yms, puede generar un PDF que tenga JavaScript o una acción PDF “Nombrada” que muestre el cuadro de diálogo Imprimir cuando se abra el documento. Lo hemos demostrado utilizando nuestro producto Gnostice PDFOne .NET en el artículo Crear un PDF de autoimpresión. Podrías hacer lo mismo en iText, supongo. Si Adobe Reader está registrado como complemento de PDF en el navegador, ambas opciones funcionarán.

La opción HTML Javascript parece funcionar solo en IE.

DESCARGO DE RESPONSABILIDAD: trabajo para Gnostice.

¿Qué tal una buena OLE a la vieja usanza? Todavía es compatible con la mayoría de las capas de documentos que conozco … EN C # Normalmente hago algo como esto … donde PDF, RTF, DOC, XLS … no importa … todos imprimen …

 public void HandlePresentation(string fullFilePath, bool viewOnScreen, bool autoPrint) { ProcessStartInfo info = new ProcessStartInfo(fullFilePath); if (autoPrint) { info.Verb = "Print"; info.WindowStyle = ProcessWindowStyle.Hidden; // not normally required Process.Start(info); info.Verb = string.Empty; } if (viewOnScreen) { info.WindowStyle = ProcessWindowStyle.Normal; Process.Start(info); } }