如何使用asp.net c#直接打印使用iTextSharp动态创建的PDF?

时间:2015-04-30 15:28:06

标签: c# asp.net pdf printing itextsharp

我环顾四周,似乎无法找到适合我的方式。我正在创建一个网站,我有两个按钮,一个下载按钮(工作正常)和一个打印按钮,应打印PDF(甚至只需打开打印对话框打开adobe中的PDF)。

我的问题和许多其他问题的最大区别在于我没有尝试创建新文档。我的PDF是使用我已经创建的模板PDF生成的。

我只需要一种方法来打印文档。我无法将其保存在服务器上,因为我希望客户端能够打印它。我已经尝试了一个MemoryStream,但它没有工作(授予我可能没有正确编写,代码如下)。标题是从不同的页面抓取的。

using (var ms = new MemoryStream())
{
    Response.ContentType = "application/octet-stream";
    Response.AppendHeader("Content-Disposition", header);   /

    Response.Buffer = true;
    Response.Clear();
    var bytes = ms.ToArray();
    PdfReader r = new PdfReader(template);         
    using (PdfStamper ps = new PdfStamper(r, Response.OutputStream))    
    {
        AcroFields af = ps.AcroFields;
        ...
        ps.FormFlattening = true;
    }
    Response.OutputStream.Write(bytes, 0, bytes.Length);
    Response.OutputStream.Flush();

同样,我希望能够让客户打印出点击“打印”按钮后生成的PDF。

1 个答案:

答案 0 :(得分:9)

在走这条路之前,我只想确保妥善解释一些事情。我不知道你的专业水平所以如果我说一些明显的话,请不要被冒犯。

首先,你说你有两个按钮,"下载"和"打印"。我们知道您打算做什么,但重要的是要知道并理解这两个选项都是" download"。你的"下载"按钮确实是"下载和(可能)提示保存"和你的"打印"按钮实际上是#34;下载然后如果此人在其浏览器中配置了PDF渲染器(大多数现代浏览器都有),则渲染PDF,否则提示保存"。这对你来说可能非常明显,但我只想确保它清楚。我个人没有绑定到我的默认浏览器的PDF渲染器,所以每次都会为我下载所有PDF。

其次,服务器只能发送一个"事情"回到客户端以响应请求。那"事情"可以有与之关联的元数据(标题),但很少有相关的标准元键。一个关键(内容处理)是这个响应是否应该相对于发起请求被处理,因为"内联"或者"附件"。有些浏览器将后者视为"下载和(可能)提示保存"但有些人仍会推出相关的应用程序。还有另一个关键(mime类型application/octet-stream),有些人用来进一步欺骗浏览器,基本上说'严重老兄,我发送的这个东西太奇怪了,它会是你不可能弄清楚它,所以只需将它保存到磁盘"。

这一切都非常重要,因为没有"请打印这个"您可以从服务器发送的任何标准规范(或我曾经见过的任何规范)的东西。此外,服务器甚至不能在新的选项卡或浏览器窗口中打开它"。打印和窗口/标签控件都是客户端功能,因此您需要从该角度进行攻击。

现在谈谈一些选择。这些选项都假设您的客户拥有内置并启用了PDF渲染器的现代浏览器。

您可以使用的一个选项是具有wrap your PDF in an iframe JavaScript that calls window.print() upon loadingusing PDFObject。谷歌曾经(也许仍然如此)为他们的日历。您需要使用各种客户端呈现设备对其进行测试,以确保其按预期工作。

另一个选择是尝试add JavaScript to your PDF嵌入PDF,然后使用上面提到的相同JavaScript。

最后一个选项是略微更改PDF生成代码,{{3}} 尝试以在加载时打印PDF。 PDF渲染器中的JavaScript支持不是通用的,因此您需要检查这是否适用于您的客户端。此外,此设置是"烘焙"在你制作的PDF中,所以如果有人将它保存到磁盘上,每次打开它都会尝试打印,这非常烦人。