Javascript im Acrobat PDF

Adobe_Acrobat_X_icon

Bei der Erstellung von PDF-Formularen kann Javascript gelegentlich sehr dienlich sein. Der Artikel ist sozusagen als „Beifang“ aus der täglichen Arbeit entstanden, da ich weder Mediendesigner noch sonderlich geübt im Umgang mit Adobe Acrobat XI Pro V.11.x.x bin. An fünf unterschiedlichen Anforderungen zeige ich hier die Verwendung von Javascript im Acrobat PDF zur Validierung von Feldern in PDF-Formularen.

Ist ein Feld ausgefüllt?

Werden Felder in Acrobat als Pflichtfelder gekennzeichnet, bekommen sie einen roten Rahmen, aber der Nutzer bekommt keine Fehlermeldung, wenn er sie nicht befüllt. Die Fehlermeldung wird durch ein Script erzeugt, das durch einen Trigger ausgelöst wird. Editiert man die Feldeigenschaften, kann man beim Verlassen des Feldes (On Blur) damit die Prüfung veranlassen.

Acrobat Actions Javascript

Das kleine Script dazu:

1
2
3
4
5
if (event.value == '')
{
app.alert("This field is required. Please enter a value.", cTitle: "Error", nIcon: 0, nType: 1);
event.rc = false;
}

Soll eine bestimmte Zeichenlänge (hier 6 Zeichen) vorgegeben werden, lautet das Script:

1
2
3
4
5
6
event.rc = true;
if (event.value.length != 6)
{
app.alert("Das Feld erfordert sechs Ziffern!");
event.rc = false;
}

Bei umfangreichen Formularen muss man damit rechnen, dass nicht alle Felder vom Nutzer durchlaufen werden und damit auch die Trigger nicht zum Zug kommen.

Alle Felder ausgefüllt?

Um ein Formular z.B. vor dem Drucken auf leere Felder zu prüfen, benötigt man die Document Actions, die man sich zur Toolbar hinzufügen kann. Über den Button Customize -> Manage Tool Set oben rechts im Adobe Acrobat Pro lässt er sich den Default Tools hinzufügen.

Tools in Acrobat anpassen

Falls man das neue Symbol nicht sieht, muss man über den Button Customize die Default Toolbar auswählen. Über dieses Symbol Acrobat Document Actions in der Toolbar kann nun die Dokumentenaktion gewählt werden, bei der ein Script ausgeführt werden soll.

Acrobat Document Actions

Das Script dazu kann etwa so aussehen:

var emptyFields = [];
for (var i=0; i<this.numFields; i++)
{
var f= this.getField(this.getNthFieldName(i));
if (f.type!="button" && f.required )
{
if((f.type == "text" && f.value == "") || (f.type == "checkbox" && f.value == "Off"))
emptyFields.push(f.name);
}
}
if (emptyFields.length>0)
{
app.alert(
{
cMsg: "Not all required fields are filled!\n\nPlease fill the required fields\nand print the document
again!"
,
cTitle: "Error",
nIcon: 0,
nType: 1
});
}

Leider lässt es sich nicht verhindern, dass das Dokument ausgedruckt wird und das gilt natürlich auch für das Schließen oder Speichern. Eine denkbare Lösung wäre es, das Drucken über das Menü über die Sicherheitseinstellungen zu verbieten und für den Druck einen Printbutton in das Formular zu integrieren, dem dann auch das Script mitgegeben werden kann.

E-Mail-Adresse auf Syntax prüfen

Die simpelste Art ist, die -> Standardprüfung von Acrobat zu verwenden. Sie lässt sich nachbilden, indem man unter Actions einen Trigger On Focus anlegt und in seinem als Script

1
FieldValidationPending = false; 

einträgt. Unter Validation findet dann die eigentlich Prüfung statt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(event.value != "")
{
if (! eMailValidate(event.value))
{
event.rc = false;
app.alert(
{
cMsg: "Invalid email address - Please try again",
cTitle: "Error",
nIcon: 0,
nType: 1
});
}
}

Wird ein Script verwendet, muss unter dem Reiter Format die Formatdefinition für das Feld entfernt werden.
Wer die exakte Kontrolle über die verwendbaren Zeichen und die Zeichenanzahl haben möchte, muss den Zeichenvorrat definieren:

1
2
3
4
5
6
7
8
9
var mail = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
if (event.value!="")
{
if (!mail.test(event.value))
{
event.rc = false;
app.alert(""" + event.value + "" is not a valid email address.");
}
}

Datum auf Syntax prüfen

Interessant ist auch die Verwendung des util-Objekts und seiner util.scand-Methode, das umständliche Formatprüfungen erspart.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
event.rc = true;
if(event.value != "")
{
var oMyDate = util.scand("dd.mm.yyyy", event.value);
if(oMyDate == null)
{
app.alert("Bitte geben Sie ein gültiges Datum ein (Bsp. 13.05.2018)", 0, 1), "Error";
event.rc = false;
}
else
{
event.value = util.printd("dd.mm.yyyy", oMyDate);
}
} 

Prüfung auf Zahlen und Länge

Auch die Prüfung auf reguläre Ausdrücke ist möglich. Hier wird auf 6 Ziffern getestet.

1
2
3
4
5
6
7
event.rc = true;
var regexp = /\D/;
if (event.value.length != 0 &amp;&amp; (event.value.length != 6 || regexp.test(event.value) == true))
{
app.alert("Bitte geben Sie 6 Ziffern ein");
event.rc = false;
}

Um auf eine gültige Syntax von Telefonnummern zu prüfen, verwendet man:

1
var regexp = /^(\+)((?:[0-9] ?){6,14}[0-9])$/;  


Links

-> Developing Acrobat® Applications Using JavaScript™
-> Acrobat JavaScript Scripting Guide
-> Eine Einführung der Leibniz Universität Hannover zu Javascript in PDF-Formularen

Ähnliche Beiträge:
-> Zulu: OpenJDK 11 und JavaFX installieren

Buy Me a Coffee at ko-fi.com

You May Also Like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Aus persönlichen Gründen...

... kann ich den Blog im Moment leider nicht wie gewohnt betreuen und Anfragen zeitnah beantworten. Lediglich die technische Funktionalität versuche ich aufrecht zu erhalten. Sollte es trotzdem was Neues hier geben, dann schreibe ich eine Info in die Telegram-Gruppe.


In der Telegram-Gruppe können Sie sich weiterhin mit anderen Lesern von Împuşcătura austauschen.

Zur Telegram-Gruppe