Formaterkennung mit Hilfe des filetype-analyzers im JWT
- Daniela Gehle
- David Werth
Dieser Artikel beschreibt Möglichkeiten der Formaterkennung mit Mitteln der jadice document platform und der Open-Source-Library filetype-analyzer von levigo.
Motivation
In manchen Anwendungsfällen ist es sinnvoll, eine Formaterkennung im jadice web toolkit durchzuführen, um unterschiedliche Dokument- bzw. Dateiformate unterschiedlich zu behandeln.
Beispielsweise kann es sein, dass im Archiv Dokumente in Office-Formaten abgelegt sind und zum Download angeboten werden sollen. Oder es sind Video- und Audiodateien abgelegt, die nicht im jadice web toolkit, sondern direkt im Browser zur Anzeige gebracht werden sollen (siehe hierzu auch Videos im jadice web toolkit).
Lösungsstrategie
Die grundsätzliche Herangehensweise ist dabei wie folgt:
- Im
DocumentDataProvider
vor dem Lesevorgang ein Formaterkennung durchführen. (Hier gibt es mehrere Möglichkeiten, Details siehe unten.) - Die über den jadice viewer anzuzeigenden Formate (z.B. TIFF, PDF) werden weiterhin über den
Reader
der jadice document platform eingelesen. Hierzu setzt man demReader
vor dem Lesevorgang das erkannte Format überreader.setFormat()
. Dort gibt man das Format an, mit dem der Lesevorgang ausgeführt werden soll. (Wenn man dortnull
setzt, erkennt jadice das Format automatisch, das wollen wir hier aber explizit nicht). - Die ausgesteuerten Formate (also z.B. Audio- und Videodateien) werden im Anschluss anders gehandhabt - wie genau, bleibt der Integration überlassen.
- Dadurch, dass man dem Reader explizit vor dem Lesevorgang das Format setzt, hat man keine nennenswerten Performanceeinbußen, weil die Formaterkennung dann vom Reader nicht mehr durchgeführt werden muss und dort Erkennungszeit eingespart wird. (Die typische Erkennungszeit liegt bei <100ms pro Dokument)
Umsetzung
Für die Formaterkennung gibt es verschiedene Möglichkeiten, von denen hier nur zwei genannt werden sollen:
1. Verwendung des filetype-analyzer
Der filtetype-analyzer (Github: https://github.com/levigo/filetype-analyzer) ist ein Open-Source-Projekt von levigo und ein mächtiges Werkzeug zur Analyse von Dateiformaten.
Schritt 1: Dependency für den filetype-analyzer In die pom.xml einhängen
<dependency> <groupId>org.jadice.filetype</groupId> <artifactId>analyzer</artifactId> <version>1.3.0</version> </dependency>
Schritt 2: Formaterkennung
import org.jadice.filetype.Analyzer; ... seekableInputStream.seek(0); Map<String, Object> results = Analyzer.getInstance("/magic.xml").analyze(sis); String detectedMimeType = (String) results.get(MimeTypeAction.KEY);
Im einfachsten Fall kann man die Formatdefinitionen der im Artefakt enthaltenen Steuerungsdatei
magic.xml
verwenden. Es lohnt sich unter Umständen jedoch, je nach Anforderungen an die zu erkennenden Formate und deren Häufigkeit, eine eigene Steuerdatei zu erstellen.
- Schritt 3: Format im Reader setzen
Das erkannte Format vor dem Lesevorgang dem
Reader
überreader.setFormat()
setzen:import javax.activation.MimeType; import com.levigo.jadice.document.FormatRegistry; ... Format detected = FormatRegistry.getFormat(new MimeType(detectedMimeType)); if (<von jadice unterstütztes Dokumentformat, also PDF, TIFF usw.>) { reader.setFormat(detected); reader.setTargetIndex(0); reader.read(sis); } else { // mach irgendwas mit Video/Audio}
2. Eigenes jadice-Format für die Audio/Video-Dateien implementieren
- Schritt 1: entfällt, da die nötigen Klassen Bestandteil des jadice-core sind
- Schritt 2: Format implementieren, erkennen lassen und setzen
- Hierzu erweitert man die Klasse
Format
und legt eine Ressource namensMETA-INF/services/com.levigo.jadice.document.Format
an, die die Namen der Implementierungsklassen enthält. - Die Reihenfolge der Erkennung richtet sich nach der
Priority
des Formats - hier also eine möglichst kleine Prio setzen, damit die Audios/Videos erst nach den gängigen Dokumentformaten verprobt werden. Im DocumentDataProvider anschließend die Formaterkennung ausführen
Format detectedFormat = FormatRegistry.detectFileFormat(stream);
- Hierzu erweitert man die Klasse
- Schritt 3: Format setzen
Auch hier wird genau wie bei 1. dem Reader das erkannte Format mittels
reader.setFormat()
vor dem Lesevorgang gesetzt.if (<von jadice unterstütztes Dokumentformat, also PDF, Tiff usw.>) { reader.setFormat(detectedFormat); reader.setTargetIndex(0); reader.read(sis); } else { // mach irgendwas mit Video/Audio}
Ausblick
Selbstverständlich kann der filetype-analyzer auch losgelöst von der jadice document platform in Projekten genutzt werden.
Auch können die beiden genannten Wege der Formaterkennung grundsätzlich auch in anderen jadice-Produkten genutzt werden, beispielsweise im jadice Swing Viewer. Der jadice server selbst hat mit dem StreamAnalysisWorker
bereits einen Formaterkennungs-Worker an Bord.