Genera un PDF che stampa automaticamente

Ho un’applicazione Web ASP.NET che genera un PDF. Sto usando iTextSharp. Quello che succede è che si fa clic su un pulsante e si scarica. Il mio datore di lavoro vuole essere in grado di fare clic sul pulsante e aprirlo con la finestra di dialogo di stampa.

Metodo 1: utilizzo di javascript incorporato nei file PDF È ansible provare a creare un object iText PDFAction con una chiamata javascript this.print(false) (è ansible utilizzare la new PdfAction(PdfAction.PRINTDIALOG) per questo) e associarlo all’evento OpenAction del tuo file pdf.

Il codice in iText Java dovrebbe assomigliare a questo:

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

Non dovrebbe essere troppo diverso in C #.

Come nota a margine, ciò è ansible anche con Amyuni PDF Creator .Net impostando l’attributo “AutoPrint” su TRUE nella class del documento (si applica la normale dichiarazione di non responsabilità ).

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

Questo approccio richiede che il file PDF venga aperto in un lettore che si occuperà della stampa, e ha lo svantaggio che se il file viene salvato localmente, ogni volta che il file viene aperto in seguito verrà visualizzata la finestra di dialogo di stampa.

Metodo 2: utilizzo di javascript dal browser per comunicare con il lettore che mostra il file.
Ho trovato questo altro approccio in questa domanda SO che potrebbe valere la pena provare:

       

L’idea è di usare javascript nel browser per istruire il lettore PDF a stampare il file. Questo approccio funzionerà su file PDF incorporati in una pagina HTML.

Un’altra soluzione su questo sito … Io uso questa soluzione e lavoro alla grande

Ho un stream PDF da report Crystal e aggiungo l’openaction con pdfsharp

link: 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; } 

Come menzionato da yms, è ansible generare un PDF con JavaScript o un’azione PDF “nominata” che mostra la finestra di dialogo Stampa quando il documento viene aperto. Lo abbiamo dimostrato utilizzando il nostro prodotto Gnostice PDFOne .NET nell’articolo Creare un PDF di Auto-Stampa . Potresti fare lo stesso in iText, immagino. Se Adobe Reader è registrato come plug-in PDF nel browser, entrambe le opzioni funzioneranno.

L’opzione Javascript HTML sembra funzionare solo in IE.

DISCLAIMER: lavoro per Gnostice.

Che ne dici della buona vecchia moda OLE? È ancora supportato dalla maggior parte degli strati di documenti di cui sono a conoscenza … IN C # Normalmente faccio qualcosa del genere .. dove PDF, RTF, DOC, XLS … non importa … tutti stampano ..

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