2012-12-12 3 views
7

Nach dieser SO-Lösung here, um Clients über ein Klickereignis in einem PDF-Dokument zu informieren, wie ist es möglich, den Client zu benachrichtigen, wenn die PDF-Datei vom Client mit this.myPDF.submitForm ("localhost/Handler ? .ashx r = 2) FunktionPDF-HostContainer-Rückruf

die PDF-Datei in einem Benutzersteuer dann in ein HTML-Objekt gerendert erstellt wird:

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

die in der PDF-Datei beigefügt JS wie dies geschehen ist:

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

Und der Inhalt der js-Datei:

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); 
    } 
} 

Wenn der submitForm Aufruf der PDF-Inhalte (Formularfelder) gemacht wird erfolgreich gerettet werden und eine Warnung im PDF-Format ist, indem Sie diese angezeigt:

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

Was ich versuche zu tun, ist die PDF zurückrufen den Client nach dem Formular senden Anruf von diesem Client, eine Möglichkeit, den Client, dass das Formular übermittelt wurde, nicht in Form einer Warnung, aber eher, eine Möglichkeit, eine Funktion im Host auszulösen (der Container, ein Iframe, Objekt ... usw.).

+1

Ich vermisse einige Informationen zu diesem Schritt: "Wenn der submitForm-Aufruf erfolgt, wird die PDF-Datei erfolgreich erstellt und eine Warnung wird in der PDF-Datei angezeigt, indem Sie Folgendes tun:". Ich nehme an, dass ein PDF auf dem Server erstellt und auf dem Client angezeigt wird, aber vielleicht liege ich falsch. Vielleicht gibt der Server eine FDF-Datei zurück. Könntest Du das erläutern? –

+1

Hoppla, mein Fehler, der submitForm-Aufruf wird gemacht, um den Inhalt der PDF zu speichern nicht erstellen, es ist bereits in einem Benutzer-Steuerelement gerendert und eingebettet in eine Entschuldigung, ich habe die Frage korrigiert und fügte weitere Details über die PDF gerendert wird – Maya

+0

Ich verstehe oben nicht, wo ist sagt "if (! this.hostContainer.messageHandler);" Warum hat diese Zeile am Ende ein Semikolon? Ist das ein Fehler? wenn nicht, was ist der Zweck dieser Linie? Danke vielmals! –

Antwort

5

Die von Ihnen verwendete FDF-Antwort war mir unbekannt, daher habe ich etwas Neues aus Ihrer Frage gelernt. Ich habe die AcroJS-Referenz und die FDF-Spezifikation in der PDF-Referenz studiert und jetzt verstehe ich besser, was Ihr Code macht. Danke für das.

Ich gehe davon aus, dass Sie bereits wissen, wie Sie eine JavaScript-Nachricht in einer HTML-Datei mit einem JavaScript-Aufruf aus einer PDF-Datei auslösen. Siehe den Artikel createMessageHandler() im Artikel JavaScript Communication between HTML and PDF.

Ich interpretiere deine Frage als: "Wie ich diese Methode nach einer erfolgreichen Übermittlung der Daten aufrufen?"

Wenn es eine Lösung für diese Frage gibt, wird JavaScript einbezogen. Ich sehe, dass man JavaScript in einer FDF-Datei hinzufügen kann, aber ich bin mir nicht sicher, ob dieses JavaScript mit HTML "sprechen" kann. Ich bin nicht sicher, ob Sie eine JavaScript-Funktion in Ihrem ursprünglichen PDF aus der FDF-Antwort aufrufen können. Wenn es möglich ist, sollten Sie Ihrem PDF einen JavaScript-Eintrag ähnlich dem/Status-Eintrag hinzufügen.

Der Wert dieses Eintrags ist ein Wörterbuch, so etwas wie:

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

In Ihrem Fall würde ich den/Vor und/Doc Schlüssel entfernen. Ich glaube nicht, dass Sie sie brauchen, ich das Wörterbuch reduzieren würde zu:

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

Wo talkToHtml() ein Verfahren bereits im PDF vorhanden ist:

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

Ich weiß nicht, ob dieser Wille Arbeit. Ich habe es nie selbst ausprobiert. Ich basiere meine Antwort auf die Spezifikationen.

Ich weiß nicht, ob Sie wirklich FDF verwenden müssen. Haben Sie versucht, Ihrer submitForm() -Methode JavaScript hinzuzufügen?Etwas wie:

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

Dies funktioniert nur, wenn Sie als FDF einreichen. Ich glaube nicht, dass es eine Lösung gibt, wenn Sie eine HTML-Abfrage-Zeichenfolge senden.

Falls Sie sich fragen, was MyDocScript1 und MyDocScript2 sind:

Doc definiert ein Array definieren zusätzliche JavaScript-Skripten denen in der JavaScript-Eintrag des Dokumentname Wörterbuch definiert werden hinzugefügt. Das Array enthält eine gerade Anzahl von Elementen, die paarweise in Form von organisiert sind. Das erste Element jedes Paars ist ein Name und das zweite ist eine Textzeichenfolge oder ein Textstream, die das entsprechende Skript für diesen Namen definieren. Jedes der definierten Skripte wird zu den bereits im Namenswörterbuch definierten hinzugefügt und dann ausgeführt, bevor das Skript , das im Vorher-Eintrag definiert wurde, ausgeführt wird. (ISO-32000-1 Tabelle 245)

Ich bin nicht sicher, ob das alles in der Praxis funktioniert. Bitte lassen Sie es mich wissen.

+0

Endlich funktioniert das jetzt praktisch, Client ein PDF kann in beide Richtungen sprechen, falls Sie die Antwort aktualisieren wollen musste ich die/After Zeile zu ändern:/JavaScript <>. Danke, du hast das Kopfgeld! – Maya