PDF-Formular generieren

  Ralf Hersel   Lesezeit: 3 Minuten  🗪 1 Kommentar

Ein ausfüllbares PDF-Formular selbst generieren.

pdf-formular generieren

Das Erstellen von ausfüllbaren PDF-Formularen war für mich immer ein Buch mit sieben Siegeln. Natürlich gibt es diverse Cloud-Dienste, mit denen man Formulare malen kann und anschliessend eine PDF-Datei erhält. Aber solche Services möchte ich lieber nicht verwenden. Man kann die Aufgabe auch mit TeX erledigen, wobei ich mich immer vor der steilen Lernkurve gescheut habe. Auch LibreOffice Writer bietet einen Formularmodus mit anschliessendem Export im PDF-Format. Das Erstellen von Formularen finde ich ziemlich nervig und gefällt mir gar nicht.

Dann kam ich auf den Gedanken, dass sich ein solches Formular auch mit einfachen Mitteln generieren lassen müsste. Dabei bin ich auf die Python-Bibliothek ReportLab gestossen. Die Produkte dieser Firma sind proprietär, aber die Bibliothek steht unter der BSD-Lizenz und ist bei Manjaro standardmässig installiert.

Die Möglichkeiten der ReportLab-Bibliothek zu erläutern würden den Rahmen dieses Artikels bei weitem sprengen, weshalb ich mich auf ein paar Basics beschränke. Bevor ihr ein eigenes Formular generiert, könnt ihr im Terminal prüfen, ob die Library bereits installiert ist: pip list | grep reportlab. Falls das noch nicht der Fall sein sollte, hilft: pip install reportlab

Bevor ich zeige, wie es geht, zeige ich zuerst mein bescheidenes Ergebnis. So sieht die PDF-Datei aus:

Und hier ist der Python-Code dafür:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

w, h = A4
c = canvas.Canvas("beispiel.pdf", pagesize=A4)
c.drawString(30, 800, "Das ist der Titel auf 30,800")
c.line(30, 780, 500, 780)
c.drawString(30, 750, "Ein Text auf 30,750")
c.drawString(30, 700, "Noch ein Text auf 30,700")

c.drawString(30, 630, "Jetzt kommt ein ausfüllbares Formular:")
c.rect(25, 550, width=300, height=100, stroke=1, fill=0)
c.drawString(30, 600, "Vorname:")
c.acroForm.textfield(name='tf1', x=100, y=597, width=100, height=15)
c.drawString(30, 570, "Nachname:")
c.acroForm.textfield(name='tf2', x=100, y=567, width=100, height=15)

text = c.beginText(30, 500)
text.setFont("Times-Roman", 12)
text.textLine("Hello world!")
text.textLine("From ReportLab and Python!")
text.textLines("Es funktionier auch\nmit einem String.\nGNU/Linux.ch ist toll!")
c.drawText(text)

c.showPage()
c.save()  

Viel erklären muss man bei diesem Beispiel nicht. Zuerst wird die Library geladen, wobei man direkt das Papierformat angibt. Dieses Tupel enthält die Breite und Höhe (w, h) des Zeichenblatts (canvas). Bei A4 sind das 595.2 mal 841.8 Punkte, wobei ein Punkt 1/72 Inch gross ist. Es ist wichtig zu wissen, dass der Nullpunkt links unten auf der Seite liegt (wie man das vom kartesischen Koordinatensystem kennt).

Das Beispiel zeigt nur das Formular-Feld textfield. Selbstverständlich unterstützt die Bibliothek auch alle anderen Feldtypen, sowie alle Elemente, die man ausserdem gerne auf dem PDF sehen möchte, Bilder, Links, Tabellen, usw. Das Beispiel liesse sich derart ausbauen, dass die Formular-Felder per Konfigurationsdatei geliefert und die xy-Positionen alle automatisch berechnet werden.

Quellen:

Tags

PDF, Formular, Python, reportlab

Robert
Geschrieben von Robert am 8. Februar 2023 um 11:48

Das Erstellen von ausfüllbaren PDF-Formularen war für dich immer ein Buch mit sieben Siegeln? Das ist wirklich nicht böse gemeint, aber wenn ich mir diesen Python-Code ansehe, dann sind das IMHO plötzlich neun oder gar noch viel mehr Siegel. Wenn du das Erstellen von Formularen ziemlich nervig findest, wo genau ist denn hier jetzt der Vorteil?