Einlesen von Dokumentdaten

Beispiele zur Reader API

Beispiel 7.1. Einfaches Lesen

In diesem Beispiel wird das Einlesen eines Datenstroms mit der Reader API gezeigt. Der Einlesevorgang findet auf jenem Thread statt, von dem aus die Methode aufgerufen wird. Mit Rückkehr aus der Methode ist der Lesevorgang vollständig abgeschlossen.

Document readDocumentFromStream(InputStream inputStream) throws IOException, JadiceException {
  Reader reader = new Reader();
  reader.read(inputStream);
  reader.complete();
  return reader.getDocument();
}

Beispiel 7.2. Dokument und Annotationen gemeinsam lesen

In diesem Beispiel wird gezeigt, wie zusätzlich zu einem Haupt-Datenstrom auch Annotationen eingelesen werden können. Diese werden im Annotations-Layer auf den bereits existierenden Seiten abgelegt. Weitere Informationen zum Einlesen von Annotationsdaten gibt die Annotations-Dokumentation unter Kapitel 3, Laden / Speichern von Annotationen.

Document readDocumentAndAnnotations(InputStream documentStream, InputStream annotationStream)
    throws IOException, JadiceException {
  Reader reader = new Reader();
  reader.read(documentStream);

  Format annotationFormat = …;
  reader.setFormat(annotationFormat);
  reader.setTargetIndex(0);
  reader.read(annotationStream);

  reader.complete();
  return reader.getDocument();
}

Beispiel 7.3. Nutzung eines Dokuments während des Ladevorgangs

In diesem Beispiel gezeigt wie ein Dokument, noch während der Ladevorgang läuft, bereits zur Anzeige in einer PageView eingesetzt werden kann. Mit zunehmendem Fortschritt des Ladevorgangs werden dem Dokument weitere Seiten hinzugefügt. Der Lesevorgang kann auf einem beliebigen Thread stattfinden. Die Interaktion mit der Seitenanzeige muss auf dem Swing Event Dispatch Thread erfolgen.[83]

Document readAndDisplay(InputStream inputStream, final PageView pageView) throws IOException, JadiceException {
  final Reader reader = new Reader();
  final Document document = reader.getDocument();
  TGASwingUtil.invokeLater(new Runnable() {
    @Override
    public void run() {
      pageView.setDocument(document);
    }
  });
  reader.read(inputStream);
  reader.complete();
  return document;
}

Beispiel 7.4. Abbruch eines Ladevorgangs anfordern

In diesem Beispiel wird skizziert, wie dem Nutzer die Möglichkeit gegeben werden kann, einen laufenden Lesevorgang abzubrechen. Dazu könnte beispielsweise in der Methode wireCancelerToCancelButton(…) die Canceler Instanz mit einem ›Abbrechen‹ Button in der grafischen Benutzeroberfläche verknüpft werden. Nachdem der Lesevorgang des ersten Datenstroms abgeschlossen ist, wird der zweite nur dann eingelesen, wenn noch kein Abbruch angefordert wurde. Da das Dokument bereits während des Lesevorgangs in einer PageView angezeigt wird, wird es zum Schluss daraus wieder entfernt falls ein Abbruch angefordert wurde.

void readWithCancelation(InputStream inputStream1, InputStream inputStream2, PageView pageView)
    throws IOException, JadiceException {
  Reader reader = new Reader();
  
  final Canceler canceler = reader.getCanceler();
  wireCancelerToCancelButton(canceler);

  final Document document = reader.getDocument();
  displayDocument(document, pageView);

  boolean readFullyPerformed = reader.read(inputStream1);
  if (readFullyPerformed) {
    reader.read(inputStream2);
  }

  reader.complete();

  if (canceler.isCancelationRequested()) {
    displayDocument(null, pageView);
  }
}

private void wireCancelerToCancelButton(Canceler canceler) {
  …
}

private void displayDocument(final Document document, final PageView pageView) {
  TGASwingUtil.invokeLater(new Runnable() {
    @Override
    public void run() {
      pageView.setDocument(document);
    }
  });
}

Beispiel 7.5. Beispielhafte Umsetzung: Abbruch von Lesevorgängen

Die Klasse CancelableReaderTask zeigt die vollständige Umsetzung eines Lese-Tasks, der abgebrochen werden kann. Die Klasse kann als Basis für integrationsspezifische Anpassungen verwendet werden.


Beispiele zur Fluent Read API

Beispiel 7.6. Einfaches Lesen

In diesem Beispiel wird das Einlesen zweier Datenströme mit der Fluent Read API gezeigt.

InputStream inputStream1 = …;
InputStream inputStream2 = …;

SyncReadConfigurer configurer = Read.synchronously();
configurer.newDocument().append(inputStream1).append(inputStream2);
configurer.execute();

Document document = configurer.getFirstDocument();

Beispiel 7.7. Wiederverwendbarkeit durch Verwenden einer ReadConfiguration

In diesem Beispiel wird gezeigt, wie die Logik zum Einlesen von Dokumentdaten wiederverwendbar gestaltet werden kann indem eine ReadConfiguration implementiert wird.

Document readDocument() throws JadiceException, IOException {
  SyncReadConfigurer configurer = Read.synchronously();
  configurer.add(new ExampleReadConfiguration());
  configurer.execute();
  return configurer.getFirstDocument();
}

class ExampleReadConfiguration extends ReadConfiguration {
  @Override
  protected void doConfigure() {
    String id = …;
    newDocument().appendGroup()
        .add(task(getContentInputStream(id)))
        .add(task(getAnnotationsInputStream(id)).mapDefaultLayer().toAnnotationsLayer());
  }

  private InputStream getContentInputStream(String id) {
    return …;
  }

  private InputStream getAnnotationsInputStream(String id) {
    return …;
  }
}



[83] Die Klasse TGASwingUtil wird verwendet um Arbeit auf dem Event Dispatch Thread auszuführen. Nähere Details gibt „Arbeit mit Swing und TGASwingUtil.

[jadice document platform Version 5.5.12.1: Dokumentation für Entwickler. Veröffentlicht: 2021-08-17]