postMessage в PDF в iFrame

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

У меня была веб-страница со встроенной формой 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 вместо тега объекта. Итак, теперь PDF-файл встраивается с помощью этого кода:

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

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

Используя fiddler или отладчик javascript chome, становится ясно, что в iframe браузер автоматически генерирует тег внедрения (а не тег объекта), но это не позволяет мне получить доступ к 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

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

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


person Linus    schedule 19.01.2010    source источник
comment
Можем ли мы получить пример кода для проверки наших ответов?   -  person Gausie    schedule 19.01.2010
comment
Gausie, я предоставил javascript для pdf. Дайте мне знать, если этого достаточно, или если вам нужно, чтобы я разместил где-нибудь PDF-файл, я тоже могу это сделать. Могу ли я опубликовать вложение в stackoverflow?   -  person Linus    schedule 19.01.2010
comment
Gausie, я предоставил загружаемый пример кода и PDF, который помогает. См. текст выше. Спасибо.   -  person Linus    schedule 19.01.2010


Ответы (2)


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

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

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

<embed id="pdfForm" type="application/pdf" src="yourPDF.pdf"></embed>
person Michael    schedule 11.02.2011
comment
Спасибо. Это работает. Не уверен, почему объект не полностью поддерживается в Firefox. - person Manoj Reddy; 01.04.2015

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

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

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

person Ryan    schedule 26.04.2011