打印PDF使用itextsharp创建

我的目标是在客户端计算机上打印RDLC报告而不进行预览。 我无法使用ReportViewer打印按钮,因为它需要安装ActiveX对象,并且没有权限。 所以,我正在使用ITextSharp从渲染的LocalReport返回的字节数组创建PDF,并添加一个JavaScript用于打印。

在调试期间,我可以看到PDF已生成并有2页,一切看起来都还可以。 我没有收到任何错误,该function退出确定,但它不打印。 我做错了什么,或者我错过了什么?

这是我的代码:

string jsPrint = "var pp = this.getPrintParams();pp.interactive= pp.constants.interactionLevel.silent;this.print(pp);"; byte[] bytes = report.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings); using (MemoryStream ms = new MemoryStream()) { Document doc = new Document(); PdfWriter writer = PdfWriter.GetInstance(doc, ms); doc.SetPageSize(PageSize.A4); doc.Open(); PdfContentByte cb = writer.DirectContent; PdfImportedPage page; PdfReader reader = new PdfReader(bytes); int pages = reader.NumberOfPages; for (int i = 1; i <= pages; i++) { doc.SetPageSize(PageSize.A4); doc.NewPage(); page = writer.GetImportedPage(reader, i); cb.AddTemplate(page, 0, 0); } PdfAction jAction = PdfAction.JavaScript(jsPrint, writer); writer.AddJavaScript(jAction); doc.Close(); } 

谢谢。

关于你关于PdfStamper的问题(在评论中)。 它应该像这样简单:

 string jsPrint = "var pp = this.getPrintParams();pp.interactive= pp.constants.interactionLevel.silent;this.print(pp);"; PdfReader reader = new PdfReader(bytes); MemoryStream stream = new MemoryStream(); PdfStamper stamper = new PdfStamper(pdfReader, stream); stamper.Writer.AddJavaScript(jsPrint); stamper.Close(); reader.Close(); 

关于您的原始问题:PDF文档的自动打印被认为是一种安全隐患:可以向最终用户发送PDF,而PDF将导致打印机喷出页面。 过去曾经可以使用(真正的)旧PDF查看器,但现代观众可以防止这种情况发生。

换句话说:你可能正在努力满足过去的要求。 今天的PDF查看器始终需要最终用户的操作来打印PDF文档。