Federlesen #13: Dokumentenflut und Formatvielfalt beherrschen

Seite 2: Extraktion, Komprimierung

Inhaltsverzeichnis

Das Umwandeln einer Text-Datei nach PDF und wieder zurück geht einfach. So lässt sich mit

java -jar pdfbox-app-1.8.2.jar TextToPDF calendar.pdf calendar.csv

aus der oben erstellten calendar.csv-Datei eine neue PDF-Datei erstellen. Ebenso schlicht kann man aus der gerade erstellten PDF-Datei wieder Text extrahieren.

java -jar pdfbox-app-1.8.2.jar ExtractText calendar.pdf

Der folgende Beispielcode zeigt, wie man den Text aus einer PDF-Datei extrahiert.

File input = new File(" calendar.pdf"); 
File output = new File("calendar.txt");
pd = PDDocument.load(input);
PDFTextStripper stripper = new PDFTextStripper();
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(output)));
stripper.writeText(pd, wr);
pd.close();
wr.close();

Den größten Werkzeugkasten zur Extraktion von Texten und zum Auslesen von Formaten bietet Tika, das auch die Apache-Suchprojekte Lucene und Solr zur Verschlagwortung solcher Dokumente verwenden.

Das Thema Kompression bleibt in der Datenverarbeitung gerade bei Big Data wichtig. Die Entscheidung für den passenden Kompressionsalgorithmus hängt von der Lizenz, der Kompressionsrate, von CPU- und Hauptspeicherverbrauch oder der Pack- oder Entpackgeschwindigkeit ab.

Java unterstützt seit dem JDK 1.1 mit dem java.util.zip-Paket die Formte ZIP und GZIP. Das von Anfang an verwendete JAR-Format (Java Archive) funktioniert seit dem JDK 1.2 durch das Paket java.util.jar. Seit Java 5 lässt sich eine JAR-Datei auch mit dem Pack200-Format komprimieren. Für die Verarbeitung der Formate JAR und PACK.gz liefert das JDK die Werkzeuge jar und pack200 mit. Trotzdem war das Verarbeiten von ZIP-Dateien in Java lange kein Vergnügen, und erst mit dem im JDK 7 mitgelieferten Zip File System Provider und der neuen NIO.2 API geht es etwas komfortabler.

Apache Commons Compress unterstützt schon länger verschiedene Kompressionsformate. Die Unterstützung für bzip2, tar und zip kam ursprünglich aus den Projekten Apache Ant und Excalibur, einem Unterprojekt von Apache Avalon. Die für das cpio-Format steuerte das jRPM-Projekt bei. Über einen Wrapper zu java.util kann man auch mit den Formaten GZIP, JAR und Pack200 arbeiten.

Hier findet man Beispiele zur Verwendung der API. Gerade beim Einsatz von Apache Commons auf dem Server sind die Informationen im Javadoc zu beachten, um keine bösen Überraschungen zu erleben, da einige Methoden nicht Thread-sicher sind.

Auf die einfachste Art kann man sich mit Apache Commons den Inhalt einer Archivdatei via java -jar commons-compress-1.5.jar commons-compress-1.5.jar anzeigen lassen. Anders als beim JDK-Werkzeug (jar) geht das nicht nur für das JAR-Format.

Im Bereich Big Data hilft Kompression dabei, große Datenmengen effizient zu verarbeiten und zu speichern. Das MapReduce-Framework Apache Hadoop wird zur skalierbaren und verteilten Verarbeitung großer Datenmengen verwendet. Deswegen gibt es gerade hier einen größeren Bedarf an optimaler Komprimierung. Für sein hochverfügbares und verteiltes Hadoop Distributed File System (HDFS) werden deshalb verschiedene Kompressionsalgorithmen unterstützt. Standard ist hier org.apache.hadoop.io.compress.DefaultCodec. Es werden jedoch auch org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec und der LZO-Datenkompressionsalgorithmus (Lempel-Ziv-Oberhumer) com.hadoop.compression.lzo.LzopCodec unterstützt. Die LZO-Bibliothek ist jedoch, da sie unter der GPLv3 steht, separat herunterzuladen.

Eine Unterstützung für das ZIP-Format ist zwar schon länger gewünscht, aber immer noch nicht möglich.

Apache bietet für die Konvertierung unterschiedlicher Formate verschiedene Möglichkeiten an. Damit wird es vor allem für Java-Entwickler einfacher, auf proprietäre Formate von Microsoft Office zuzugreifen. Die Format- und Dokumentenvielfalt wird Entwickler auch in Zukunft begleiten, sodass es eine Erleichterung ist, dass die Apache-Community kostenlose Produkte zu deren Verarbeitung zur Verfügung stellt.

Frank Pientka
ist Senior Software Architect bei der Materna GmbH in Dortmund.
(ane)