Suche // Search:

Posts mit dem Label Script Object werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Script Object werden angezeigt. Alle Posts anzeigen

31.01.2011

Formulare durch Anhänge vorbefüllen
//
Populate forms from attachments

Haben Sie sich nicht schon mal gewünscht, Formulare einfach durch eine externe Datei zu aktualisieren, anstatt sie bei jeder Kleinigkeit wieder in Designer öffnen zu müssen?
Das ist sogar möglich.
Sie können Formularobjekte wie z.B. Texte und Textfelder zur Laufzeit verändern und z.B. durch eine angehängte XML-Datei vorbefüllen zu lassen.
Diese Methode ist beispielsweise praktisch, wenn Sie nur ihre AGB's im Formular aktualisieren wollen oder sie einen Fragebogen haben, bei dem Sie die Fragen je nach Abteilung nur etwas variieren müssen.

Dieses Beispiel verwendet dazu eine relativ kompakte JavaScript-Funktion in einen Skriptobjekt, dass beim docReady:Event ausgeführt wird.
Das Skript prüft, ob Anhänge vorhanden sind, und wenn ja, ob ein Anhang einen ganz bestimmten Namen hat.
Dieser Anhang ist dann die Quelldatei, aus der die XML-Daten herausgelesen und vorbefüllt werden.

AKTUALISIERUNG: Ich habe mein Bespiel etwas ergänzt. Sie könne jetzt auch Dropdown-Listen und Listboxen aus den Anhängen heraus vorbefüllen.


Have you ever thought of updating your existing forms through an external file instead of opening them each time again in Designer?
This is even possible.
You can manipulate form objects such as a text or text field at runtime and populate them from an attached XML-file.
This method is handy for example if you only need to update the GTC in your form or you have a questionnaire with slight varying questions for each division.

This example uses a relatively short JavaScript function in a script object, which is executed on the docReady:Event.
The script determines if there are files attached to the form and if one has a specific file name.
This specific file is the source file where the XML data is extracted from and populated.

UPDATE: My sample got a bit more complemented. Now you also can populate drop down lists and list boxes from the attachments.


JavaScript-Funktion
//
JavaScript function
form1.#variables[0].Populate - (JavaScript, client)
 
function Presets () {
     var oDoc = event.target,
  oAttachment = oDoc.dataObjects,
  oAttachmentName,
  oAttachmentData,
  oAttachmentString,
  oXMLData;        

 if (oAttachment !== null) {
  for (var i = 0; i < oAttachment.length; i += 1) {
   oAttachmentName = oAttachment[i].path; 
   if (oAttachmentName == "LCB_FormPresets.xml") {
    oAttachmentData = oDoc.getDataObjectContents(oAttachmentName); 
    oAttachmentString = util.stringFromStream(oAttachmentData);
    oXMLData = XMLData.parse(oAttachmentString, true);

    xfa.form.form1.pageSet.Master.Headline.value.text.value = oXMLData.Preset01.value;
    xfa.form.form1.Page.Name.rawValue = oXMLData.Preset02.value; 
    xfa.form.form1.Page.Address.rawValue = oXMLData.Preset03.value; 
    xfa.form.form1.Page.Mail.rawValue = oXMLData.Preset04.value; 
    xfa.form.form1.Page.Phone.caption.value.text.value = oXMLData.Preset05.value; 
    xfa.form.form1.Page.Fax.caption.value.text.value = oXMLData.Preset06.value; 
    xfa.form.form1.Page.Mail.caption.value.text.value = oXMLData.Preset07.value;
    xfa.form.form1.Page.Explaination.value.text.value = oXMLData.Preset08.value;  
    xfa.form.form1.Page.Explaination.font.fill.color.value = oXMLData.Preset09.value;  
    
    var DDLValues = oXMLData.Preset10.value.split(", ");
       for (var d = 0; d < DDLValues.length; d += 1) {
         xfa.form.form1.Page.DropDown.addItem(DDLValues[d]);
         }
         
        var LBValues = oXMLData.Preset11.value.split(", ");
       for (var l = 0; l < LBValues.length; l += 1) {
         xfa.form.form1.Page.ListBox.addItem(LBValues[l]);
         }
   }
  }
 }
}
Schritt 1 – Leeres Formulare mit Platzhalter-Texten oder leeren Feldern
//
Step 1 – Empty form with placeholder texts or empty fields


Schritt 2 – XML-Datei mit den gewünschten Daten als Anhang hinzufügen
//
Step 2 – Attach XML-file with the desired data

Schritt 3 – Automatisch vorbefülltes Formular nach dem Schließen und Öffnen
//
Step 3 – Automatically populated form after closing and opening


Beispielformular
//
Sample form
https://documentcloud.adobe.com/link/track?uri=urn:aaid:scds:US:e3f5ce39-e8f7-4af6-943b-069e2071d223

04.08.2010

Sichere Passwörter erstellen
//
Generate secure passwords

Passwörter sind wichtig für die Datensicherheit, doch den Menschen fällt es schwer sich sichere Passwörter auszudenken und vor allem zu merken.
Es nützt wenig wenn man ein 12-stelliges Password verwendet, dass in jedem Duden steht.
Aus diesem Grund können noch immer viele Benutzerkonten mit einfachen Bruteforce-Attacken geknackt werden.

Dieses Formular soll Ihnen ein wenig unter die Arme greifen.
Es erstellt aus beliebigen Eingaben kryptische Passwörter mit Groß- und Kleinschreibung, Ziffern, Buchstaben und Sonderzeichen und mit bis zu 64 Zeichen.
Das generierte Passwort können Sie dann einfach per Strg + C kopieren und in das jeweilige Anmeldefenster einfügen.
Sie brauchen sich eigentlich nur das merken, was sie in Klartext eingeben.

Die Passwörter werden mithilfe eines SHA512-Algorhytmus erstellt, der in einem Scriptobject steckt.
Ein verstecktes Formularobjekt "Trigger" stößt dann die Berechnungen an.


Passwords are very important for data security but for people it's often difficult to think out secure passwords and especially to remember them.
A twelwe-digit password is possibly useless if it is a word you can find in every spelling dictionary.
That's why many accounts are still easy to capture through simple brute-force attacks.

This form should help you a bit with this scenario.
From any input it generates cryptic passwords with upper and lower case characters, digits and special characters, and a length upto 64 digits.
You can copy (ctrl + c) the generated password and paste it directly into your login window.
Actualy all you need to remember is the cleartext.

The passwords are generated by a SHA512 algorithm that is put into a script object.
All calculations are triggered by a hidden form object "Trigger".

Passwort-Generator // Password Generator:


Skript für Trigger // Script for Trigger:

var Cleartext = Input.value.text.value;
var PW_Length = Password_Length.value.text.value;
var PW_Coding = Password_Coding.value.text.value;
var PW_String 
if(Cleartext.length >= 1)
{
if(PW_Coding == "BASE64")
{
PW_String = SHA512.b64_sha512(Cleartext);
}
if(PW_Coding == "HEX")
{
PW_String = SHA512.hex_sha512(Cleartext);
}
if(PW_Coding == "ANY")
{
PW_String = SHA512.any_sha512(Cleartext, Cleartext);
}
Output.rawValue = PW_String.substr(0, PW_Length);
xfa.host.setFocus("Output");
}
else
{
Output.rawValue = null;
}


Beispiel // Example:
https://workspaces.acrobat.com/app.html#d=dvPh1TeA9NC3VUK3zBp15g

16.03.2010

Formulare mit RC4 verschlüsseln
//
Encrypt Forms with RC4

Basierend auf dem Beispiel Base64 Encryption habe ich ein anderes Beispiel entwickelt, das anstelle von Base64 den Rivest Cipher No.4 Algorythmus (RC4) verwendet.

Der Algorythmus arbeitet innerhalb XFA-Formularen zwar, benötigt aber zuvor etwas Feinschliff.
Damit es beim Verschlüsseln und Entschlüsseln nicht zur Fehler kommt, die dazu führen, dass der Text abgeschnitten wird oder bestimmte Schriftzeichen fehlerhaft verarbeitet werden, muss der eigentliche Algorithmus mit der escape() bzw. unescape() Funktion kombiniert werden.

Für einen möglichst hohen Verschlüsselungsgrad wird aus dem Password des Benutzers ein Hashwert generiert, der mit einem anderen Hashwert kombiniert wird, das sogenannte Salting.
Aus diesem wird dann wiederum ein Hashwert erzeugt, der letzlich zur Ver- und Entschlüsselung verwendet wird.

Based on the example for the Base64 Encryption I developed another example, that uses the Rivest Cipher No. 4 algorithm (RC4).

To work proper in XFA-forms the algorithm needs some final touch.
Otherwise it will produces errors like cuf off text and misinterpreted characters when encrypting oder decrypting the text strings.
Therefore I added the escape() repectively unescape() functions to the algorithm for the enryption and decryption.

For a high ciphering level the form generates a hash-key from the users password which then will be combined with another hash-key (the so-called Salting). From this salted hash-key there will be generated a final hash-key which is used for the en- and decryption.


JavaSript für Verschlüsselung // JavaScript for Encryption:

var CharSetSize = 256;
var RC4_SubstitutionBox = new Array(CharSetSize);


function RC4_crypt (KeyWord, InputTextString)
{
var i, j, k = 0;
var Temp = 0;
var t = 0;
var ModifiedText = "";


for (j = 0; j < CharSetSize; j++)
RC4_SubstitutionBox[j] = j;
j = 0;


for (i=0; i < CharSetSize; i++)
{
j = (j + RC4_SubstitutionBox[i] + KeyWord.charCodeAt(i % KeyWord.length)) % CharSetSize;
Temp = RC4_SubstitutionBox[i];
RC4_SubstitutionBox[i] = RC4_SubstitutionBox[j];
RC4_SubstitutionBox[j] = Temp;
}


for (k=0; k < InputTextString.length; k++)
{
i = (i + 1) % CharSetSize;
j = (j + RC4_SubstitutionBox[i]) % CharSetSize;
Temp = RC4_SubstitutionBox[i];
RC4_SubstitutionBox[i] = RC4_SubstitutionBox[j];
RC4_SubstitutionBox[j] = Temp;
t = (RC4_SubstitutionBox[i] + RC4_SubstitutionBox[j]) % CharSetSize;
ModifiedText = ModifiedText + String.fromCharCode(InputTextString.charCodeAt(k) ^ RC4_SubstitutionBox[t]);
}
return escape(ModifiedText);
}
Klartext // Cleartext:



RC4-verschlüsselter Text // RC4-Encrypted Text:


Beispiel // Example:
https://acrobat.com/#d=35uUne9Hl5V*fZG8ZRWLBA

13.03.2010

Formulare mit Base64 verschlüsseln
//
Encrypt Forms with Base64

Haben Sie schon mal ein PDF-Formular gehabt, dessen Inhalt sie verschlüsseln können?
Ich auch nicht. Warum eigentlich nicht?
Es kann doch nur praktisch sein, die Inhalte einer PDF zu verschlüsseln anstatt die PDF als solche.
Schließlich gibt es mittlerweile diverse Tools, die die Passwortschale einer PDF in Sekunden knacken.

Also warum nicht die PDF offen lassen und den Inhalt unleserlich machen?

Dieses Beispiel-Formular verwendet ein Script zum Verschlüsseln der Daten als Base64-String.
Das Ganze wird durch eine Passwortabfrage gesichert, die Hashwerte aus den Eingaben erstellt und vergleicht.

Have you ever seen a PDF form where you could encrypt the contents?
I didn't, but why?
It will be so handy to encrypt the content instead of the whole file.
Because there are so many cracking tools around, that will break the password shell within seconds.

So why don't leave file open and make the contents unreadable?

The example form uses a script to encrypt the data as base64 string, protected by a password query that uses hashes and compares them.

Klartext
//
Cleartext:

Base64-verschlüsselter Text
//
Base64-encrypted Text:



Beispielformular
//
Sample form:
https://files.acrobat.com/a/preview/84c26bcc-68f0-43a3-b1e6-4f07c7dd5d6e

19.01.2010

Mehrsprachige Formulare
//
Multilingual forms

In manchen Situationen ist es erforderlich ein Formular in mehrere Sprachen verfügbar zu machen.
Nun kann man dafür natürlich jeweils ein separates Formular pro Sprache erstellen und verteilen, aber wenn das Formular mal aktualisiert werden muss, müsen gleich alle Sprachversionen überarbeitet werden.
Das kann unnötig viel Zeit kosten.

Dieses Beispiel zeigt Ihnen, wie sie ein mehrsprachiges Formular erstellen können, bei dem Sie die Sprache zur Laufzeit ganz einfach ändern können.

Erstellen Sie ein Scriptobjekt im Root-Knoten ihres Formulars (unter Formular1) und benennen Sie es "FormLanguages".
In diesen Scriptobject benötigen Sie eine Funktion "ChangeFormLanguages" zum Deklarieren der Eigenschaften und Formularobjekte, deren Sprache sie ändern wollen.
Für jede Sprache, kommt dann jeweils noch eine Funktion "GermanCaption" &amp; "EnglishCaption" dazu, die die deklarierten Objekte und Eigenschaften mit neuen Wörtern füttert.

There are situation you need a form present in several languages.
Of course you can create and distribute the form as a separate file for each language.
But what if you need to update the form? Then you have to update each single form, that can be a waste of time.

In this example you can see, how to create a multilingual form, where you can easily change the language easy during runtime.

Create a script object in the root node of your form (under form1) and name it "FormLanguages".
In this script object you have to put a function "ChangeFormLanguage" to define all the form object and properties you would like to change the language for.
For every singe language you also need a function "GermanCaption" &amp; "EnglishCaption" etc. with the words for the predefined objects and properties.

Scriptobjekt- Funktion zu Deklarieren der zu veränderden Formularobjekte //
Script Object - Function to define changable form objects: 
function ChangeFormLanguage(L01, L02, L03)

{
xfa.form.form1.Page1.FirstName.caption.value.text.value = L01;
xfa.form.form1.Page1.LastName.caption.value.text.value = L02;
xfa.form.form1.Page1.Age.caption.value.text.value = L03
}

Funktionen mit den Wörtern in der jeweiligen Sprache // Functions with the language specific words:
function GermanCaption()
{
FormLanguages.ChangeFormLanguage( "Vornahme:",
"Nachname:",
"Alter:";
}


function EnglishCaption()
{
FormLanguages.ChangeFormLanguage( "First name.",
"Last name:",
"Age:";
}
Als letztes brauchen Sie nur noch ein Objekt, über das sie die Sprache wählen.
Das kann z.B. eine Dropdown-Feld oder eine Optionsliste sein.


Finally you need an object to select the desired language.
This can be a drop down field or a radio button list.


JavaScript für Dropdown Feld // JavaScript for drop down Field:

if(xfa.event.newText == "Deutsch")

{
xfa.form.form1.FormLanguages.GermanCaption();
}
if(xfa.event.newText == "English")
{
xfa.form.form1.FormLanguages.EnglishCaption();
}


Deutsche Beschriftungen // German Captions:

Englische Beschriftungen // English Captions:


Beispiel // Example:
https://acrobat.com/?d=nEDFzJRnPT-dLJgwONSIbQ

22.11.2009

"Änderung speichern"-Dialog mit Dirty-Flag unterbinden
//
Suppress 'Save Changes' Dialog with Dirty Flag

Manche Dinge sind echt nervig.
Da hat man ein XFA-Formular auf einem zentralen Speicherort liegen, das nicht überschrieben werden soll oder ein eines, dass nur zum Nachschlagen, aber nicht zum Ausfüllen dient.
Durch die vielen interaktiven Möglichkeiten kommt es aber immer wieder zu dem Problem, dass beim Schließen des Formulars der Dialog "Änderungen speichern" auftaucht und das Formular in seiner ursprünglichen Form überschrieben wird.

Um dem Problem Herr zu werden, bedarf es einiger Programmiertricks.

Im Kern dreht sich aber alles um ein kleines Script, dass das sogenannte Dirty Flag kontrolliert.
Das Dirty Flag gibt an, ob etwas in dem Formular geändert wurde, sei es noch so unbedeutend gewesen.
Ist das der Fall, fragt Acrobat/Reader nach, ob die Änderungen gespeichert werden sollen.

There are some annoying things going on.
Imagine, you have a XFA-form located on a central hard drive, that shouldn't be overwritten or a form you only use for look something up but not for filling.
Through all the interactivity in the forms you can get the 'save changes" dialog when you close the form and it happens that the basic form then is overwritten.

To handle this, you need some tricky programmings.

The base is a small script, that controls the dirty flag.
This flag tells the application if something has been changed in the form.
If so, Acrobat/Reader asks you to save changes you made.

JavaScript:

var MyDoc = event.target;
MyDoc.dirty = false;

Das Beispielformular zeigt, wie Sie dieses Script durch Events im Formular ansteuern können.

The example form shows, how you can trigger the script through events in the form.

Beispiel // Example:
https://workspaces.acrobat.com/app.html#d=WIEJS1UOrtCxRiAj5OeLPg