Federlesen #13: Dokumentenflut und Formatvielfalt beherrschen

Werkzeuge  –  3 Kommentare

Informationen liegen in unterschiedlichsten, kaum noch zu überblickenden Formaten vor. Wenn man schon die Dokumentenflut und Formatvielfalt nicht ganz eindämmen kann, helfen bestimmte Apache-Produkte doch, mit ihnen einfacher umzugehen und das darin schlummernde Potenzial zu wecken.

Dokumententypen wie PDF, Word oder Excel sind allgegenwärtig. Hat man die passende Softwareversion, lassen sie sich leicht betrachten oder bearbeiten. Die Probleme fangen dann an, wenn die Dokumente spezielle Funktionen oder Schriften verwenden, die eine bestimmte Anwendung oder Umgebung nicht unterstützt. Eines der einfachsten Formate scheint beispielsweise CSV zu sein, da es rein auf ASCII-Text basiert. Doch das eine CSV-Format entspricht nicht immer gleich dem anderen, obgleich es schon recht früh unter dem RFC 4180 standardisiert wurde. So werden je nach Hersteller unterschiedliche Trennzeichen oder Feld-Formate verwendet.

Das Apache-Commons-Projekt CSV unterstützt eine Vielzahl von CSV-Formatvarianten, wie MS Excel, tabulatorgetrennt, kommagetrennt und das MySQL-Export-Format. Am Beispiel der genormten IBANRUECK.csv-Datei wird im Folgenden die Verwendung der Apache-Commons-Bibliotheken CSV und Validator gezeigt.

Alle Anwender, die ihre Datenbestände noch von der alten Bankleitzahl-Kontokombination auf IBAN umstellen müssen, können ihrem Kreditinstitut eine Datei mit dem Namen IBANHIN.csv schicken. Von ihm erhalten sie dann die Datei mit korrekter IBAN und BIC-Nummer zurück. Als Nächstes liest man diese SEPA-Rückdatei ein, die als Trennzeichen ein Semikolon verwendet und die dort enthaltene IBAN-Nummer überprüft. Die CSVParser-Klasse liefert den einzelnen CSVRecord, der die IBAN-Nummer im neunten Feld enthält. Die Commons-Validator-Klasse ISBNCheckDigit validiert, ob die Prüfziffer der IBAN-Nummer korrekt berechnet wurde. Darauf sieht das angepasste Programm wie folgt aus.

CSVFormat fmt = CSVFormat.newBuilder(CSVFormat.EXCEL).withDelimiter(';')
.build();
CSVParser parser = new CSVParser(new FileReader(new File(args[0])), fmt);
List<CSVRecord> records = parser.getRecords();
ListIterator<CSVRecord> list = records.listIterator();
while (list.hasNext()) {
line = list.next();
String iBAN = line.get(9);
String Laenderkennzeichen = iBAN.substring(0, 2);
String checkcode = iBAN.substring(2, 4);
String BLZ = iBAN.substring(4, 11);
String KTONR = iBAN.substring(11, 22);
System.out.print("Line " + line.getRecordNumber() + " BIC " +
line.get(8) + " IBAN " + iBAN);
IBANCheckDigit IBANCheckDigit = new IBANCheckDigit();
System.out.println(valide " + IBANCheckDigit.isValid(iBAN));
System.out.println(Laenderkennzeichen + " " + checkcode + " " +
BLZ + " " + KTONR);
}

Darüber hinaus enthält Commons Validator noch weitere nützliche Überprüfungsklassen für ISBN-Nummern, E-Mail-Adressen oder korrekte URLs.

String string = "978-3-89864-517-1";
string = string.replace("-", "");
ISBNCheckDigit ISBNnumber = new ISBNCheckDigit();
System.out.println("ISBNnumber is " + ISBNnumber.isValid(string));
System.out
.println("check digit= "
+ ISBNnumber.calculate(string.substring(0,
string.length() - 1)));
System.out.println("E-Mail is "
+ EmailValidator.getInstance().isValid("info@heise.de"));
String domain = "www.heise.de";
System.out.println("Domain is "
+ DomainValidator.getInstance().isValid(domain));

System.out.println("URL is "
+ UrlValidator.getInstance().isValid("http://" + domain));

Maßgeschneidert für die Microsoft-Welt

Um Dateien im Format von Microsoft Office 97 bis 2008 wie Word und Excel mit Java zu verarbeiten, ist die Bibliothek Apache POI, was für "Poor Obfuscation Implementation" steht, hilfreich. Die Bibliothek war so erfolgreich, dass Microsoft seine Dateiformate offen legte, was die Kompatibilität und die Office-Dokumente unterstützenden Funktionen von POI erheblich verbesserte. Neben Microsofts altem OLE2-Format (OLE 2 Compound Document) wird deshalb der Standard Office Open XML (OOXML) von Office 2007 und 2008 gut unterstützt.

Da für einige Office-Formate fertig ausführbare Beispiele mitgeliefert werden, klappt der Einstieg schnell. So lässt sich ein Jahreskalender calendar.xlsx mit dem Aufruf org.apache.poi.ss.examples.CalendarDemo erstellen. Diese Datei kann man wiederum gut verwenden, um sie mit POI in Formate wie HTML, CSV oder PDF zu konvertieren:

org.apache.poi.ss.examples.html.ToHtml calendar.xlsx calendar.html
java org.apache.poi.ss.examples.ToCSV calendar.xlsx out

Das PDF-Format ist seit dem 15. Juni 2013 20 Jahre alt und seit 2008 als ISO-Standard (ISO 32000) anerkannt. Es ist schon lange als portables Dokumentenformat zum Austausch elektronischer Dokumente über die Grenzen unterschiedlicher Betriebssysteme und Plattformen hinweg beliebt. Für das Erstellen, den Druck und die Bearbeitung oder Verschlüsselung von PDF-Dateien gibt es Apache PDFBox. Hiermit lassen sich die Grundfunktionen mit java -jar pdfbox-app-1.8.2.jar direkt auf der Kommandozeile anzeigen.

Mit der von Atos Origin an PDFBox gespendeten Preflight-Bibliothek kann man zudem überprüfen, ob ein PDF-Dokument dem PDF/A-1b-Standard ISO 19005-1:2005 zur Langzeitarchivierung digitaler Dokumente genügt.

Natürliche Verwandtschaft

Eine andere Möglichkeit, das OpenOffice-Format zu verarbeiten, bietet Apache OpenOffice an, das bald in der lang erwarteten Version 4 erscheint. Wer das nicht manuell über die Oberfläche machen möchte, kann das Format auch als Server starten:

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"

Für die Kommunikation mit dem OpenOffice-Server gibt es für mehrere Programmiersprachen Clients, die das CORBA-ähnliche UNO-Protokoll (Universal Network Objects) unterstützen. Für Java hat sich der JODConverter bewährt, den Produkte wie Alfresco, Drupal, Liferay Portal oder OpenMeetings nutzen. Ihn ruft man mit java -jar lib/jodconverter-core-3.0-beta-4.jar test.odt test.pdf auf, um einen Open Document Text (.odt) nach PDF umzuwandeln.

Es werden jedoch auch die Konvertierungen von OpenOffice-Formaten in Microsoft Office in beide
Richtungen unterstützt (Open Document Text (.odt) in Word (.doc), Open Document Spreadsheet (.ods) in Excel (.xls), Open Document Presentation (.odp) in PowerPoint (.ppt). Daraus lassen sich wiederum die Formate PDF, RTF oder WordPerfect erstellen. Außerdem können alle Formate mit Einschränkungen als HTML erzeugt werden.

Mit dem seit 2011 im Apache Incubator befindlichen ODF Toolkit können Entwickler mit Java Open-Document-Formate auch ohne eine OpenOffice-Installation erstellen oder verändern. Über die Simple Java API for ODF oder die Open Document API (ODFDOM) können sie die Verarbeitung von ODF-Dokumenten außerdem leicht automatisieren.

Ein nützliches Werkzeug ist zudem der ODF Validator, mit dem Entwickler die XML-basierten ODF-Dateien auf ISO/IEC-26300-Konformität überprüfen können. Dazu installieren sie die Datei odfvalidator-1.1.6-incubating.war in Tomcat als Webanwendung. Diese ruft man mit http://localhost:8080/odfvalidator-1.1.6-incubating/ auf. Nach dem Hochladen eines zu prüfenden Dokuments erhält man einen Prüfbericht mit den jeweiligen Abweichungen.