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