Javascript 打印使用itextsharp创建的PDF

Javascript 打印使用itextsharp创建的PDF,javascript,c#,asp.net,itextsharp,rdlc,Javascript,C#,Asp.net,Itextsharp,Rdlc,我的目标是在客户端机器上打印RDLC报告而不进行预览。我不能使用ReportViewer打印按钮,因为它需要安装ActiveX对象,并且没有相应的权限。因此,我使用ITextSharp从呈现的LocalReport返回的字节数组创建一个PDF,并添加一个用于打印的JavaScript 在调试期间,我可以看到PDF已经生成,有2个页面,并且看起来一切正常。我没有收到任何错误,函数退出正常,但不打印。我做错了什么,或者我错过了什么 这是我的代码: string jsPrint = "var pp =

我的目标是在客户端机器上打印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();
}
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-streamid、out-warnings);
使用(MemoryStream ms=new MemoryStream())
{
单据单据=新单据();
PdfWriter writer=PdfWriter.GetInstance(doc,ms);
文件设置页面大小(页面大小A4);
doc.Open();
PdfContentByte cb=writer.DirectContent;
PDF导入页面;
PdfReader reader=新PdfReader(字节);
int pages=reader.NumberOfPages;

对于(int i=1;i,关于您关于
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文档。

您正在降级PDF,因为您使用了
PdfWriter
而不是
PdfStamper
,只是为了添加JavaScript。这并不能解释为什么您的PDF不工作,但确实如此事实上,您的代码不是很优雅(它抛弃了所有的交互性,引入了不必要的XObject,…)@BrunoLowagie,我看到的所有示例都使用了pdfwriter。我是itextsharp的新手,从未听说过PDFStamper。我会看看它。谢谢。我想我必须找到另一种方法在不预览的情况下打印RDLC。谢谢你的帮助和时间。