2012-12-12 17 views
7

Po tym zgłoszeniu SO here powiadamia klientów o zdarzeniu kliknięcia w dokumencie PDF, w jaki sposób można powiadomić klienta, gdy plik PDF zostanie przesłany przez klienta za pomocą this.myPDF.submitForm ("localhost/Handler ? .ashx r = 2 funkcja)Klient w PDF Kontohentailer callback

plik PDF jest tworzony wewnątrz formantu użytkownika będzie renderowane do obiektu HTML:

string container = ("<object data='/myfile.pdf' type='application/pdf'></object>"); 

plik JS dołączony do pliku PDF odbywa się to tak:

var webClient = new WebClient(); 
string htmlContent = webClient.DownloadString(fileurl + "pdf_script.js"); 
PdfAction action = PdfAction.JavaScript(htmlContnent, pdfstamper.Writer); 
pdfstamper.Writer.SetOpenAction(action); 

a zawartość pliku 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); 
    } 
} 

Kiedy rozmowa submitForm jest zawartość PDF (pola formularza) zostaną zapisane pomyślnie i alarm jest wyświetlany w formacie PDF, wykonując to:

message = "%FDF-1.2 
        1 0 obj 
        << 
        /FDF 
        << 
         /Status("Success!") 
        >> 
        >> 
        endobj 
        trailer 
        <</Root 1 0 R>> 
      %%EOF"); 
return message; 

Co próbuję zrobić, to pobrać plik PDF do oddzwaniania klienta po wysłaniu formularza wysłanego przez tego klienta, sposób potwierdzenia, że ​​formularz został przesłany, a nie w formie alertu, ale raczej sposób wyzwalania funkcji na hoście (kontener, element iframe, obiekt ... itd.).

+1

Brak niektórych informacji dotyczących tego kroku: "Po wywołaniu submitForm plik PDF zostanie pomyślnie utworzony, a w pliku PDF zostanie wyświetlony alert:". Zakładam, że plik PDF jest tworzony na serwerze i wyświetlany na kliencie, ale może się mylę. Może serwer zwraca plik FDF. Możesz wyjaśnić? –

+1

Ooops, mój błąd, wywołanie submitForm powoduje zapisanie zawartości pliku PDF, który nie jest tworzony, jest już renderowany w formancie użytkownika i przeprojektowany za , poprawiłem pytanie i dodałem więcej szczegółów o tym, jak plik PDF jest renderowany – Maya

+0

Nie rozumiem powyżej, gdzie jest napisane "if (! this.hostContainer.messageHandler);" Dlaczego linia ta ma na końcu średnik? Czy to błąd? jeśli nie, jaki jest cel tej linii? Wielkie dzięki! –

Odpowiedz

5

Odpowiedź FDF, której użyłeś była mi nieznana, więc nauczyłem się czegoś nowego na podstawie twojego pytania. Przestudiowałem specyfikację AcroJS Reference i FDF w PDF Reference, a teraz lepiej rozumiem, co robi Twój kod. Dziękuję za to.

Zakładam, że już wiesz, jak wywołać komunikat JavaScript w pliku HTML za pomocą wywołania JavaScript z pliku PDF. Zobacz artykuł createMessageHandler() w artykule JavaScript Communication between HTML and PDF.

Interpretuję twoje pytanie jako: "Jak wywołać tę metodę po pomyślnym przesłaniu danych?"

Jeśli istnieje rozwiązanie tego pytania, będzie ono dotyczyło JavaScript. Widzę, że można dodać JavaScript do pliku FDF, ale nie jestem pewien, czy ten JavaScript może "porozmawiać" z HTML. Nie jestem pewien, czy możesz wywołać funkcję JavaScript w początkowym pliku PDF z odpowiedzi FDF. Jeśli jest to możliwe, dodaj pozycję JavaScript do pliku PDF podobną do pozycji/Status.

Wartość tego wpisu jest słownikiem, coś jak:

<< 
/Before (app.alert\("before!"\)) 
/After (app.alert\("after"\)) 
/Doc [/MyDocScript1, (myFunc1\(\)), 
     /MyDocScript2, (myFunc2\(\)) 
>> 

w Twoim przypadku, chciałbym usunąć klucze/Przed i/doc. Nie sądzę, że są one potrzebne, by zmniejszyć słownika:

<< 
/After (talkToHtml\(\)) 
>> 

Gdzie talkToHtml() to metoda już obecne w PDF:

function talkToHtml() { 
    var names = new Array(); 
    names[0] = "Success!"; 
    try{ 
     this.hostContainer.postMessage(names); 
    } 
    catch(e){ 
     app.alert(e.message); 
    } 
} 

Nie wiem, czy to będzie praca. Nigdy tego nie próbowałem. Opieram swoją odpowiedź na specyfikacji.

Nie wiem, czy naprawdę potrzebujesz używać FDF. Czy próbowałeś dodać JavaScript do swojej metody submitForm()?Coś takiego:

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()" ] 
    } 
}); 

To będzie działać tylko, jeśli prześlesz jako FDF. Nie sądzę, że istnieje rozwiązanie, jeśli przesyłasz ciąg kwerendy HTML.

W przypadku, gdy zastanawiasz się, co MyDocScript1 i MyDocScript2 są:

Doc definiuje tablicę określającą dodatkowe skrypty JavaScript jest dodawane do tych określonych we wpisie JavaScript w imię słowniku dokumentu. Tablica zawiera parzystą liczbę elementów, uporządkowanych parami. Pierwszym elementem każdej pary jest nazwa, a drugim jest ciąg tekstowy lub strumień tekstowy definiujący skrypt odpowiadający tej nazwie. Każdy ze zdefiniowanych skryptów jest dodawany do już zdefiniowanych zdefiniowanych w słowniku nazw, a następnie wykonywany przed wykonaniem skryptu zdefiniowanego w zadaniu Przed. (ISO-32000-1 Tabela 245)

Nie jestem pewien, czy wszystko to zadziała w praktyce. Proszę, daj mi znać tak czy inaczej.

+0

W końcu to działa praktycznie, klient PDF może mówić w obie strony, na wypadek, gdybyś chciał zaktualizować odpowiedź, musiałem zmienić wiersz/Później na:/JavaScript <>. Dzięki, dostałeś nagrodę! – Maya