Suche // Search:

Posts mit dem Label Form Variables werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Form Variables werden angezeigt. Alle Posts anzeigen

24.01.2011

Mehrstufige Dropdown-Liste
//
Multilevel dropdown list

Dropdown-Listen sind nützlich aber je nach Menge der Werte elend lang und dadurch unübersichtlich.
Gute Beispiele sind die Länder- oder Branchenauswahlen in den Anmeldeformularen vieler Websites.
Da finden sich gerne mal 100 und mehr Werte die ersteinmal gelesen werden wollen.
Wer macht das schon?

Dieses Beispiel zeigt, wie man in einer einzigen Dropdown-Liste mehrere Ebenen definieren kann, die jeweils nur einige wenige Werte anzeigen und dadurch übersichtlicher sind.
Eine getroffene Auswahl bringt den Benutzer eine Ebene tiefer und zeigt nur zu der Auswahl passende Werte an (Vom Groben ins Detail).


Dropdown Lists a useful but depending on the amount of values they display also very multitudinous.
Good examples are those country- or branch selections in the registration forms of many websites.
There you can have 100 or more values to read over. Who is really doing this?

This example shows how you can design a single dropdown list with several levels which only have a few values and are more readable.
A selection brings the user a level deeper which only shows values that matches the selection (top-down method)

Mehrstufige Dropdown-Liste – mit 3 Ebenen
//
Multilevel dropdown list – with 3 levels

Beispiel-Formular
//
Sample form
https://files.acrobat.com/a/preview/a056804c-a535-4a33-aeea-e0e1df82d346

12.01.2011

XFA Terminkalender
//
XFA Appointment Calendar

Heute will ich mal zeigen, was man alles mit XFA-Formularen und FormCalc realisieren kann. Dieses Beispiel ist ein Terminkalender.

Wenn Sie ein Jahr auswählen werden sämtliche Monate, Wochen und Tage durch ein Skript berechnet und der Kalender gerendert.
Allerdings ist dieser Vorgangs sehr rechenintensiv und dauert je nach Rechenleistung auch mal eine Minute und länger.

Besonderheiten:
In diesem Beispiel werden die Wochenenden ausgenommen, da man da gewöhnlich nicht arbeitet.
Zeiten bei denen eine Notiz oder ein Termin hinterlegt wurden, werden automatisch durch eine Farbe hervorgehoben.
Des Weiteren wird auch der heutige Tag wird in der Kopfzeile hervorgehoben.


Today I like to show what is possible with XFA forms and FormCalc. This example is an appointment calender.

If you select a year a script starts to calculate all months, week and days in front of rendering the calendar.
But, this progress need thousands of calculations and takes about a minute or longer to finish, depending on the computing power.

Features:
In the example all weekends are excluded because you generally do not work on this days.
Timeslots where a note or appointment has been added are automatically highlighted by a color.
Also, the current date is highlighted in the headline.

Kalender // Calendar


FormCalc-Skript - Berechnung der Kalenderblätter
//
FormCalc script - Calculation of the Calendar Sheets

if (RenderForm.value eq 1) then
    var nPages = Page.instanceManager.count 
    var nStart
    var nLength
    var nIndex
    var nDayNumber
    var nDayName 
    var nWeekDay
    var nWeekNumber
    var nYear = Year
    var nBegin
    var nFirstDay
    var nLastDay
    var nAddDay
    var nCheck

 for p = 0 upto nPages - 1 step 1 do
    nBegin = Concat("1.", p+1, ".", nYear)
    nFirstDay = Date2Num(nBegin, "D.M.YYYY")
    nAddDay = nFirstDay


    for d = 0 upto 31 step 1 do
        nAddDay = nAddDay + 1
        nCheck = Num2Date(nAddDay, "M")
        if (nCheck eq p+1) then
            nLastDay = nAddDay
        endif
    endfor

    nLength = Num2Date(nLastDay, "D")
    Page[p].Head.Month = Num2Date(Date2Num(nBegin, "D.M.YYYY"), "MMMM")
    Page[p].Body._Day.setInstances(nLength)
    nStart = Date2Num(nBegin, "D.M.YYYY")

    for d = 0 upto nLength - 1 step 1 do 
        nIndex = Sum(nStart, d)
        nDayNumber = Num2Date(nIndex, "DD")
        nDayName = Num2Date(nIndex, "EEE")
        nWeekDay = Num2Date(nIndex, "E")
        nWeekNumber = Num2Date(nIndex, "WW")
        if(nWeekDay eq "1" or nWeekDay eq "7") then
            Page[p].Body.Day[d].DayName.Text.w = S_S.value
            Page[p].Body.Day[d].DayName.Text.border.fill.color.value = "128,128,128"
            Page[p].Body.Day[d].Week.Text.w = S_S.value
            Page[p].Body.Day[d].Detail[*].Notes.w = S_S.value
            Page[p].Body.Day[d].Detail[*].Notes.ui.textEdit.border.fill.color.value = "128,128,128"
            Page[p].Body.Day[d].Detail[*].Notes.margin.topInset = "0.0mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.bottomInset = "0.0mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.leftInset = "0.0mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.rightInset = "0.0mm"
            Page[p].Body.Day[d].DayName.Text.value.text.value = ""
            Page[p].Body.Day[d].Week.Text.value.text.value = ""
        else
            Page[p].Body.Day[d].DayName.Text.w = M_F.value  
            Page[p].Body.Day[d].DayName.Text.border.fill.color.value = "255,255,255"
            Page[p].Body.Day[d].Week.Text.w = M_F.value 
            Page[p].Body.Day[d].Detail[*].Notes.w = M_F.value
            Page[p].Body.Day[d].Detail[*].Notes.ui.textEdit.border.fill.color.value = "255,255,255"
            Page[p].Body.Day[d].Detail[*].Notes.margin.topInset = "0.5mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.bottomInset = "0.5mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.leftInset = "0.5mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.rightInset = "0.5mm"
            Page[p].Body.Day[d].DayName.Text.value.text.value = Concat(nDayNumber, ".\u000a", nDayName)

            if(nWeekDay == "2") then
                Page[p].Body.Day[d].Week.Text.value.text.value = nWeekNumber
            else
                Page[p].Body.Day[d].Week.Text.value.text.value = ""
            endif
        endif
    endfor
endfor
RenderForm.value = 0
endif

Beispiel-Kalender // Example Calendar
https://acrobat.com/#d=YpV-ajdmwMmAXZHUPL1E-g

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

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