сообщение в PDF в iFrame - PullRequest
       5

сообщение в PDF в iFrame

1 голос
/ 19 января 2010

Вот моя ситуация.

У меня была веб-страница со встроенной формой PDF. Мы использовали базовый тег объекта (встроенный в FF) для загрузки файла PDF следующим образом:

<object id="pdfForm" height="100%" width="100%" type="application/pdf" data="..url"></object>

На этой веб-странице была кнопка «Сохранить HTML», которая вызывала некоторый Javascript, который использовал API postMessage встроенного объекта для выполнения JavaScript, встроенного в PDF. По сути, этот код выглядел так:

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, поэтому нам нужно встраивать PDF-файл, используя iFrame вместо тега object. Так что теперь PDF вставляется с использованием этого кода:

<iframe id="pdfWrapper" src="..someUrl" width="100%" height="800px" frameborder="0"></iframe>

К сожалению, с этим кодом javascript для публикации сообщения больше не работает, и я не могу понять, как получить доступ к объекту pdf, чтобы получить доступ к API postMessage.

Используя fiddler или отладчик chome javascript, становится ясно, что в iframe браузер автоматически генерирует тег embed (не тег объекта), но это не позволяет мне получить доступ к API postMessage. Это код, который я пытаюсь, который не работает:

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);
    }

Есть какая-нибудь помощь в этом? Извините за длинный вопрос.

РЕДАКТИРОВАТЬ: меня попросили предоставить примеры в коде, чтобы люди могли проверить, работает ли обмен сообщениями. По сути, все, что вам нужно, это любой PDF-файл со встроенным JavaScript.

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 для создания PDF-файлов с использованием javascript, поэтому, чтобы упростить это, я разместил пример кода - как рабочего, так и нерабочего сценария - по этому адресу: http://www.filedropper.com/pdfmessage

Вы можете скачать zip-архив и распаковать его в / inetpub / wwwroot, если вы используете Windows, а затем укажите в браузере файл works.htm или fails.htm.

Спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Для Internet Explorer используйте:

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

Для Firefox используйте:

<embed id="pdfForm" type="application/pdf" src="yourPDF.pdf"></embed>
1 голос
/ 26 апреля 2011

вы также можете получить доступ к встраиваемому объекту с помощью этого

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

, но вы будете запускать этот код со страницы, содержащей его, поэтому получите ссылку на iframe вместо простого вызова его в документе.

...