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)

Я не уверен, что все это сработает на практике. Пожалуйста, дайте мне знать в любом случае.

Другие вопросы по тегам