我的目标是在客户端计算机上打印RDLC报告而不进行预览。我无法使用ReportViewer打印按钮,因为它需要安装ActiveX对象,并且没有权限。所以,我使用ITextSharp从渲染的LocalReport返回的字节数组创建PDF,并添加一个JavaScript进行打印。
在调试期间,我可以看到PDF已生成并有2页,一切看起来都还可以。我没有收到任何错误,功能退出确定,但它不会打印。我做错了什么,或者我错过了什么?
这是我的代码:
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();
}
感谢。
答案 0 :(得分:0)
关于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文档。