Вот моя ситуация.
У меня была веб-страница со встроенной формой 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.
Спасибо за любую помощь, которую вы можете оказать.