这是我的情况。
我有一个嵌入PDF格式的网页。我们使用基本对象标记(嵌入FF)来加载PDF文件,如下所示:
<object id="pdfForm" height="100%" width="100%" type="application/pdf" data="..url"></object>
在这个网页上有一个Html Save按钮,它会触发一些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而不是object标签嵌入PDF。现在,使用以下代码嵌入PDF:
<iframe id="pdfWrapper" src="..someUrl" width="100%" height="800px" frameborder="0"></iframe>
不幸的是,使用此代码,用于发布消息的javascript不再有效,我无法确定如何访问pdf对象,以便我可以访问postMessage api。
使用fiddler或chome javascript调试器,很显然在iframe中,浏览器会自动生成一个embed标签(不是对象标签),但这不允许我访问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,所以为了简化这一点,我在这个网址上发布了示例代码 - 工作和非工作场景:http://www.filedropper.com/pdfmessage
如果使用Windows,可以下载zip并将其解压缩到/ inetpub / wwwroot,然后将浏览器指向works.htm或fails.htm。
感谢您提供任何帮助。
答案 0 :(得分:2)
对于Internet Explorer,请使用:
<object id="pdfForm" type="application/pdf" data="yourPDF.pdf"></object>
对于Firefox,请使用:
<embed id="pdfForm" type="application/pdf" src="yourPDF.pdf"></embed>
答案 1 :(得分:1)
您还可以使用此
访问嵌入对象var emb = document.getElementsByTagName("EMBED")[0];
但您将从包含的页面运行该代码,因此请获取对iframe的引用,而不是仅在文档上调用它。