PDF-Formulare füllen
Dieses Skript zeigt, wie ein bestehendes PDF-Formular mit Daten aus cobra befüllt werden kann. Ohne Word, rein über den Skript-Exporter.
Anwendungsfall
Ein vorgefertigtes PDF-Formular (z.B. ein Behördenformular, Reklamationsformular, Antrag) soll automatisch mit Daten aus cobra befüllt und als ausgefülltes PDF gespeichert werden.
Konfiguration in PRINT+PLUS
-
Exporter-Typ: Skript (es wird kein Word-Dokument erzeugt)
-
Ausgangstabelle: z.B. "Fahrgastreklamation" (Präfix:
F) -
Übergeordnete Tabelle: Adressen (Präfix:
A) -
Event:
AfterLoadData -
Zusätzliche Referenzen (im Skript-Editor unter "Referenzen" hinzufügen):
DevExpress.Docs.vXX.X.dllDevExpress.Pdf.vXX.X.Core.dllDevExpress.Pdf.vXX.X.Drawing.dll
Die DLLs finden Sie im cobra-Verzeichnis in einer der folgenden Verzeichnisse (je nach Version):
- C:\Program Files\cobra\CRMPRO\Programm\Module\
- C:\Program Files\cobra\CRMPRO\Programm\Module\Extension\Addins\PrintPlus\DevExpress\
Je nach Version von cobra ist die Versionsnummer unterschiedlich.
Vollständiges Skript
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using DevExpress.Pdf;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.Common.Util;
using Ruthardt.PrintPlus.Model.Interfaces;
public class PdfFormularFuellen : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
var pdfVorlage = @"C:\Users\vm\Desktop\fahrgastrechteformular.pdf";
var pdfZiel = @"C:\Users\vm\Desktop\fahrgastrechteformular_ausgefüllt.pdf";
// Daten aus dem Current-Datensatz (Fahrgastreklamation)
var reklamation = currentContext.Data;
// Daten aus der übergeordneten Adresse
var adresse = currentContext.ParentDataByPrefix["A"];
using (var processor = new PdfDocumentProcessor())
{
// PDF laden
processor.LoadDocument(pdfVorlage);
PdfFormData formular = processor.GetFormData();
// --- Textfelder befüllen ---
var reisedatum = reklamation.GetDateValue("Reisedatum");
formular["S1F1"].Value = reisedatum.ToString("dd");
formular["S1F2"].Value = reisedatum.ToString("MM");
formular["S1F3"].Value = reisedatum.ToString("yy");
formular["S1F4"].Value = reklamation.GetStringValue("Startbahnhof");
formular["S1F7"].Value = reklamation.GetStringValue("Zielbahnhof");
// --- Checkbox befüllen ---
// Hier: Wert "Ja" aktiviert die Checkbox, "Off" deaktiviert sie. Mehr hierzu siehe unten
formular["S1F21"].Value = reklamation.GetBoolValue("Anschlusszug verpasst") ? "Ja" : "Off";
formular["S1F22"].Value = reklamation.GetStringValue("Anschlusszug verpasst am Bahnhof");
// --- Radiobutton befüllen ---
// Der Wert muss exakt dem im PDF hinterlegten Auswahlwert entsprechen
var auszahlungsart = reklamation.GetStringValue("Auszahlungsart");
formular["S1F29"].Value = auszahlungsart switch
{
"Auszahlung" => "Auszahlung oder Überweisung",
"Gutschein" => "Gutschein",
_ => "Off"
};
// --- Adressdaten befüllen ---
formular["S2F3"].Value = adresse.GetStringValue("Firma1");
formular["S2F4"].Value = adresse.GetStringValue("Nachname");
formular["S2F5"].Value = adresse.GetStringValue("Vorname");
// PDF speichern
processor.ApplyFormData(formular);
processor.SaveDocument(pdfZiel);
}
// Ausgefülltes PDF öffnen
Process.Start(pdfZiel);
printContext.Logger.Info($"PDF-Formular ausgefüllt und gespeichert: {pdfZiel}");
}
}
}
Erklärung
- PDF laden: Das leere Formular wird mit dem DevExpress
PdfDocumentProcessorgeöffnet. - Felder auslesen: Über
GetFormData()erhält man Zugriff auf alle benannten Formularfelder im PDF. - Werte setzen: Jedes Feld wird über seinen Namen angesprochen und mit dem Wert aus cobra befüllt.
- Speichern: Das ausgefüllte PDF wird als neue Datei gespeichert – die Vorlage bleibt unverändert.
Tipps: Feldnamen im PDF herausfinden
Die Feldnamen im PDF (wie S1F1, S2F3 etc.) sind vom Ersteller des PDFs festgelegt. Um diese herauszufinden:
- Adobe Acrobat Pro oder Foxit PDF Editor: Formular bearbeiten 🠪 Feldnamen werden angezeigt, oder
- Per Skript auslesen:
// Alle Formularfelder mit ihren aktuellen Werten anzeigen
var formular = processor.GetFormData();
var info = string.Join("\n", formular.Select(f => $"{f.Key} = '{f.Value}'"));
MessageBox.Show(info, "PDF-Formularfelder");
Checkboxen und Radiobuttons
Die Werte für Checkboxen/Radiobuttons sind nicht immer true/false, sondern vom PDF-Autor festgelegt (z. B. "Ja", "Yes", "1", "Choice1"). Um den korrekten Wert herauszufinden:
// Aktuellen Wert einer Checkbox/Radiobutton anzeigen
MessageBox.Show(formular["S1F21"].Value?.ToString() ?? "(leer)");
Variante: Dynamischer Dateiname
var nachname = adresse.GetStringValue("Nachname");
var datum = DateTime.Now.ToString("yyyy-MM-dd");
var pdfZiel = Path.Combine(ausgabeOrdner, $"fahrgastrechteformular_{nachname}_{datum}.pdf");