这是我的情况。
我有一个嵌入 PDF 表单的网页。我们使用一个基本的对象标签(嵌入在 FF 中)来加载 PDF 文件,如下所示:
<object id="pdfForm" height="100%" width="100%" type="application/pdf" data="..url"></object>
在这个网页上有一个 Html Save 按钮,它会触发一些 Javascript,这些 Javascript 使用嵌入对象的 postMessage API 来执行嵌入在 PDF 中的 javascript。基本上,该代码如下所示:
function save() {
sendMessage(["submitForm"]);
}
function sendMessage(aMessage) {
pdfObject = document.getElementById("pdfForm");
if (typeof(pdfObject) == "undefined")
return;
if (typeof (pdfObject.postMessage) == "undefined")
return;
pdfObject.postMessage(aMessage);
}
这一切都很顺利。
除了我们遇到了 Firefox 的问题,因此我们需要使用 iFrame 嵌入 PDF,而不是使用对象标签。所以现在,使用以下代码嵌入 PDF:
<iframe id="pdfWrapper" src="..someUrl" width="100%" height="800px" frameborder="0"></iframe>
不幸的是,使用此代码,用于发布消息的 javascript 不再有效,我无法真正弄清楚如何访问 pdf 对象,以便我可以访问 postMessage api。
使用 fiddler 或 chome javascript 调试器,很明显,在 iframe 中,浏览器会自动生成一个嵌入标签(不是对象标签),但这并不能让我访问 postMessage API。这是我正在尝试但不起作用的代码:
function sendMessage(aMessage) {
var frame = document.getElementById("pdfWrapper");
var doc = null;
if (frame.contentDocument)
doc = frame.contentDocument;
else
if (frame.contentWindow)
doc = frame.contentWindow.document;
else
if (frame.document)
doc = frame.document;
if (doc==null || typeof(doc) == "undefined")
return;
var pdfObject = doc.embeds[0];
if (pdfObject==null || typeof (pdfObject.postMessage) == "undefined")
return;
pdfObject.postMessage(aMessage);
}
对此有什么帮助吗?对不起,很长的问题。
编辑:我被要求提供代码示例,以便人们可以测试消息传递是否有效。本质上,您所需要的只是任何嵌入了此 javascript 的 PDF。
function myOnMessage(aMessage) {
app.alert("Hello World!");
}
function myOnDisclose(cURL, cDocumentURL) {
return true;
}
function myOnError(error, aMessage) {
app.alert(error);
}
var msgHandlerObject = new Object();
msgHandlerObject.onMessage = myOnMessage;
msgHandlerObject.onError = myOnError;
msgHandlerObject.onDisclose = myOnDisclose;
msgHandlerObject.myDoc = this;
this.hostContainer.messageHandler = msgHandlerObject;
我意识到您需要 Acrobat pro 来使用 javascript 创建 PDF,因此为了简化此操作,我在此 url 上发布了示例代码——包括工作场景和非工作场景——http: //www.filedropper.com/pdfmessage
如果您使用 Windows,您可以下载 zip 并将其解压缩到 /inetpub/wwwroot,然后将浏览器指向works.htm 或fails.htm。
谢谢你提供的所有帮助。