Formaterkennung mit Hilfe des filetype-analyzers im JWT

Stand 06.07.2020, jadice web toolkit 5.10.38.8

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 dem Reader vor dem Lesevorgang das erkannte Format über reader.setFormat(). Dort gibt man das Format an, mit dem der Lesevorgang ausgeführt werden soll. (Wenn man dort null 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-analyzerist 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 über reader.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 namens META-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);
  • 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.