← Java

Java · 11 / 18

CSV lesen und PDF-Formulare befüllen

Du liest strukturierte CSV-Felder und setzt einen AcroForm-Wert mit PDFBox.

  • Mittel
  • Fortgeschritten
  • 45 min

Voraussetzungen: Maven, Module und Ports/Adapters

Ein PDF ist nicht automatisch ein Formular. AcroForm enthält benannte Felder, die gesetzt werden können. Eine CSV-Datei liefert Zeilen mit Spalten. Ein Mapping verbindet einen PDF-Feldnamen mit einer CSV-Spalte. Unser Beispiel erzeugt ein sicheres Formular selbst und füllt recipient aus name. So brauchst du kein privates Dokument zum Lernen.

01Parser und PDFBox vorbereiten

Speichere die zwei Beispieldateien in einem neuen Maven-Lernprojekt. Die Versionen entsprechen der geprüften PDF-Codebasis. Commons CSV behandelt CSV-Felder korrekt. String.split(",") wäre bei Zitaten und eingebetteten Trennzeichen falsch.

pom.xml · xmlDatei öffnen
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>
  <groupId>example</groupId><artifactId>learning</artifactId><version>1.0</version>
  <properties><maven.compiler.release>21</maven.compiler.release><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
  <dependencies><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.8</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.14.1</version></dependency></dependencies>
  <build><plugins>
    <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.14.1</version></plugin>
    <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.5.3</version></plugin>
  </plugins></build>
</project>

Starten / prüfen

mvn package dependency:copy-dependencies
java -cp "target/classes:target/dependency/*" tutorial.Main

02Ein Formularfeld anlegen

PDAcroForm enthält die Felddefinitionen. PDTextField besitzt einen PartialName. Das Widget beschreibt seine sichtbare Position auf einer Seite. Die Standardschrift und Default Appearance machen den Feldwert sichtbar. Das sind verschiedene Aufgaben innerhalb des PDF-Modells.

src/main/java/tutorial/Main.java · javaDatei öffnen
package tutorial;
import java.io.StringReader;
import java.io.File;
import org.apache.commons.csv.CSVFormat;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDTextField;
import org.apache.pdfbox.cos.COSName;
public class Main {
  public static void main(String[] args) throws Exception {
    var format = CSVFormat.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).get();
    try (var csv = format.parse(new StringReader("name\nAda\n"));
         var document = new PDDocument()) {
      var page = new PDPage(); document.addPage(page);
      var form = new PDAcroForm(document);
      document.getDocumentCatalog().setAcroForm(form);
      var resources = new PDResources();
      resources.put(COSName.getPDFName("Helv"), new PDType1Font(Standard14Fonts.FontName.HELVETICA));
      form.setDefaultResources(resources); form.setDefaultAppearance("/Helv 12 Tf 0 g");
      var field = new PDTextField(form); field.setPartialName("recipient");
      var widget = field.getWidgets().getFirst();
      widget.setRectangle(new PDRectangle(40, 700, 250, 30)); widget.setPage(page);
      page.getAnnotations().add(widget); form.getFields().add(field);
      field.setValue(csv.iterator().next().get("name"));
      document.save(new File("result.pdf"));
      System.out.println("result.pdf: recipient = Ada");
    }
  }
}

03Spalten und Felder zuordnen

get("name") liest die benannte CSV-Spalte. setValue schreibt den bestätigten Wert in das PDF-Feld. Die echte Engine prüft zuvor, ob die Spalte und das Feld existieren und ob der Wert zur Feldart passt. Checkboxen benötigen andere Regeln als Textfelder.

04Semantisch statt binär prüfen

Öffne result.pdf und prüfe Ada. Im nächsten Testtutorial lesen wir den Feldwert wieder mit PDFBox aus. Zwei PDFs können binär verschieden sein und dennoch dieselben fachlichen Inhalte haben. Die Prüfung sollte die erwartete Bedeutung kontrollieren.

Erwartetes Ergebnis

Eine Seite mit einem sichtbaren Formularfeld recipient und Wert Ada.

Deine Übung

Ändere den CSV-Wert auf "Ada, Lovelace" mit korrekter CSV-Quotierung.

Lösung mit Erklärung anzeigen

Die Datenzeile lautet "Ada, Lovelace" inklusive CSV-Anführungszeichen. Innerhalb des Java-Strings müssen diese escaped werden. Commons CSV liefert weiterhin einen einzigen Feldwert. Der PDF-Text enthält das Komma.

Projektbezug und Quellen

Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.