PDF Signatur Informationen

Experimentelle API

Die hier beschriebene Funktionalität ist als experimentelle API deklariert. Damit gelten für diese Klasse die Bedingungen der Experimental jadice API , die in der Dokumentation der document platform dokumentiert sind.

Einleitung

Im rechtsverbindlichen Rahmen wurden bisher oft traditionelle Papierdokumente genutzt, da auf ihnen eine eigenhändige Unterschrift einer Person oder ein Stempel eines Unternehmens oder einer Behörde platziert werden kann. So wurde die Echtheit des Dokuments oder einer Willenserklärung bescheinigt.
Digitale Signaturen und Unterschriften stellen ein modernes Verfahren dar, um eine vergleichbare Rechtssicherheit für digitale Dokumente zu ermöglichen. Sie werden unter anderem in automatisierten Prozessen verwendet, bspw. der Massenversand von Rechnungen oder wenn im Prozess des Unterzeichens von Dokumenten auf eigenhändige Unterschriften verzichtet werden kann oder soll.

Grundsätzlich kann jedes elektronische Dokument digital unterschrieben werden. In der Praxis hat sich jedoch für den Austausch und für die Archivierung von elektronischen Dokumenten das PDF Format etabliert. 

Die experimentelle jadice PDF Signature Store API soll Integratoren einen voll qualifizierten Zugriff auf die in einen PDF Dokument enthaltenen Signatur Informationen ermöglichen. Zusätzlich wird eine Möglichkeit angeboten, während der Anzeige eines Dokuments im Viewer enthaltene Signatur Details in einem RollOut einblenden zu lassen.  

Zugriff über SignatureStores

Den Einstieg bieten die Klassen com.levigo.jadice.format.pdf.signaturestore.SignatureStores bzw. com.levigo.jadice.format.pdf.signaturestore.SignatureStore. Sie erlauben Zugriff auf die in einem PDF enthaltenen Signatur Informationen. 

Die Klasse SignatureStores bietet über ihre statischen Methoden einen einfachen Zugriff auf den jeweiligen Store. Dieser beinhaltet alle in einem PDF Dokument enthaltenen Signatur Informationen. Das Codebeispiel zeigt den Aufruf. 

SignatureStore
Document doc = ... 
Page page = ...

SignatureStore signatureStore1 = SignatureStores.getSignatureStore(doc);
SignatureStore signatureStore2 = SignatureStores.getSignatureStore(page);


Stehen keine Signaturdaten zur Verfügung, wird obiger Code null als Rückgabewert liefern. Stehen Signatur Informationen zur Verfügung, wird der entsprechende SignatureStore zurück gegeben. 
Der SignatureStore erlaubt Zugriff auf alle Signatur Daten, die in dem Quell PDF vorhanden sind. Signaturdaten sind immer im Kontext eines PDF Dokuments zu verstehen. In diesem Sinne liefert SignatureStores.getSignatureStore(page) den SignatureStore des zugrundeliegenden PDF Dokuments und ist identisch mit dem Ergebnis des Aufrufs SignatureStores.getSignatureStore(doc), sofern das übergebene Dokument das Quell PDF der Seite ist. 

Der SignatureStore

Der SignatureStore und die damit verbundenen Klassen sind strukturell ähnlich dem Aufbau der Daten in einem PDF Dokument. Damit soll Integratoren die Möglichkeit einer einfachen Orientierung bei der Verwendung der Daten angeboten werden.  Der SignatureStore ermöglicht den Zugriff auf den DocumentSecurityStore des Dokuments und alle eingebetteten SignatureFields

Der DocumentSecurityStore (DSS) enthält dokumentenübergreifende Informationen über die verwendeten Zertifikate, Zeitstempelsignaturen und Hilfszertifikate, die zur Validierung der an der Zertifikatskettenvalidierung beteiligten Zertifikate erforderlich sind. Darüber hinaus bietet er Zugang zu validierungsbezogenen Informationen für CMS-Signaturen.

DSS
Document doc = ...
SignatureStore store = SignatureStores.getSignatureStore(doc);

DocumentSecurityStore dss = store.getStoreDSS();
List<byte[]> certs = dss.getCerts();
List<byte[]> crLs = dss.getCRLs();
List<byte[]> ocsPs = dss.getOCSPs();
String digestOfSignatureField = ...
ValidationInformation sigFieldVRI = dss.getVRI(digestOfSignatureField);

SignatureFields repräsentieren Formularfelder, die in einem PDF Dokument eingebettet sind und bieten Zugriff auf die zugehörigen digitalen Signaturdaten, abgebildet durch SignatureData. SignatureData entspricht dem Signature Dictionary in der PDF Definition und bietet detailierte Informationen zu der angewendeten Signatur. Dazu gehören Angaben zu dem Unterzeichner, den Grund der Signatur, Ort und Zeit der Signatur Aufbringung und welcher Filter und SubFilter die signierten Daten ausmachen.


SignatureField
Document doc = ...
SignatureStore store = SignatureStores.getSignatureStore(doc);

List<SignatureField> signatureFieldList = store.getSignatureFields();
SignatureField signatureField = signatureFieldList.get(0);
SignatureData data = signatureField.getSignatureData();
String signerName = data.getName();
String reason = data.getReason();
List<SignatureReference> refList = data.getReferences(); 
...

Weiterhin beinhaltet es eine Liste von SignatureReferences. Eine SignatureReference spezifiziert die Erkennung und den Umgang von Signaturänderungen. Insbesondere enthält sie eine TransformMethod, die die allgemeine Methode zur Erkennung von Änderungen angibt, und die TransformParams, die die variablen Teile der Transformationsmethode beschreiben.

Anzeige RolloutPDFSignatureBox

Einen leichtgewichtigen Hinweis auf vorhandene Signaturen bei der Anzeige eines Dokuments liefert dem Anwender die Klasse com.levigo.jadice.demo.pdf.signature.RolloutPDFSignatureBox. Sie ist Teil der jadice Demo Klassen und steht Integratoren im Source Code zur Verfügung.

Die RolloutPDFSignatureBox ist eingbunden in der BasicDemoApplication. Wird in der BasicDemoApplication ein PDF Dokument mit Signatur Informationen angezeigt, zeigt sich eine kleine Box oberhalb der Anzeige mit wesentlichen Angaben der ersten im Dokument gefundenen Signatur.

Bei jedem Seitenwechsel versteckt oder zeigt sich das Rollout, je nachdem ob entsprechende Signatur Informationen vorliegen. Damit wird auch die Anzeige von Akten und zusammengesetzten Dokumenten von dem RollOut unterstützt. Das Signatur Datum, sofern vorhanden, wird in der PDF internen Schreibweise angezeigt.

Erweiterungsmöglichkeiten

Wenn es der Anwendungsfall erfordert, ist es möglich das RollOut anzupassen, um weitere Informationen anzuzeigen, oder ausklappbar zu gestalten, um die Signatur Informationen aller Signaturen anzuzeigen. In diesem Fall ist es dem Integrator freigestellt gewünschte Änderungen vorzunehmen. Als Demo Code stehen alle Klassen als Source Code zu weiteren Verwendung zur Verfügung.

Tool und Commands

Initial wird das RollOut über das com.levigo.jadice.demo.pdf.signature.PDFSignatureBoxTool installiert. Die Steuerung des Signature RollOuts übernehmen die Commands  com.levigo.jadice.demo.pdf.signature.commands.ToggleEnabledPDFSignatureBoxCommand und com.levigo.jadice.demo.pdf.signature.commands.TogglePDFSignatureBoxCommand. Das TogglePDFSignatureBoxCommand zeigt bzw. versteckt das RollOut. Das ToggleEnabledPDFSignatureBoxCommand aktiviert bzw. deaktiviert dauerhaft das Erscheinen des Rollouts.  Im aktivierten Zustand zeigt sich die Box bei Seiten- bzw. Dokumentwechsel automatisch wieder, sofern Signatur Informationen vorhanden sind. Im deaktivierten Zustand bleibt die Box verborgen.

Die Commands befinden sich in der BasicDemoApplication im Menü unter Einstellungen und im Kontext Menü. Für letzteres kann der com.levigo.jadice.demo.pdf.signature.PDFSignatureVisibilityMenuContributor von Integratoren in der eigenen Implemantation genutzt werden.