OpenOffice Draw + XForms Export + iText = PDF

Für unseren Seminarbetrieb erstellen wir nach dem Seminarabschluss aus einer XML-Datei die Rechnung und Zertifikate für den Kunden. Die Vorlagen sind in OpenOffice verfasst und können ohne Probleme verändert werden. Ein großer Vorteil ist weiterhin, dass OO einen PDF Exporter mitbringt.

Der Nachteil der Lösung, OpenOffice für die PDF-Erzeugung fernzusteuern ist, dass es sehr schwergewichtig. OO muss installiert und gestartet werden. Das ist auf einem Server, etwa einem einfachen Servlet-Container oder sogar der Google App Engine for Java natürlich nicht denkbar.

Ein anderer Weg ist daher, zwar weiterhin OpenOffice für die Erstellung einer Vorlage zu verwenden, aber beim PDF-Export anders vorzugehen. Die Lösungen können Acrobat Forms (Acroforms) bieten, also eigentlich interaktive Felder, die man später über ein Programm füllen kann. Im ersten Schritt erzeugt man daher mit OpenOffice Draw eine Formular. (Das wird etwa beschrieben unter http://www.devx.com/opensource/Article/38178/.) Dann exportiert man das Dokument in PDF unter Erhaltung der Formulareigenschaften. Dieses PDF lässt sich nun mit iText auslesen, die Formularzellen füllen und wieder als PDF schreiben. Dabei kann die “Formulareigenschaft” wegfallen, dass man später bei dem PDF-Dokument nichts mehr von interaktiven Elementen sieht.

import java.io.FileOutputStream;
import com.lowagie.text.pdf.*;

public class FillInPdfForm
{
  public static void main(String[] args) throws Exception
  {
    PdfReader reader = new PdfReader(„c:/rein.pdf“);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(„c:/raus.pdf“));
    BaseFont font = BaseFont.createFont(„c:\\windows\\fonts\\Calibri.ttf“, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    AcroFields form = stamper.getAcroFields();
    for( Object o : reader.getAcroForm().getFields() )
      form.setFieldProperty( ((PRAcroForm.FieldInformation) o).getName(), „textfont“, font, null);
    form.setField(„name“, „Christian Ullenboom“);
    form.setField(„content“, „Brav sein\nLieb sein“);
    stamper.setFormFlattening(true);
    stamper.close();
  }
}

Etwas lästig ist, dass beim Ausfüllen der in OO zugewiesen Font flöten geht. Daher muss man diesen neu zuweisen. Sonst ist es Arial/Helvetica.

Über Christian Ullenboom

Ich bin Christian Ullenboom und Autor der Bücher ›Java ist auch eine Insel. Einführung, Ausbildung, Praxis‹ und ›Java SE 8 Standard-Bibliothek. Das Handbuch für Java-Entwickler‹. Seit 1997 berate ich Unternehmen im Einsatz von Java. Sun ernannte mich 2005 zum ›Java-Champion‹.

3 thoughts on “OpenOffice Draw + XForms Export + iText = PDF

  1. Erst mal vielen Dank für die Inspiration.
    Ich stehe genau vor dem Problem, dass ich ein Word Layout bekommen habe und mit meiner Software eine PDF erstellen muss, die genau wie die Vorlage aussehen muss. Ich sitze schon ne weile dran aber bekomme es nicht hin. Wenn ich mir die iText examples anschaue funktioniert das genauso wie du es auch beschreibst aber wenn ich meine eigene xForm benutze klappt gar nix.
    Ich mache wohl irgendwas falsch mit OO Writer beim PDF erstellen.
    Ich erstelle ein neues „XML-Formulardokument“ und füge nur ein Textfeld ein und nenne es „name“. Mache „Exportieren nach PDF“ (muss ich da speziellen Einstellungen machen?) Führe dann dein Java Programm aus und siehe da… nix ist passiert. Die Datei raus.pdf wurde erstellt aber sieht genauso aus wie meine rein.pdf (das Textfeld wurde nicht gefüllt)

    Was mache ich falsch?

Schreibe einen Kommentar

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