1

这是我的情况。

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

谢谢你提供的所有帮助。

4

2 回答 2

2

对于 Internet Explorer,请使用:

<object id="pdfForm" type="application/pdf" data="yourPDF.pdf"></object>

对于 Firefox,使用:

<embed id="pdfForm" type="application/pdf" src="yourPDF.pdf"></embed>
于 2011-02-11T19:12:10.187 回答
1

您还可以通过此访问嵌入对象

var emb = document.getElementsByTagName("EMBED")[0];

但是您将从包含页面运行该代码,因此获取对 iframe 的引用,而不是仅在 document.xml 中调用它。

于 2011-04-26T19:29:04.080 回答