在iFrame中将postMessage转换为PDF

时间:2010-01-19 15:10:21

标签: javascript pdf acrobat

这是我的情况。

我有一个嵌入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。

感谢您提供任何帮助。

2 个答案:

答案 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的引用,而不是仅在文档上调用它。