1

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

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

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

所以:

  1. PDF 字节数据(在服务器上生成)夹在隐藏字段中。
  2. 来自隐藏字段的 PDF 字节数据通过 StackOverflow JS 魔术的一些即将被发现的方式写入客户端到 IFrame 并因此显示。
  3. 当单击按钮时称为客户端的 Java 小程序传递存储在隐藏字段中的 PDF 字节数据

就像南方公园的内裤侏儒一样,我们有第 1 阶段和第 3 阶段,但没有第 2 阶段!

任何想法都感激不尽!

更多信息:

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

问题在于,只有在单击 ajax 模式对话框上的 OK 按钮时才会调用 applet(“你想将此文档发送到 UglyProprietorySystem 吗?”)。

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

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

  1. 最初显示通用 PDF 文档的模糊图像并在其上弹出模式对话框。
  2. 当用户响应我们调用(或不调用)java 应用程序的对话框时,使用隐藏字段中的 pdf 字节数据
  3. 然后我们在清除隐藏字段后发回(哇!发回带有 PDF 二进制数据的表单不受服务器的欢迎!)
  4. 然后,在后面代码的 page_load 中,我们在回发时使用 PDF 字节数据写入响应流,将 contentype 设置为 appplication/pdf,从而显示 pdf。

迷人的。这一切都有效,让我们得到了我们想要的东西。

唯一的问题是我们要么需要:

* 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 的想法,将其放入隐藏字段,在页面上有一个按钮以通过小程序调用将 PDF 保存到我们的专有系统,并在隐藏字段中将客户端上已有的数据写入 IFrame从而显示它。

呸!

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

4

6 回答 6

2

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

于 2009-06-23T15:58:09.693 回答
1

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

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

于 2009-06-23T16:46:37.540 回答
1

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

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

问题在于,只有在单击 ajax 模式对话框上的 OK 按钮时才会调用 applet(“你想将此文档发送到 UglyProprietorySystem 吗?”)。

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

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

  1. 最初显示通用 PDF 文档的模糊图像并在其上弹出模式对话框。
  2. 当用户响应我们调用(或不调用)java 应用程序的对话框时,使用隐藏字段中的 pdf 字节数据
  3. 然后我们在清除隐藏字段后发回(哇!发回带有 PDF 二进制数据的表单不受 服务器的欢迎!)
  4. 然后,在后面代码的 page_load 中,我们在回发时使用 PDF 字节数据写入响应流,将 contentype 设置为 appplication/pdf,从而显示 pdf。

迷人的。这一切都有效,让我们得到了我们想要的东西

唯一的问题是我们要么需要:

  • 生成 PDF 数据两次(一次在初始 page_load 用于客户端调用我们的小程序,然后再次在回发时显示)。

或者

  • 我们在第一次响应后将 PDF 字节数据存储在 session 中,以便在回发之后,仍然有 pdf 数据能够显示它。

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

因此,生成 PDF 的想法,将其放入隐藏字段,在页面上有一个按钮以通过小程序调用将 PDF 保存到我们的专有系统,并在隐藏字段中将客户端上已有的数据写入 IFrame从而显示它。

呸!

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

于 2009-06-23T16:39:47.117 回答
1

退房URL.createObjectURL()。您必须构建一个Blob,但随后createObjectURL()会给您一些适合 iframe 的src.

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

于 2017-02-16T17:41:15.270 回答
0

使用“对象”元素并将您的 PDF 数据放入“数据”参数中。

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

请参阅http://support.microsoft.com/kb/201515。MS 知识库文章显示了此示例:

<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 等方面的经验谈起。

于 2009-07-22T21:21:51.120 回答
0

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

于 2009-06-23T16:47:14.810 回答