打印使用itextsharp创建的PDF

本文关键字:PDF 创建 itextsharp 打印 | 更新日期: 2023-09-27 18:29:14

我的目标是在客户端机器上打印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();
}

谢谢。

打印使用itextsharp创建的PDF

关于您关于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文档。