通过使用$ .get调用HTTPHandler流式传输PDF到object元素

时间:2010-05-17 09:01:24

标签: jquery pdf httphandler

我想要做的是通过jQuery的$ .get方法调用HTTPHandler,它将流回PDF并使用对象元素在网页中显示它。我之前设置IFrame的src属性的方法是处理程序调用的结果,但我希望跨浏览器完成通知,所以已经转移到使用$ .get()。示例代码:

    function buttonClick() {

        $.get("/PDFHandler.ashx", {},

            function(data, textStatus, XMLHttpRequest) {
                var pdfObjectString = "<object data='' type='application/pdf' width='600' height='600'></object>";
                var pdfObject = $(pdfObjectString);
                pdfObject.attr("data", data);
                $("#container").append(pdfObject);
            });

如您所见,我试图将'data'变量粘贴到object元素中。这不起作用(没有错误,PDF只是不显示),可能是因为返回的数据是二进制的,但是attr()方法需要一个字符串(我认为)。

我的问题是:如何通过$ .get调用HTTPHandler并以某种方式将回调中的数据分配给对象的data属性?

2 个答案:

答案 0 :(得分:0)

基于这个问题:How to open a file using JavaScript?我能够找到解决方案。基本上,您在成功回调函数中再次调用处理程序。我无法使用<object>标记(仍使用IFrame),但它足以满足我的需求。

为此,HTTP处理程序必须缓存结果,否则只会再次调用。

答案 1 :(得分:0)

我已经挣扎了几个小时才有这样的工作,这是我非常简单的解决方案,完美无缺:

  1. 在浏览器方面,我有一个包含在DIV标签中的iFrame,但可以在任何你想要的地方。您可以根据需要更改iFrame属性以隐藏/显示它。
  2. <div id = "divpayframe">
    <iframe name="payframe" id="payframe" width="600" height="800" frameborder="0"></iframe>
    </div>

    1. 我还有一个使用普通提交到服务器的表单,但是将目标指定为iFrame。
    2. <form id="frmpayslip" method="post" action="/payslip" target="payframe">

      1. 服务器返回pdf流并将响应内容类型设置为application / pdf。见下面的代码(用Delphi编写)

        无功 S:TMemoryStream;

        //某些代码在服务器端生成pdf文件并将其转换为pdf文件流 //将流分配给变量S并设置Response以返回流

        Response.ContentType:='application / pdf'; Response.SendStream(S);

      2. 请注意,除非您希望将其作为附件发送,否则不需要自定义标头,在这种情况下,您可以发送“内容处置”,“附件”; filename =“payslip.pdf”'以获得相同的结果。