PDF hostContainer обратный вызов
Следуя этому SO-решению, чтобы уведомить клиентов о событии щелчка в документе PDF, как можно уведомить клиента, когда PDF-файл отправляется клиентом, используя this.myPDF.submitForm("localhost/Handler.ashx? R =2) функция?
Файл PDF создается внутри пользовательского элемента управления, а затем отображается в HTML-объекте:
string container = ("<object data='/myfile.pdf' type='application/pdf'></object>");
Файл JS, прикрепленный к PDF, сделан следующим образом:
var webClient = new WebClient();
string htmlContent = webClient.DownloadString(fileurl + "pdf_script.js");
PdfAction action = PdfAction.JavaScript(htmlContnent, pdfstamper.Writer);
pdfstamper.Writer.SetOpenAction(action);
И содержание файла JS:
this.disclosed = true;
if (this.external && this.hostContainer) {
function onMessageFunc(stringArray) {
try {
this.myPDF.submitForm("http://localhost/Handler.ashx?EmpNo=12345" + "#FDF", false);
}
catch (e) {
}
}
function onErrorFunc(e) {
console.show();
console.println(e.toString());
}
try {
if (!this.hostContainer.messageHandler);
this.hostContainer.messageHandler = new Object();
this.hostContainer.messageHandler.myPDF = this;
this.hostContainer.messageHandler.onMessage = onMessageFunc;
this.hostContainer.messageHandler.onError = onErrorFunc;
this.hostContainer.messageHandler.onDisclose = function () { return true; };
}
catch (e) {
onErrorFunc(e);
}
}
Когда выполняется вызов submitForm, содержимое PDF (поля формы) успешно сохраняется, и в PDF отображается предупреждение, выполняя это:
message = "%FDF-1.2
1 0 obj
<<
/FDF
<<
/Status("Success!")
>>
>>
endobj
trailer
<</Root 1 0 R>>
%%EOF");
return message;
То, что я пытаюсь сделать, - это заставить PDF перезвонить клиенту после вызова отправки формы, отправленного с этого клиента, способ подтвердить клиенту, что форма была отправлена, не в виде предупреждения, а скорее, способ вызвать функцию в хосте (контейнер, iframe, объект... и т. д.).
1 ответ
Ответ FDF, который вы использовали, был мне неизвестен, поэтому я узнал кое-что новое из вашего вопроса. Я изучил Справочник AcroJS и спецификацию FDF в Справочнике PDF, и теперь у меня есть лучшее понимание того, что делает ваш код. Спасибо за это.
Я предполагаю, что вы уже знаете, как вызвать сообщение JavaScript в файле HTML, используя вызов JavaScript из PDF. Увидеть createMessageHandler()
в JavaScript Связь между HTML и PDF статьи.
Я интерпретирую ваш вопрос как: "Как вызвать этот метод после успешной отправки данных?"
Если есть решение этого вопроса, оно будет включать JavaScript. Я вижу, что можно добавить JavaScript в файл FDF, но я не уверен, что этот JavaScript может "общаться" с HTML. Я не уверен, можно ли вызвать функцию JavaScript в исходном PDF-файле из ответа FDF. Если это возможно, вы должны добавить в файл PDF запись JavaScript, аналогичную записи /Status.
Значение этой записи - словарь, что-то вроде:
<<
/Before (app.alert\("before!"\))
/After (app.alert\("after"\))
/Doc [/MyDocScript1, (myFunc1\(\)),
/MyDocScript2, (myFunc2\(\))
>>
В вашем случае я бы удалил ключи /Before и /Doc. Я не думаю, что они вам нужны, я бы сократил словарь до:
<<
/After (talkToHtml\(\))
>>
куда talkToHtml()
метод уже присутствует в PDF:
function talkToHtml() {
var names = new Array();
names[0] = "Success!";
try{
this.hostContainer.postMessage(names);
}
catch(e){
app.alert(e.message);
}
}
Я не знаю, сработает ли это. Я никогда не пробовал это сам. Я основываю свой ответ на спецификациях.
Я не знаю, действительно ли вам нужно использовать FDF. Вы пытались добавить JavaScript в ваш метод submitForm()? Что-то вроде:
this.myPDF.submitForm({
cURL: "http://localhost/Handler.ashx?EmpNo=12345",
cSubmitAs: "FDF",
oJavaScript: {
Before: 'app.alert("before!")',
After: 'app.alert("after")',
Doc: ["MyDocScript1", "myFunc1()",
"MyDocScript2", "myFunc2()" ]
}
});
Это будет работать только если вы отправите как FDF. Я не думаю, что есть решение, если вы отправите строку запроса HTML.
Если вам интересно, что MyDocScript1
а также MyDocScript2
являются:
Документ определяет массив, определяющий дополнительные сценарии JavaScript, которые будут добавлены к тем, которые определены в записи JavaScript словаря имен документа. Массив содержит четное количество элементов, организованных в пары. Первый элемент каждой пары - это имя, а второй - текстовая строка или текстовый поток, определяющий сценарий, соответствующий этому имени. Каждый из определенных сценариев добавляется к тем, которые уже определены в словаре имен, и затем выполняется перед выполнением сценария, определенного в записи До. (ISO-32000-1 Таблица 245)
Я не уверен, что все это сработает на практике. Пожалуйста, дайте мне знать в любом случае.