Direkt zum Hauptinhalt

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.dll
    • DevExpress.Pdf.vXX.X.Core.dll
    • DevExpress.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

  1. PDF laden: Das leere Formular wird mit dem DevExpress PdfDocumentProcessor geöffnet.
  2. Felder auslesen: Über GetFormData() erhält man Zugriff auf alle benannten Formularfelder im PDF.
  3. Werte setzen: Jedes Feld wird über seinen Namen angesprochen und mit dem Wert aus cobra befüllt.
  4. 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 S1F1S2F3 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");