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:
// 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:
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.