有没有办法将PDF字节数据写入IFrame客户端

时间:2009-06-23 15:53:27

标签: javascript pdf client-side

奇怪的问题我知道,但是说有一个PDF字节数据包含在页面上的隐藏字段中,该字段上还有一个IFrame。

有没有办法使用JavaScript将pdf数据写入IFrame,以便IFrame加载到adobe插件中并显示数据?

我们想要这样做的原因是我们无论如何都需要隐藏字段中的PDF数据,因此如果用户单击一个按钮,我们可以通过JS调用Java applet和数据,以便将PDF字节数据写入专有系统。我们也想显示PDF。

所以:

  1. PDF字节数据(在...上生成) 服务器)隐藏在隐藏的领域。
  2. 来自隐藏字段的PDF字节数据 一些人写了一篇关于IFrame的客户 即将被发现的通孔最奇观-的-StackOverflow的 JS魔术因而显示出来。
  3. 当按钮单击名为clientside的Java applet时 传入存储的PDF字节数据 隐藏的领域
  4. 就像Southpark的内裤侏儒一样,我们有第1阶段和第3阶段而不是2阶段!

    感激地收到任何想法!

    更多信息:

    我们需要让客户端可用的字节数据通过JS调用传递给Java applet。我们目前通过隐藏字段执行此操作。没关系,它运作得很好。

    问题是只有在单击ajax模式dilaog上的okay按钮时才会调用applet('你想把这个文件发送到UglyProprietorySystem吗?')。

    众所周知,你不能在adobe插件显示器上放置任何东西。显然,如果整个页面都是PDF类型,那么任何JS都没有地方显示对话框,这样就无法工作了,如果使用IFrame,你仍然无法在插件显示的内容上放置任何东西(它是实际上是另一个应用程序的领空并且违反了这一点只是粗鲁无礼!)。

    我们通过以下方式解决了这个问题:

    1. 初步显示通用PDF文档的模糊图像,并在其上弹出模态对话框。
    2. 当用户响应对话框时,我们使用hiden字段中的pdf字节数据调用(或不调用)java应用程序
    3. 然后我们在清除隐藏字段后回发(哇!用服务器不赞赏发回带有PDF二进制数据的表格!)
    4. 在我们后面的代码的page_load中,在回发时,用PDF字节数据写入响应流,将内容类型设置为appplication / pdf,从而显示pdf。
    5. 可爱。这一切都有效,让我们得到了我们想要的东西。

      唯一的问题是我们要么:

      * generate the PDF data twice (once on initital page_load for the clientside call to our applet and then again on postback to display).
      

      * We store the PDF byte data in the session after the first response so as to be able to, after the postback, still have the pdf data to be able to display it.
      

      两者都不是很好,但我们选择了后者,但现在我们认为如果可以的话,我们想避免这样做。

      因此,生成PDF的想法,将其置于一个隐藏的领域,在页面上有一个按钮,通过applet调用将PDF保存到我们的专有系统,并写入已经在客户端上的数据的IFrame隐藏的字段因此显示它。

      呼!

      这就是为什么我们想在客户端上使用JS,将pdf二进制数据写入IFrame并将其内容类型设置为application / pdf,以便浏览器加载adobe插件并显示它。

6 个答案:

答案 0 :(得分:2)

没有任何界面可以让您在Web端安全沙箱中进行此类操作。您不只是从服务器下载PDF的原因是?...

答案 1 :(得分:1)

正如我在问题中所说,我们已经在服务器上生成了PDF数据。

我们需要让客户端可用的字节数据通过JS调用传递给Java applet。我们目前通过隐藏字段执行此操作。没关系,它运作得很好。

问题是只有在单击ajax模式dilaog上的okay按钮时才会调用applet('你想把这个文件发送到UglyProprietorySystem吗?')。

众所周知,你不能在adobe插件显示器上放置任何东西。显然,如果整个页面都是PDF类型,那么任何JS都没有地方显示对话框,所以 不起作用,如果你使用IFrame,你仍然无法放置任何东西插件显示(它实际上是另一个应用程序的空域并且违反了它只是粗鲁!)。

我们通过以下方式解决了这个问题:

  1. 初始显示模糊图像 一般的PDF文档和弹出的 最重要的模态对话框。
  2. 当用户回复时 我们调用(或不调用)java的对话框 app的pdf字节数据来自 hiden field
  3. 然后我们在清理后回复 隐藏的领域(哇!发回一个 PDF二进制数据的表单 受到服务器的赞赏!)
  4. 在后面的代码的page_load中 然后,我们在回发后写信给 响应流与他的PDF字节 数据,设置内容类型 appplication / pdf因此pdf是 显示。
  5. 可爱。这一切都有效,让我们亲切我们想要的。

    唯一的问题是我们要么:

    • 生成两次PDF数据(一次打开 客户端的initital page_load 打电话给我们的小程序,然后再打开 回发显示)。

    • 我们将PDF字节数据存储在 第一次回应后的会话 至于能够,在回发后, 仍然有pdf数据能够显示 它。

    两者都不是很好,但我们选择了后者,但现在我们认为如果可以的话,我们想避免这样做。

    因此,生成PDF的想法,将其置于一个隐藏的领域,在页面上有一个按钮,通过applet调用将PDF保存到我们的专有系统,并写入已经在客户端上的数据的IFrame隐藏的字段因此显示它。

    呼!

    这就是为什么我们想用在客户端上使用JS,将pdf二进制数据写入IFrame并将其内容类型设置为application / pdf,这样浏览器就会加载adobe插件 - 并显示它。

答案 2 :(得分:1)

我似乎无法找到我最近调查过的任何网站,但MOST浏览器支持的功能(包括IE8和早期IE版本中有限)可以在其中指定数据:urc在src中iframe的字段(通常还有其他标签)。基本上,uri与src ='data:application / pdf; Base64 ,;'

一致。

可能需要对格式进行一些捏造才能使其跨浏览器兼容,但它应该为您提供一个起点。

答案 3 :(得分:1)

结帐URL.createObjectURL()。您必须构建Blob,然后createObjectURL()会为您提供适合iframe src的内容。

以下是通过AJAX获取的pdf示例:https://github.com/courajs/pdf-poc

答案 4 :(得分:0)

为什么你不能在客户端上创建一个回调函数来定期通过帖子或get来检查最终文件是否存在?将浏览器指向“缩略图”图像,然后触发帖子/获取最终文件,吞下错误直到文件准备就绪。一旦文件可用,客户端就会下载它。

答案 5 :(得分:0)

使用“object”元素并将PDF数据放在“data”参数中。

不确定在JS中创建PDF,但我知道它可能,但在库中不容易获得。

http://support.microsoft.com/kb/201515。 MS KB文章显示了这个例子:

<OBJECT ID="myCtrl" WIDTH=50 HEIGHT=50
 CLASSID="CLSID:nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn"
 DATA="DATA:application/x-oleobject;BASE64,j43aWGqdGxCvwEIQECqNpy
           FDNBIIAAAA7QMAAO0DAACAfuHmAgAFADEAAAAQ">
</OBJECT>

在执行此操作之前,我会查看浏览器支持。现在IE8是一个强制更新,应该有更好的支持,但我不能从IE,FF或Safari等经验谈起。