none
Javascript Custom-Dialog für PDF-Formfields (dynamic Stamps) RRS feed

  • Frage

  • Hallo Leute,

    ich bin absoluter Neuling in Javascript und bekomme schon eine Krise mit diesen ganzen Klammern. :-)

    Folgendes möchte ich machen.

    Ich möchte dynamische Stempel für PDF-Dateien erstellen und benötige dafür ein Custom-Dialog. Das habe ich auch alles soweit hinbekommen, nach mühsamen Recherchen.

    Mein Problem ist, wie ich jetzt die Werte aus der Dialogbox richtig auswerten kann und in den PDF-Formfields einfügen kann.

    Hier mein Code für den Custom-Dialog:

    var dialog = {
        DateValue: "",
        retErledigt: "",
    
      initialize: function(dialog) {
            //dialog.load({"raA3": true}); // option A3 is default
    		dialog.Load({"txt1": Date.now()});
        },
    
    
        commit: function (dialog) { // called when OK pressed 
          var data = dialog.store();
            switch (true) {
                case data["raA1"]:
                    this.retErledigt = this.strRetErledigt + "1";		//ohne
                    break;
                case data["raA2"]:
                    this.retErledigt = this.strRetErledigt + "2";		//Mail
                    break;
                case data["raA3"]:
                    this.retErledigt = this.strRetErledigt + "3";		//Brief
                    break;
                case data["raA4"]:
                    this.retErledigt = this.strRetErledigt + "4";		//Telefon
                    break;
    
                default: // do nothing
            }
    		 this.DateValue = data["txt1"];
        },
    
        description:
        {
            name: "Abfrage: Erledigt von",    // Dialog box title
            elements:
                [
                    {
                        type: "view",
                        elements:
                            [
                                {
                                    name: "Datum: ",
                                    type: "static_text",
                                },
                                {
                                    item_id: "txt1",
                                    type: "edit_text",
                                    multiline: false,
                                    width: 300,
                                    height: 30
                                },
    
                                //Radiobutton
                                {
                                    type: "cluster",
                                    name: "Auswahl Erledigt",	//Caption
                                    align_children: "align_row",	//align_left,-center,-right,-fill,-top,-row,-distribute
                                    elements:
                                        [
                                            {
                                                type: "radio",
                                                item_id: "raA1",
                                                group_id: "gro1",
                                                name: "ohne",
                                            },
                                            {
                                                type: "radio",
                                                item_id: "raA2",
                                                group_id: "gro1",
                                                name: "Mail",
                                            },
                                            {
                                                type: "radio",
                                                item_id: "raA3",
                                                group_id: "gro1",
                                                name: "Brief",
                                            },
                                            {
                                                type: "radio",
                                                item_id: "raA4",
                                                group_id: "gro1",
                                                name: "Telefon",
                                            },
    
                                        ]
                                },
    
    
                                //End Radiobutton
    
    
    
                                {
                                    type: "ok_cancel",
                                    ok_name: "Ok",
                                    cancel_name: "Cancel"
                                },
                            ]
                    },
                ]
        }
    }
    
    
    //if (event.source.forReal && (event.source.stampName == "#caseandnumblue")) {
    if ("ok" == app.execDialog(dialog)) {
    
    switch (dialog.retErledigt) {
      case "1":
        // Anweisungen werden ausgeführt,
        // falls expression mit value1 übereinstimmt
    	cMsg= "Erledigt von"
        break;
      case "2":
        // Anweisungen werden ausgeführt,
        // falls expression mit value2 übereinstimmt
    	cMsg= "Erledigt per Email von"
        break;
    
      case "3":
        // Anweisungen werden ausgeführt,
        // falls expression mit valueN übereinstimmt
    	cMsg= "Erledigt per Brief von"
    
      case "4":
        // Anweisungen werden ausgeführt,
        // falls expression mit valueN übereinstimmt
    	cMsg= "Erledigt per Tel. von"
    
        break;
      default:
        // Anweisungen werden ausgeführt,
        // falls keine der case-Klauseln mit expression übereinstimmt
    	cMsg="Erledigt von"
       	break;
        }
    
    }
    
    event.value = cMsg;
    
     var d
        d = this.DateValue
        d = d.replace(",",".")
        d = d.replace("/",".")
    
    var u
    if((identity.name != null) && !/^\s*$/.test(identity.name))
    u = identity.name;
    else
    u = identity.loginName.replace(/\./g," ").replace(/\./g," ").replace(/\b(\w)/g,function(Word,cFst){return cFst.toUpperCase()});
    
    
    document.getElementById('txtVonFieldd').value = u + ", " + d;
    

    Und so sieht es aus:

    1. Wie bekomme ich in das Datumsfeld das aktuelle Tagesdatum vorbelegt?
    2. In das Formfield "txtErledigtvon" sollen die Radiobuttons sollen ausgewertet werden und das Ergebnis in das Form eingetragen lt. Switch-Anweisung werden.
    3. Das Ergebnis aus der Datumseingaben soll mit ',' o. '.' o. '/' möglich sein. Daher habe ich eine Replace-Anweisung verwendet.

    Das Ergebnis soll im Grunde dann z. B. wie folgt aussehen:

    Hat jemand erbarmen und kann sich der Sache vielleicht kurz annehmen. Ich mache ja eine Menge mit, aber jetzt noch Javascript ist einfach zuviel für mich.

    Vielen Dank im Voraus.

    Gruß Ahmed


    Samstag, 3. Juli 2021 07:46

Antworten

  • Hallo Folks,

    hier jetzt die endgültige Lösung für die Nachwelt. :-)

    var dialog = { retErledigt: "", DateValue: "", initialize: function(dialog) { //dialog.load({"raA3": true}); // option A3 is default
    //Textfeld "txt1" erhält den Standardtext (aktuelles Datum) var todayDate = dialog.store()["date"]; todayDate = util.printd("dd.mm.yy", new Date()); dialog.load({"txt1": todayDate}); }, //Speichern der Werte aus dem Custom-Dialog in den Dialog-Variablen
    //siehe hierzu den Header commit: function (dialog) { // called when OK pressed var data = dialog.store(); switch (true) { case data["raA1"]: this.retErledigt = this.retErledigt + "1"; //ohne break; case data["raA2"]: this.retErledigt = this.retErledigt + "2"; //Mail break; case data["raA3"]: this.retErledigt = this.retErledigt + "3"; //Brief break; case data["raA4"]: this.retErledigt = this.retErledigt + "4"; //Telefon break; default: // do nothing } this.DateValue = data["txt1"]; }, description: { name: "Abfrage: Erledigt von", // Dialog box title elements: [ { type: "view", elements: [ { name: "Datum: ", type: "static_text", }, { item_id: "txt1", type: "edit_text", multiline: false, width: 300, height: 30 }, //Radiobutton { type: "cluster", name: "Auswahl Erledigt", //Caption align_children: "align_row", //align_left,-center,-right,-fill,-top,-row,-distribute elements: [ { type: "radio", item_id: "raA1", group_id: "gro1", name: "ohne", }, { type: "radio", item_id: "raA2", group_id: "gro1", name: "Mail", }, { type: "radio", item_id: "raA3", group_id: "gro1", name: "Brief", }, { type: "radio", item_id: "raA4", group_id: "gro1", name: "Telefon", }, ] }, //End Radiobutton { type: "ok_cancel", ok_name: "Ok", cancel_name: "Cancel" }, ] }, ] } } //if (event.source.forReal && (event.source.stampName == "#caseandnumblue")) { if ("ok" == app.execDialog(dialog)) {

    //Auswerten der Radiobuttons switch (dialog.retErledigt) { case "1": // Anweisungen werden ausgeführt, // falls expression mit value1 übereinstimmt cMsg= "Erledigt von" break; case "2": // Anweisungen werden ausgeführt, // falls expression mit value2 übereinstimmt cMsg= "Erledigt per Email von" break; case "3": // Anweisungen werden ausgeführt, // falls expression mit valueN übereinstimmt cMsg= "Erledigt per Brief von" case "4": // Anweisungen werden ausgeführt, // falls expression mit valueN übereinstimmt cMsg= "Erledigt per Tel. von" break; default: // Anweisungen werden ausgeführt, // falls keine der case-Klauseln mit expression übereinstimmt cMsg="Erledigt von" break; } }

    //aktuelles PDF-Formfield erhält den Wert event.value = cMsg;

    //Windows Login-Name var u if((identity.name != null) && !/^\s*$/.test(identity.name)) u = identity.name; else u = identity.loginName.replace(/\./g," ").replace(/\./g," ").replace(/\b(\w)/g,function(Word,cFst){return cFst.toUpperCase()});

    //Zwischenspeichern des Textfeld mit dem Datum var d; d = dialog.DateValue d = d.replace( /,/g, "." ); d = d.replace( /\//g, "." ); //app.alert(d)

    //Konvertierung String d in cDate var cDate = util.scand("dd.mm.yy", d);

    //PDF-Formfield mit neuem Wert befüllen und Datum richtig formatieren this.getField("txtVonField").value=u + ", " + util.printd("dd.mm.yy", cDate);

    So das wars.

    Ich hoffe ich muss nie wieder mit JavaScript arbeiten. :-)
    Das ist mir einfach zu kompliziert.

    Gruß Ahmed

    Sonntag, 4. Juli 2021 16:02

Alle Antworten

  • Hallo Ahmed,

    da das wohl eine PDF spezifische Frage ist, wäre es sinnvoller, auch in einem entsprechenden Forum zu fragen.

    Das aktuelle Tagesdatum erhältst Du bspw. so:

    var today = new Date();
        today.setHours( 0, 0, 0, 0 );
    

    setHours ist nur notwendig, wenn Du die Zeitangabe zwingend auf 0:00 Uhr brauchst. (also letztendlich ein Datum ohne Uhrzeit)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 3. Juli 2021 09:36
    Moderator
  • Hallo Stefan,

    vielen Dank für die Info.

    Ich dachte es wäre auch ein reines Javascript-Problem, da ich ja das Custom-Dialog verwende. Wie man das einem PDF-Formfield zuweist, wäre dann ja noch das kleinere Problem.

    Mir wäre also schon bei den JS-Problemen echt geholfen.

    Gruß Ahmed

    Samstag, 3. Juli 2021 10:04
  • Hallo Ahmed,

    diese Art von Dialogen kommt nicht in JavaScript vor, sondern in der PDF Anwendung. Man kann Sie über JavaScript Code steuern aber dennoch kommt es eher auf die Spezifikation in PDF an. Daher muss man sich diese Spezifikation anschauen und das Ganze auch in einer PDF Datei testen, um dir dabei dann helfen zu können. Das ist allerdings gar nicht so einfach (hast Du ja aber auch schon selbst bemerkt)

    1. Wie bekomme ich in das Datumsfeld das aktuelle Tagesdatum vorbelegt?
    var today = new Date();
        today.SetHours( 0, 0, 0, 0 );
    
        document.getElementById( "heute" ).valueAsDate = today;
    
    

    oder

    var todayAsString = today.toISOString().substr( 0, 10 );
    
        document.getElementById( "heute" ).value = todayAsString;

    2. In das Formfield "txtErledigtvon" sollen die Radiobuttons sollen ausgewertet werden und das Ergebnis in das Form eingetragen lt. Switch-Anweisung werden.

    Das hat ja nichts mit JavaScript selbst zu tun sondern dann wieder mit den Arobat Forms.

    3. Das Ergebnis aus der Datumseingaben soll mit ',' o. '.' o. '/' möglich sein. Daher habe ich eine Replace-Anweisung verwendet.

    Das ist ja schon enthalten, wenn auch syntaktisch falsch.

    var d;
        d = <WertAusDemAcrobatDialog>;
        d = d.replace( /,/g, "." );
        d = d.replace( /\//g, "." );

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 3. Juli 2021 11:29
    Moderator
  • Hallo Stefan,

    vielen Dank für die Info.

    Ich werde deine Tipps noch einmal prüfen und mich ggf. dann in einem Fachforum meine Anfrage stellen. Mir war der Unterschied mit den JS nicht so ganz klar.

    Gruß Ahmed

    Samstag, 3. Juli 2021 12:33
  • Hallo Folks,

    hier jetzt die endgültige Lösung für die Nachwelt. :-)

    var dialog = { retErledigt: "", DateValue: "", initialize: function(dialog) { //dialog.load({"raA3": true}); // option A3 is default
    //Textfeld "txt1" erhält den Standardtext (aktuelles Datum) var todayDate = dialog.store()["date"]; todayDate = util.printd("dd.mm.yy", new Date()); dialog.load({"txt1": todayDate}); }, //Speichern der Werte aus dem Custom-Dialog in den Dialog-Variablen
    //siehe hierzu den Header commit: function (dialog) { // called when OK pressed var data = dialog.store(); switch (true) { case data["raA1"]: this.retErledigt = this.retErledigt + "1"; //ohne break; case data["raA2"]: this.retErledigt = this.retErledigt + "2"; //Mail break; case data["raA3"]: this.retErledigt = this.retErledigt + "3"; //Brief break; case data["raA4"]: this.retErledigt = this.retErledigt + "4"; //Telefon break; default: // do nothing } this.DateValue = data["txt1"]; }, description: { name: "Abfrage: Erledigt von", // Dialog box title elements: [ { type: "view", elements: [ { name: "Datum: ", type: "static_text", }, { item_id: "txt1", type: "edit_text", multiline: false, width: 300, height: 30 }, //Radiobutton { type: "cluster", name: "Auswahl Erledigt", //Caption align_children: "align_row", //align_left,-center,-right,-fill,-top,-row,-distribute elements: [ { type: "radio", item_id: "raA1", group_id: "gro1", name: "ohne", }, { type: "radio", item_id: "raA2", group_id: "gro1", name: "Mail", }, { type: "radio", item_id: "raA3", group_id: "gro1", name: "Brief", }, { type: "radio", item_id: "raA4", group_id: "gro1", name: "Telefon", }, ] }, //End Radiobutton { type: "ok_cancel", ok_name: "Ok", cancel_name: "Cancel" }, ] }, ] } } //if (event.source.forReal && (event.source.stampName == "#caseandnumblue")) { if ("ok" == app.execDialog(dialog)) {

    //Auswerten der Radiobuttons switch (dialog.retErledigt) { case "1": // Anweisungen werden ausgeführt, // falls expression mit value1 übereinstimmt cMsg= "Erledigt von" break; case "2": // Anweisungen werden ausgeführt, // falls expression mit value2 übereinstimmt cMsg= "Erledigt per Email von" break; case "3": // Anweisungen werden ausgeführt, // falls expression mit valueN übereinstimmt cMsg= "Erledigt per Brief von" case "4": // Anweisungen werden ausgeführt, // falls expression mit valueN übereinstimmt cMsg= "Erledigt per Tel. von" break; default: // Anweisungen werden ausgeführt, // falls keine der case-Klauseln mit expression übereinstimmt cMsg="Erledigt von" break; } }

    //aktuelles PDF-Formfield erhält den Wert event.value = cMsg;

    //Windows Login-Name var u if((identity.name != null) && !/^\s*$/.test(identity.name)) u = identity.name; else u = identity.loginName.replace(/\./g," ").replace(/\./g," ").replace(/\b(\w)/g,function(Word,cFst){return cFst.toUpperCase()});

    //Zwischenspeichern des Textfeld mit dem Datum var d; d = dialog.DateValue d = d.replace( /,/g, "." ); d = d.replace( /\//g, "." ); //app.alert(d)

    //Konvertierung String d in cDate var cDate = util.scand("dd.mm.yy", d);

    //PDF-Formfield mit neuem Wert befüllen und Datum richtig formatieren this.getField("txtVonField").value=u + ", " + util.printd("dd.mm.yy", cDate);

    So das wars.

    Ich hoffe ich muss nie wieder mit JavaScript arbeiten. :-)
    Das ist mir einfach zu kompliziert.

    Gruß Ahmed

    Sonntag, 4. Juli 2021 16:02