Dauerhafte Verankerung von Annotationen mit jadice server

Dauerhafte Verankerung von Annotationen (jadice server 5)

Um Dokumente und deren Annotationen mit Standardprogrammen anzeigen zu können, müssen diese als "normale" Objekte im Ausgangsformat verankert werden.
Dies kann mit jadice server 5 über den ReshapeNode realisiert werden. Die notwendige Assoziation zwischen dem Dokument- und den Annotationsdatenströmen zeigt das folgende Beispiel:

Dauerhafte Verankerung von Annotationen
// Beispiel-Interface zur Bündelung von Dokument und Annotationen
interface DocumentAndAnnotations {
  InputStream getContent();

  List<InputStream> getAnnotations();
}

public void convert(DocumentAndAnnotations doc) throws Exception {
  Job job = ...;

  // Nodes erstellen
  StreamInputNode inputNode = new StreamInputNode();
  ReshapeNode reshapeNode = new ReshapeNode();
  StreamOutputNode outputNode = new StreamOutputNode();
  // Konfiguration des Ergebnis-Typs (z.B. PDF)
  reshapeNode.setTargetMimeType("application/pdf");
  reshapeNode.setOutputMode(OutputMode.ASSOCIATED_STREAM);

  // Workflow zusammenstellen
  job.attach(inputNode.appendSuccessor(reshapeNode).appendSuccessor(outputNode));
  job.submit();

  // Sende Dokument-Inhalt // (hier mit explizitem Mime-Type)
  final StreamDescriptor contentSD = new StreamDescriptor("application/pdf");
  inputNode.addStream(doc.getContent(), contentSD);

  // Verarbeitung der Annotationen:
  for (InputStream annoStream : doc.getAnnotations()) {
    StreamDescriptor annoSD = new StreamDescriptor();

    // Assoziation zw. Dokument und Annotation:
    annoSD.setParent(contentSD);
    // Setzen des Annotationstyps (z.B. Filenet P8):
    annoSD.setMimeType(ReshapeNode.AnnotationMimeTypes.FILENET_P8);
    // Senden des Annotationsdatenstroms
    inputNode.addStream(annoStream, annoSD);
  }
  inputNode.complete();
  // Nicht gezeigt: Verarbeitung des Ergebnisses
  // ...
}

In dieser Konfiguration sind zwei Einstellungen besonders relevant:
Dokument- und Annotationsdatenströme müssen über die StreamDescriptor-Hierarchie miteinander verknüpft werden. Dazu muss der StreamDescriptor des Dokuments als Parent der StreamDescriptoren der Annotationen gesetzt werden.
Für die verfügbaren MIME-Types von Annotationen gibt es in der Klasse ReshapeNode als vordefinierte Konstanten, die zwingend gesetzt werden müssen. Weitere Informationen über die Annotationsformate und deren Eigenschaften können Sie dem Annotationshandbuch der jadice document platform entnehmen.

Hinweis zu jadice server 4

Der hier beschriebene Workflow kann auch mit jadice server 4 verwendet werden. Hierzu ist die Klasse ReshapeNode durch JadiceShaperNode zu ersetzen. Nicht-sichtbare Informationen entfallen jedoch, vgl. folgender Abschnitt.

 

Beibehalten von nicht-sichtbaren Informationen des Ursprungsdokuments (jadice server 4)

Hinweis zu jadice server 5

Werden PDF-Dokument- und Annotationsdatenströme über den ReshapeNode von jadice server 5 in einem Dokument verankert, so werden nicht-sichtbare Inhalte in Zieldokument beibehalten.
Der hier beschriebene Workflow ist somit nicht notwendig.

Oft ist es beim Verarbeiten von PDF-Dokumenten wünschenswert, dass diese auch Inhalte, die nicht sichtbar sind, beibehalten. Dies können z.B. OCR-Informationen sein. Bei obigen Ansatz über die Verarbeitung des JadiceShaperNodes von jadice server 4 werden diese jedoch verworfen, da das komplette Dokument neu gerendert wird.

Um dies zu vermeiden, werden die Annotationen zunächst mit dem JadiceShaperNode über das PDF gerendert. Für die korrekte Positionierung wird das PDF zwar dem JadiceShaperNode übergeben, aber das Rendering mit der Methode shaperNode.getSettings(BaseShaperSettings.class).setStreamRenderingEnabled(...) deaktiviert. Binden Sie dazu die Datei shaper-base-4.4.x.y.jar aus dem Verzeichnis <jadice-server>/server-lib in den Klassenpfad Ihrer Clientanwendung ein.

Anschließend wird das Original-PDF und die als PDF gerenderten Annotationen dem PDFCompositeNode übergeben.

 

Da der dazu notwendige Workflow umfangreicher ist, hier eine Skizze des Ablaufs:

Einbetten von Annotationen in PDF
private interface Document {
  Stream getContentStream();
  List<Stream> getAnnotationStreams();
}

public void convert(Document myDocument) throws Throwable {
  Job job = ...;

  StreamInputNode contentInputNode = new StreamInputNode();
  StreamInputNode annotationInputNode = new StreamInputNode();
  MultiplexerNode multiplexerNode = new MultiplexerNode();
  DemultiplexerNode demuxNode1 = new DemultiplexerNode();
  JadiceShaperNode shaperNode = new JadiceShaperNode();
  DemultiplexerNode demuxNode2 = new DemultiplexerNode();
  PDFCompositeNode pdfCompositeNode = new PDFCompositeNode();
  StreamOutputNode outputNode = new StreamOutputNode();

  // Configure shaperNode's result type (e.g. PDF)
  shaperNode.setTargetMimeType("application/pdf");
  shaperNode.setOutputMode(OutputMode.ASSOCIATED_STREAM); // Join content and annotations


  // Important! Disable rendering for the document content:
  shaperNode.getSettings(BaseShaperSettings.class).setStreamRenderingEnabled(
      myDocument.getContentStream().getDescriptor().getUUID(), false); 


  // Configure and submit workflow
  contentInputNode.appendSuccessor(multiplexerNode).appendSuccessor(demuxNode2)
      .appendSuccessor(pdfCompositeNode).appendSuccessor(outputNode);
  multiplexerNode.appendSuccessor(demuxNode1).appendSuccessor(shaperNode).appendSuccessor(demuxNode2);
  annotationInputNode.appendSuccessor(demuxNode1);
  job.attach(contentInputNode);
  job.submit();

  // Process document content:
  contentInputNode.addStream(myDocument.getContentStream().getInputStream(),
      myDocument.getContentStream().getDescriptor());
  contentInputNode.complete();

  // Process annotations:
  for (Stream annoStream : myDocument.getAnnotationStreams()) {
    // reflects where this annotation belongs to
    annoStream.getDescriptor().setParent(myDocument.getContentStream().getDescriptor());
    annotationInputNode.addStream(annoStream.getInputStream(), annoStream.getDescriptor());
  }
  annotationInputNode.complete();

  // Not shown: Retrieving content from StreamOutputNode
  // ...
}

Vertrauliche Dokumentinhalte

Bitte beachten Sie, dass in beiden Lösungsvarianten keine Analyse des Dokumentinhalts stattfindet. Inhalte, die von Annotationen verdeckt werden, können je nach Datenformat weiterhin im Zieldatenstrom vorhanden sein. Außerdem ist es möglich, dass unerwünschte (Meta-)Daten im Dokument verbleiben können, die einer Vertraulichkeit unterliegen.