Die meisten AEM Forms-Dienste im Dienst-Container sind so konfiguriert, dass ein Webdienst verfügbar ist, mit voller Unterstützung für die WSDL-Generierung (Web Service Definition Language). Das heißt, Sie können Proxy-Objekte erstellen, die den systemeigenen SOAP-Stapel eines AEM Forms-Dienstes verwenden. Dadurch können AEM Forms-Dienste folgende SOAP-Nachrichten austauschen und verarbeiten:
Mithilfe von Webdiensten können Sie dieselben AEM Forms-Dienstvorgänge ausführen wie mit der Java-API. Ein Vorteil der Verwendung von Webdiensten zum Aufrufen von AEM Forms-Diensten besteht darin, dass Sie eine Clientanwendung in einer Umgebung erstellen können, die SOAP unterstützt. Eine Clientanwendung ist nicht an eine bestimmte Entwicklungs- oder Programmiersprache gebunden. Beispielsweise können Sie eine Clientanwendung mit Microsoft Visual Studio .NET und C# als Programmiersprache erstellen.
AEM Forms-Dienste werden über das SOAP-Protokoll bereitgestellt und sind WSI Basic Profil 1.1-kompatibel. Web Services Interoperability (WSI) ist eine offene Organisation, die die Interoperabilität von Webdiensten plattformübergreifend fördert. Weitere Informationen finden Sie unter https://www.ws-i.org/.
AEM Forms unterstützt die folgenden Webdienststandards:
Um AEM Forms-Dienste mit einem Webdienst aufzurufen, erstellen Sie in der Regel eine Proxybibliothek, die den Dienst WSDL nutzt. Der Abschnitt Invoking AEM Forms using Web Services verwendet JAX-WS, um Java-Proxyklassen zum Aufrufen von Diensten zu erstellen. (Siehe Java-Proxyklassen mit JAX-WS erstellen.)
Sie können einen Dienst-WDSL abrufen, indem Sie die folgende URL-Definition angeben (Elemente in Klammern sind optional):
https://<your_serverhost>:<your_port>/soap/services/<service_name>?wsdl[&version=<version>][&async=true|false][lc_version=<lc_version>]
hierbei gilt:
async
gibt den Wert true
an, um zusätzliche Vorgänge für den asynchronen Aufruf zu aktivieren ( false
standardmäßig).Die folgende Tabelle enthält WSDL-Definitionen für Listen (vorausgesetzt, dass AEM Forms auf dem lokalen Host bereitgestellt wird und der Beitrag 8080 ist).
Service |
WSDL-Definition |
---|---|
Assembler |
|
Zurück und Wiederherstellen |
|
Barcoded Forms |
|
Convert PDF |
|
Distiller |
|
DocConverter |
|
DocumentManagement |
|
Encryption-Dienst |
|
Formulare |
|
Form Data Integration |
|
Generate PDF |
|
3D-PDF generieren |
|
Ausgabe |
|
PDF Utilities |
|
Acrobat Reader DC Extensions |
|
Repository |
|
Rights Management |
|
Signatur |
|
XMP Utilities |
|
AEM Forms Process WSDL-Definitionen
Sie müssen den Anwendungsnamen und den Prozessnamen in der WSDL-Definition angeben, um auf eine WSDL zuzugreifen, die zu einem in Workbench erstellten Prozess gehört. Angenommen, der Name der Anwendung ist MyApplication
und der Name des Prozesses ist EncryptDocument
. Geben Sie in diesem Fall die folgende WSDL-Definition an:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl
Weitere Informationen zum Beispiel MyApplication/EncryptDocument
Prozess mit kurzer Lebensdauer finden Sie unter Beispiel für einen Prozess mit kurzer Lebensdauer.
Eine Anwendung kann Ordner enthalten. Geben Sie in diesem Fall die Ordnernamen in der WSDL-Definition an:
http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl
Zugriff auf neue Funktionen mithilfe von Webdiensten
Auf neue Funktionen des AEM Forms-Dienstes kann über Webdienste zugegriffen werden. In AEM Forms wird beispielsweise die Möglichkeit eingeführt, Anlagen mit MTOM zu kodieren. (Siehe Aufrufen von AEM Forms mit MTOM.)
Um auf neue Funktionen zuzugreifen, die in AEM Forms eingeführt wurden, geben Sie das Attribut lc_version
in der WSDL-Definition an. Um beispielsweise auf neue Dienstfunktionen (einschließlich MTOM-Unterstützung) zuzugreifen, geben Sie die folgende WSDL-Definition an:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl&lc_version=9.0.1
Stellen Sie beim Festlegen des Attributs lc_version
sicher, dass Sie drei Ziffern verwenden. Beispielsweise ist 9.0.1 gleich Version 9.0.
Webdienst-BLOB-Datentyp
AEM Forms-Dienst-WSDLs definieren viele Datentypen. Einer der wichtigsten Datentypen, die in einem Webdienst bereitgestellt werden, ist der Typ BLOB
. Dieser Datentyp wird beim Arbeiten mit AEM Forms Java-APIs der Klasse com.adobe.idp.Document
zugeordnet. (Siehe Übergeben von Daten an AEM Forms-Dienste mithilfe der Java-API.)
Ein BLOB
-Objekt sendet und ruft Binärdaten (z. B. PDF-Dateien, XML-Daten usw.) an und aus den AEM Forms-Diensten ab. Der Typ BLOB
wird in einer Dienst-WSDL wie folgt definiert:
<complexType name="BLOB">
<sequence>
<element maxOccurs="1" minOccurs="0" name="contentType"
type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="binaryData"
type="xsd:base64Binary"/>
<element maxOccurs="1" minOccurs="0" name="attachmentID"
type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="remoteURL"
type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="MTOM"
type="xsd:base64Binary"
xmime:expectedContentTypes="*/*"
xmlns:xmime="https://www.w3.org/2005/05/xmlmime"/>
<element maxOccurs="1" minOccurs="0" name="swaRef"
type="tns1:swaRef"/>
<element maxOccurs="1" minOccurs="0" name="attributes"
type="impl:MyMapOf_xsd_string_To_xsd_anyType"/>
</sequence>
</complexType>
Die Felder MTOM
und swaRef
werden nur in AEM Forms unterstützt. Sie können diese neuen Felder nur verwenden, wenn Sie eine URL angeben, die die Eigenschaft lc_version
enthält.
Bereitstellen von BLOB-Objekten in Dienstanforderungen
Wenn für einen AEM Forms-Dienstvorgang der Typ BLOB
als Eingabewert erforderlich ist, erstellen Sie eine Instanz des Typs BLOB
in Ihrer Anwendungslogik. (Viele der Webdienst-Schnellbenutzer unter Programmieren mit AEM Formularen zeigen, wie mit einem BLOB-Datentyp gearbeitet wird.)
Weisen Sie den Feldern, die zur BLOB
-Instanz gehören, wie folgt Werte zu:
BLOB.binaryData
Feld ein und legen Sie den Datentyp im MIME-Format (z. B. application/pdf
) im BLOB.contentType
Feld fest. (Siehe Aufrufen von AEM Forms mit Base64-Kodierung.)BLOB.MTOM
Feld fest. Diese Einstellung hängt die Daten mit dem Java JAX-WS-Framework oder der nativen API des SOAP-Frameworks an die SOAP-Anforderung an. (Siehe Aufrufen von AEM Forms mit MTOM.)BLOB.swaRef
Feld ein. Diese Einstellung hängt die Daten mit dem Java JAX-WS-Framework an die SOAP-Anforderung an. (Siehe Aufrufen von AEM Forms mit SwaRef.)BLOB.attachmentID
fest. (Siehe Aufrufen von AEM Forms mit Base64-Kodierung.)BLOB.remoteURL
Feld ein. (Siehe Aufrufen von AEM Forms mit BLOB-Daten über HTTP.)Zugriff auf Daten in BLOB-Objekten, die von Diensten zurückgegeben werden
Das Übertragungsprotokoll für zurückgegebene BLOB
-Objekte hängt von mehreren Faktoren ab, die in der folgenden Reihenfolge berücksichtigt werden, und endet, wenn die Hauptbedingung erfüllt ist:
Zielgruppe URL gibt das Übertragungsprotokoll an. Wenn die Zielgruppen-URL, die beim SOAP-Aufruf angegeben wird, den Parameter blob="
BLOB_TYPE"enthält, bestimmt BLOB_TYPE das Übertragungsprotokoll. BLOB_ TYPE ist ein Platzhalter für base64, dime, mime, http, mtom oder sWaref.
Service SOAP-Endpunkt ist Smart. Wenn die folgenden Bedingungen erfüllt sind, werden die Output-Dokumente mit demselben Übertragungsprotokoll wie die Input-Dokumente zurückgegeben:
Der SOAP-Endpunkt-Parameter des Dienstes "Standardprotokoll für Output Blob-Objekte"ist auf "Smart"eingestellt.
Für jeden Dienst mit einem SOAP-Endpunkt können Sie mit Administration Console das Übertragungsprotokoll für alle zurückgegebenen Blobs angeben. (Siehe Administration help.)
Der AEM Forms-Dienst nimmt ein oder mehrere Dokumente als Eingabe in Anspruch.
Service SOAP-Endpunkt ist nicht Smart. Das konfigurierte Protokoll bestimmt das Dokument-Übertragungsprotokoll und die Daten werden im entsprechenden Feld BLOB
zurückgegeben. Wenn beispielsweise der SOAP-Endpunkt auf DIME gesetzt ist, befindet sich der zurückgegebene Blob unabhängig vom Übertragungsprotokoll eines Eingabemodells im Feld blob.attachmentID
.
Andernfalls. Wenn ein Dienst den Dokument-Typ nicht als Eingabe nimmt, werden die Output-Dokumente im Feld BLOB.remoteURL
über das HTTP-Protokoll zurückgegeben.
Wie in der ersten Bedingung beschrieben, können Sie den Übertragungstyp für alle zurückgegebenen Dokumente sicherstellen, indem Sie die SOAP-Endpunkt-URL wie folgt mit einem Suffix erweitern:
https://<your_serverhost>:<your_port>/soap/services/<service
name>?blob=base64|dime|mime|http|mtom|swaref
Die Korrelation zwischen den Übertragungsarten und dem Feld, aus dem Sie die Daten abrufen:
blob
Suffix so ein, base64
dass die Daten im BLOB.binaryData
Feld zurückgegeben werden.blob
Suffix auf DIME
oder MIME
auf die Daten als einen entsprechenden Anlagentyp ein, wobei der Anlagenbezeichner im BLOB.attachmentID
Feld zurückgegeben wird. Verwenden Sie die proprietäre API des SOAP-Frameworks, um die Daten aus der Anlage zu lesen.blob
Suffix so ein, http
dass die Daten auf dem Anwendungsserver bleiben und die URL zurückgegeben wird, die auf die Daten im BLOB.remoteURL
Feld verweist.blob
Suffix auf mtom
oder swaref
auf die Daten als einen entsprechenden Anlagentyp ein, wobei der Anlagenbezeichner in den BLOB.MTOM
oder BLOB.swaRef
Feldern zurückgegeben wird. Verwenden Sie die native API des SOAP-Frameworks, um die Daten aus der Anlage zu lesen.Es wird empfohlen, beim Füllen eines BLOB
-Objekts durch Aufrufen der setBinaryData
-Methode nicht mehr als 30 MB zu verwenden. Andernfalls besteht die Möglichkeit, dass eine OutOfMemory
-Ausnahme auftritt.
JAX WS-basierte Anwendungen, die das MTOM-Übertragungsprotokoll verwenden, sind auf 25 MB der gesendeten und empfangenen Daten beschränkt. Diese Einschränkung ist auf einen Fehler in JAX-WS zurückzuführen. Wenn die Gesamtgröße Ihrer gesendeten und empfangenen Dateien 25 MB überschreitet, verwenden Sie das SwaRef-Übertragungsprotokoll anstelle des MTOM-Protokolls. Andernfalls besteht die Möglichkeit einer OutOfMemory
-Ausnahme.
MTOM-Übertragung von Base64-kodierten Byte-Arrays
Zusätzlich zum BLOB
-Objekt unterstützt das MTOM-Protokoll alle Byte-Array-Parameter oder Byte-Array-Felder eines komplexen Typs. Das bedeutet, dass Client-SOAP-Frameworks, die MTOM unterstützen, jedes xsd:base64Binary
-Element als MTOM-Anhang senden können (anstelle eines base64-kodierten Textes). AEM Forms SOAP-Endpunkte können diese Art der Byte-Array-Kodierung lesen. Der AEM Forms-Dienst gibt jedoch immer einen Byte-Array-Typ als base64-kodierten Text zurück. Die Ausgabebyte-Array-Parameter unterstützen kein MTOM.
AEM Forms-Dienste, die eine große Menge binärer Daten zurückgeben, verwenden den Dokument-/BLOB-Typ und nicht den Byte-Array-Typ. Der Dokument-Typ ist bei der Übertragung großer Datenmengen sehr viel effizienter.
Die folgende Tabelle Liste Java-Datentypen und zeigt den entsprechenden Webdienst-Datentyp.
Java-Datentyp |
Webdienst-Datentyp |
---|---|
|
|
|
|
|
Der Typ
Wenn ein AEM Forms-Dienstvorgang den Wert |
|
Der Typ
Wenn ein AEM Forms-Dienstvorgang den Wert |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Die Variable
Wenn ein AEM Forms-Dienstvorgang einen Das Festlegen des Felds |
|
Der XML-Typ, der in einer Dienst-WSDL wie folgt definiert wird:
Wenn ein AEM Forms-Dienstvorgang ein Das Festlegen des Felds |
Website für Adobe-Entwickler
Die Adobe Developer-Website enthält den folgenden Artikel, in dem das Aufrufen von AEM Forms-Diensten mithilfe der Webdienst-API behandelt wird:
Erstellen von Formularwiedergaben von ASP.NET-Anwendungen
Aufrufen von Webdiensten mit benutzerdefinierten Komponenten
Beim Aufrufen von Webdiensten mit benutzerdefinierten Komponenten wird beschrieben, wie Sie eine AEM Forms-Komponente erstellen, die Webdienste von Drittanbietern aufruft.
Sie können JAX-WS verwenden, um eine Forms-Dienst-WSDL in Java-Proxyklassen zu konvertieren. Diese Klassen ermöglichen es Ihnen, AEM Forms-Dienstvorgänge aufzurufen. Mit Apache Ant können Sie ein Buildskript erstellen, das Java-Proxyklassen durch Verweis auf eine AEM Forms-Dienst-WSDL generiert. Führen Sie die folgenden Schritte aus, um JAX-WS-Proxydateien zu generieren:
Installieren Sie Apache Ant auf dem Clientcomputer. (Siehe https://ant.apache.org/bindownload.cgi.)
ANT_HOME
für die Umgebung auf den Ordner fest, in dem Sie Ant installiert haben.Installieren Sie JDK 1.6 oder höher.
[JDK_INSTALL_LOCATION]/jre
.JAVA_HOME
für die Umgebung auf den Ordner fest, in dem Sie das JDK installiert haben.JDK 1.6 enthält das in der Datei "build.xml"verwendete wsimport-Programm. JDK 1.5 enthält dieses Programm nicht.
Installieren Sie JAX-WS auf dem Clientcomputer. (Siehe Java-API für XML-Webdienste.)
Verwenden Sie JAX-WS und Apache Ant, um Java-Proxyklassen zu generieren. Erstellen Sie ein Ant-Build-Skript, um diese Aufgabe durchzuführen. Das folgende Skript ist ein Beispiel für ein Ant-Build-Skript mit dem Namen build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="compile">
<property name="port" value="8080" />
<property name="host" value="localhost" />
<property name="username" value="administrator" />
<property name="password" value="password" />
<property name="tests" value="all" />
<target name="clean" >
<delete dir="classes" />
</target>
<target name="wsdl" depends="clean">
<mkdir dir="classes"/>
<exec executable="wsimport" failifexecutionfails="false" failonerror="true" resultproperty="foundWSIMPORT">
<arg line="-keep -d classes https://${host}:${port}/soap/services/EncryptionService?wsdl&lc_version=9.0.1"/>
</exec>
<fail unless="foundWSIMPORT">
!!! Failed to execute JDK's wsimport tool. Make sure that JDK 1.6 (or later) is on your PATH !!!
</fail>
</target>
<target name="compile" depends="clean, wsdl" >
<javac destdir="./classes" fork="true" debug="true">
<src path="./src"/>
</javac>
</target>
<target name="run">
<java classname="Client" fork="yes" failonerror="true" maxmemory="200M">
<classpath>
<pathelement location="./classes"/>
</classpath>
<arg value="${port}"/>
<arg value="${host}"/>
<arg value="${username}"/>
<arg value="${password}"/>
<arg value="${tests}"/>
</java>
</target>
</project>
Beachten Sie in diesem Ant-Build-Skript, dass die url
-Eigenschaft so eingestellt ist, dass sie auf den Encryption-Dienst WSDL verweist, der auf localhost ausgeführt wird. Die Eigenschaften username
und password
müssen auf einen gültigen Benutzernamen und ein gültiges Kennwort für AEM Formulare festgelegt werden. Beachten Sie, dass die URL das Attribut lc_version
enthält. Ohne Angabe der Option lc_version
können Sie keine neuen AEM Forms-Dienstvorgänge aufrufen.
Ersetzen Sie EncryptionService
durch den AEM Forms-Dienstnamen, den Sie mit Java-Proxyklassen aufrufen möchten. Um beispielsweise Java-Proxyklassen für den Rights Management-Dienst zu erstellen, geben Sie Folgendes an:
http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
Erstellen Sie eine BAT-Datei, um das Ant-Build-Skript auszuführen. Der folgende Befehl kann sich in einer BAT-Datei befinden, die für die Ausführung des Ant-Build-Skripts zuständig ist:
ant -buildfile "build.xml" wsdl
Platzieren Sie das ANT-Buildskript im Ordner C:\Program Files\Java\jaxws-ri\bin directory. Das Skript schreibt die JAVA-Dateien in .Ordner "/classes". Das Skript generiert JAVA-Dateien, die den Dienst aufrufen können.
Verpacken Sie die JAVA-Dateien in einer JAR-Datei. Wenn Sie an Eclipse arbeiten, führen Sie die folgenden Schritte aus:
com.adobe.idp.services
-Paket.com.adobe.idp.services
-Paket und importieren Sie dann die JAVA-Dateien aus dem Ordner "adobe/idp/services"in das Paket.org/apache/xml/xmlsoap
-Paket im Ordner "Quelle".Alle Java-Webdienst-Schnelldateien (mit Ausnahme des Forms-Dienstes), die sich unter Programmieren mit AEM Formularen befinden, erstellen Java-Proxydateien mit JAX-WS. Darüber hinaus verwenden alle Java-Webdienst-Schnellbenutzer SwaRef. (Siehe Aufrufen von AEM Forms mit SwaRef.)
Siehe auch
Java-Proxyklassen mit Apache Axis erstellen
Aufrufen von AEM Forms mit Base64-Kodierung
Aufrufen von AEM Forms mithilfe von BLOB-Daten über HTTP
Aufrufen von AEM Forms mit SwaRef
Mit dem Apache Axis WSDL2Java-Tool können Sie einen Forms-Dienst in Java-Proxyklassen konvertieren. Mit diesen Klassen können Sie Forms-Dienstvorgänge aufrufen. Mit Apache Ant können Sie Axis-Bibliotheksdateien aus einem Dienst-WSDL generieren. Sie können die Apache Axis unter der URL https://ws.apache.org/axis/ herunterladen.
Die mit dem Forms-Dienst verknüpften Schnelldienst-Beginn verwenden Java-Proxyklassen, die mit Apache Axis erstellt wurden. Die Beginn des Forms-Webdiensts verwenden auch Base64 als Kodierungstyp. (Siehe Forms Service API Quick Beginn.)
Sie können die Java-Bibliotheksdateien von Axis wie folgt generieren:
Installieren Sie Apache Ant auf dem Clientcomputer. Sie ist unter https://ant.apache.org/bindownload.cgi verfügbar.
ANT_HOME
für die Umgebung auf den Ordner fest, in dem Sie Ant installiert haben.Installieren Sie Apache Axis 1.4 auf dem Clientcomputer. Sie ist unter https://ws.apache.org/axis/ verfügbar.
Richten Sie den Klassenpfad ein, um die Axis-JAR-Dateien in Ihrem Webdienstclient zu verwenden, wie in den Anweisungen zur Axis-Installation unter https://ws.apache.org/axis/java/install.html beschrieben.
Verwenden Sie das Apache WSDL2Java-Tool in Axis, um Java-Proxyklassen zu generieren. Erstellen Sie ein Ant-Build-Skript, um diese Aufgabe durchzuführen. Das folgende Skript ist ein Beispiel für ein Ant-Build-Skript mit dem Namen build.xml:
<?xml version="1.0"?>
<project name="axis-wsdl2java">
<path id="axis.classpath">
<fileset dir="C:\axis-1_4\lib" >
<include name="**/*.jar" />
</fileset>
</path>
<taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
<target name="encryption-wsdl2java-client" description="task">
<axis-wsdl2java
output="C:\JavaFiles"
testcase="false"
serverside="false"
verbose="true"
username="administrator"
password="password"
url="http://localhost:8080/soap/services/EncryptionService?wsdl&lc_version=9.0.1" >
</axis-wsdl2java>
</target>
</project>
Beachten Sie in diesem Ant-Build-Skript, dass die url
-Eigenschaft so eingestellt ist, dass sie auf den Encryption-Dienst WSDL verweist, der auf localhost ausgeführt wird. Die Eigenschaften username
und password
müssen auf einen gültigen Benutzernamen und ein gültiges Kennwort für AEM Formulare festgelegt werden.
Erstellen Sie eine BAT-Datei, um das Ant-Build-Skript auszuführen. Der folgende Befehl kann sich in einer BAT-Datei befinden, die für die Ausführung des Ant-Build-Skripts zuständig ist:
ant -buildfile "build.xml" encryption-wsdl2java-client
Die JAVA-Dateien werden in die Eigenschaft C:\JavaFiles folder as specified by the output
geschrieben. Um den Forms-Dienst erfolgreich aufzurufen, importieren Sie diese JAVA-Dateien in Ihren Klassenpfad.
Standardmäßig gehören diese Dateien zu einem Java-Paket mit dem Namen com.adobe.idp.services
. Es wird empfohlen, diese JAVA-Dateien in einer JAR-Datei zu speichern. Importieren Sie dann die JAR-Datei in den Klassenpfad der Clientanwendung.
Es gibt verschiedene Möglichkeiten, .JAVA-Dateien in eine JAR-Datei zu setzen. Eine Möglichkeit ist die Verwendung einer Java IDE wie Eclipse. Erstellen Sie ein Java-Projekt und erstellen Sie ein com.adobe.idp.services
Paket (alle .JAVA-Dateien gehören zu diesem Paket). Importieren Sie als Nächstes alle JAVA-Dateien in das Paket. Exportieren Sie das Projekt schließlich als JAR-Datei.
Ändern Sie die URL in der EncryptionServiceLocator
-Klasse, um den Kodierungstyp anzugeben. Um beispielsweise base64 zu verwenden, geben Sie ?blob=base64
an, um sicherzustellen, dass das BLOB
-Objekt Binärdaten zurückgibt. Suchen Sie in der Klasse EncryptionServiceLocator
die folgende Codezeile:
http://localhost:8080/soap/services/EncryptionService;
und ändern Sie sie in:
http://localhost:8080/soap/services/EncryptionService?blob=base64;
hinzufügen Sie die folgenden Axis-JAR-Dateien in den Klassenpfad Ihres Java-Projekts:
Diese JAR-Dateien befinden sich im Ordner [install directory]/Adobe/Adobe Experience Manager Forms/sdk/lib/thirdparty
.
Siehe auch
Java-Proxyklassen mit JAX-WS erstellen
Aufrufen von AEM Forms mit Base64-Kodierung
Aufrufen von AEM Forms mithilfe von BLOB-Daten über HTTP
Sie können einen AEM Forms-Dienst mit der Base64-Kodierung aufrufen. Base64-Kodierung kodiert Anlagen, die mit einer Webdienst-Aufrufanforderung gesendet werden. Das heißt, die BLOB
-Daten sind Base64-kodiert, nicht die gesamte SOAP-Nachricht.
"Invoking AEM Forms using Base64 encoding" beschreibt das Aufrufen des folgenden AEM Forms-Prozesses mit kurzer Lebensdauer mit dem Namen MyApplication/EncryptDocument
mithilfe der Base64-Kodierung.
Dieser Prozess basiert nicht auf einem vorhandenen AEM Forms-Prozess. Um dem Codebeispiel zu folgen, erstellen Sie einen Prozess mit dem Namen MyApplication/EncryptDocument
in Workbench. (Siehe Verwenden von Workbench.)
Wenn dieser Prozess aufgerufen wird, führt er die folgenden Aktionen aus:
SetValue
. Der Eingangsparameter für diesen Prozess ist eine document
-Prozessvariable mit dem Namen inDoc
.PasswordEncryptPDF
. Das kennwortverschlüsselte PDF-Dokument wird in einer Prozessvariablen namens outDoc
zurückgegeben.Sie können eine .NET-Clientassembly erstellen, um einen Forms-Dienst aus einem Microsoft Visual Studio .NET-Projekt aufzurufen. So erstellen Sie eine .NET-Client-Assembly, die die Base64-Kodierung verwendet:
Erstellen einer Proxyklasse
Sie können eine Proxyklasse erstellen, die zum Erstellen der .NET-Clientassembly verwendet wird, indem Sie ein Tool verwenden, das Microsoft Visual Studio begleitet. Der Name des Tools ist wsdl.exe und befindet sich im Installationsordner von Microsoft Visual Studio. Um eine Proxyklasse zu erstellen, öffnen Sie die Eingabeaufforderung und navigieren Sie zu dem Ordner, der die Datei "wsdl.exe"enthält. Weitere Informationen zum Tool wsdl.exe finden Sie in der MSDN-Hilfe.
Geben Sie an der Eingabeaufforderung den folgenden Befehl ein:
wsdl https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Standardmäßig erstellt dieses Tool eine CS-Datei im selben Ordner, der auf dem Namen der WSDL basiert. In diesem Fall wird eine CS-Datei mit dem Namen EncryptDocumentService.cs erstellt. Mit dieser CS-Datei erstellen Sie ein Proxy-Objekt, mit dem Sie den Dienst aufrufen können, der in der Aufruf-URL angegeben wurde.
Ändern Sie die URL in der Proxyklasse so, dass ?blob=base64
einbezogen wird, um sicherzustellen, dass das BLOB
-Objekt Binärdaten zurückgibt. Suchen Sie in der Proxyklasse die folgende Codezeile:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument";
und ändern Sie sie in:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";
Im Abschnitt Aufrufen von AEM Forms mit Base64 Encoding wird MyApplication/EncryptDocument
als Beispiel verwendet. Wenn Sie eine .NET-Clientassembly für einen anderen Forms-Dienst erstellen, stellen Sie sicher, dass Sie MyApplication/EncryptDocument
durch den Namen des Dienstes ersetzen.
Entwickeln der .NET-Clientassembly
Erstellen Sie ein Visual Studio-Klassenbibliotheksprojekt, das eine .NET-Client-Assembly erzeugt. Die mit wsdl.exe erstellte CS-Datei kann in dieses Projekt importiert werden. Dieses Projekt erzeugt eine DLL-Datei (die .NET-Clientassembly), die Sie in anderen Visual Studio .NET-Projekten zum Aufrufen eines Dienstes verwenden können.
Dieses Verfahren erstellt eine .NET-Clientassembly mit dem Namen DocumentService.dll, die Sie zum Senden von SOAP-Anforderungen an den MyApplication/EncryptDocument
-Dienst verwenden können.
Stellen Sie sicher, dass Sie ?blob=base64
zur URL in der Proxyklasse hinzugefügt haben, die zum Erstellen der .NET-Client-Assembly verwendet wird. Andernfalls können Sie keine Binärdaten vom BLOB
-Objekt abrufen.
Verweis auf die .NET-Clientassembly
Platzieren Sie die neu erstellte .NET-Clientassembly auf dem Computer, auf dem Sie die Clientanwendung entwickeln. Nachdem Sie die .NET-Clientassembly in einem Verzeichnis abgelegt haben, können Sie von einem Projekt aus darauf verweisen. Verweisen Sie auch auf die System.Web.Services
-Bibliothek aus Ihrem Projekt. Wenn Sie diese Bibliothek nicht referenzieren, können Sie die .NET-Client-Assembly nicht zum Aufrufen eines Dienstes verwenden.
Aufrufen eines Dienstes mit einer .NET-Client-Assembly, die die Base64-Kodierung verwendet
Sie können den Dienst MyApplication/EncryptDocument
(der in Workbench erstellt wurde) mit einer .NET-Client-Assembly aufrufen, die die Base64-Kodierung verwendet. So rufen Sie den Dienst MyApplication/EncryptDocument
auf:
MyApplication/EncryptDocument
-Dienst-WSDL verwendet.System.Web.Services
.MyApplication_EncryptDocumentService
-Objekt, indem Sie dessen Standardkonstruktor aufrufen.MyApplication_EncryptDocumentService
des Objekts Credentials
mit einem Objekt System.Net.NetworkCredential
fest. Geben Sie im Konstruktor System.Net.NetworkCredential
einen AEM Forms-Benutzernamen und das entsprechende Kennwort ein. Legen Sie Authentifizierungswerte fest, damit Ihre .NET-Clientanwendung SOAP-Nachrichten erfolgreich mit AEM Forms austauschen kann.BLOB
, indem Sie den Konstruktor verwenden. Das BLOB
-Objekt wird zum Speichern eines PDF-Dokuments verwendet, das an den MyApplication/EncryptDocument
-Prozess übergeben wird.System.IO.FileStream
-Objekt, indem Sie den Konstruktor aufrufen. Übergeben Sie einen Zeichenfolgenwert, der den Dateispeicherort des PDF-Dokuments und den Dateimodus darstellt, in dem die Datei geöffnet werden soll.System.IO.FileStream
speichert. Sie können die Größe des Byte-Arrays bestimmen, indem Sie die System.IO.FileStream
-Eigenschaft des Objekts Length
abrufen.System.IO.FileStream
-Methode des Objekts Read
aufrufen. Übergeben Sie das Bytearray, die Startposition und die zu lesende Stream-Länge.BLOB
-Objekt, indem Sie seine binaryData
-Eigenschaft mit dem Inhalt des Byte-Arrays zuweisen.MyApplication/EncryptDocument
-Prozess auf, indem Sie die MyApplication_EncryptDocumentService
-Objektmethode invoke
aufrufen und das BLOB
-Objekt übergeben, das das PDF-Dokument enthält. Dieser Vorgang gibt ein verschlüsseltes PDF-Dokument innerhalb eines BLOB
-Objekts zurück.System.IO.FileStream
-Objekt, indem Sie den Konstruktor aufrufen und einen Zeichenfolgenwert übergeben, der den Dateispeicherort des kennwortverschlüsselten Dokuments darstellt.BLOB
-Objekts speichert, das von der MyApplicationEncryptDocumentService
-Methode des Objekts invoke
zurückgegeben wird. Füllen Sie das Bytearray, indem Sie den Wert des BLOB
-Datenelements des Objekts binaryData
abrufen.System.IO.BinaryWriter
-Objekt, indem Sie den Konstruktor aufrufen und das System.IO.FileStream
-Objekt übergeben.System.IO.BinaryWriter
-Methode des Objekts aufrufen und das Bytearray übergeben.Write
Sie können einen AEM Forms-Dienst mit Java-Proxyklassen und Base64 aufrufen. So rufen Sie den MyApplication/EncryptDocument
-Dienst mit Java-Proxyklassen auf:
Erstellen Sie Java-Proxyklassen mit JAX-WS, die die WSDL des Dienstes MyApplication/EncryptDocument
verwenden. Verwenden Sie den folgenden WSDL-Endpunkt:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Ersetzen Sie hiro-xp
durch die IP-Adresse des J2EE-Anwendungsservers, auf dem AEM Forms gehostet wird.
Verpacken Sie die mit JAX-WS erstellten Java-Proxyklassen in einer JAR-Datei.
Schließen Sie die Java-Proxy-JAR-Datei und die JAR-Dateien im folgenden Pfad ein:
<install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
in den Klassenpfad Ihres Java-Client-Projekts.
Erstellen Sie ein Objekt MyApplicationEncryptDocumentService
, indem Sie den Konstruktor verwenden.
Erstellen Sie ein MyApplicationEncryptDocument
-Objekt, indem Sie die MyApplicationEncryptDocumentService
-Methode des Objekts getEncryptDocument
aufrufen.
Legen Sie die zum Aufrufen von AEM Forms erforderlichen Verbindungswerte fest, indem Sie den folgenden Datenmitgliedern Werte zuweisen:
Weisen Sie den WSDL-Endpunkt und den Kodierungstyp dem javax.xml.ws.BindingProvider
-Objektfeld ENDPOINT_ADDRESS_PROPERTY
zu. Um den MyApplication/EncryptDocument
-Dienst mit der Base64-Kodierung aufzurufen, geben Sie den folgenden URL-Wert an:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64
Weisen Sie den AEM Forms-Benutzer dem javax.xml.ws.BindingProvider
-Objektfeld USERNAME_PROPERTY
zu.
Weisen Sie den entsprechenden Kennwortwert dem javax.xml.ws.BindingProvider
-Objektfeld PASSWORD_PROPERTY
zu.
Das folgende Codebeispiel zeigt diese Anwendungslogik:
//Set connection values required to invoke AEM Forms
String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";
String username = "administrator";
String password = "password";
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
Rufen Sie das PDF-Dokument ab, das mit dem Konstruktor an den MyApplication/EncryptDocument
-Prozess gesendet werden soll, indem Sie ein java.io.FileInputStream
-Objekt erstellen. Übergeben Sie einen Zeichenfolgenwert, der den Speicherort des PDF-Dokuments angibt.
Erstellen Sie ein Bytearray und füllen Sie es mit dem Inhalt des Objekts java.io.FileInputStream
.
Erstellen Sie ein Objekt BLOB
, indem Sie den Konstruktor verwenden.
Füllen Sie das BLOB
-Objekt, indem Sie die setBinaryData
-Methode aufrufen und das Bytearray übergeben. Das BLOB
-Objekt setBinaryData
ist die Methode, die bei Verwendung der Base64-Kodierung aufgerufen wird. Siehe Bereitstellen von BLOB-Objekten in Dienstanforderungen.
Rufen Sie den Prozess MyApplication/EncryptDocument
auf, indem Sie die MyApplicationEncryptDocument
-Methode des Objekts invoke
aufrufen. Übergeben Sie das BLOB
-Objekt, das das PDF-Dokument enthält. Die invoke-Methode gibt ein BLOB
-Objekt zurück, das das verschlüsselte PDF-Dokument enthält.
Erstellen Sie ein Bytearray, das das verschlüsselte PDF-Dokument enthält, indem Sie die BLOB
-Objektmethode getBinaryData
aufrufen.
Speichern Sie das verschlüsselte PDF-Dokument als PDF-Datei. Schreiben Sie das Byte-Array in eine Datei.
Siehe auch
Quick Beginn: Aufrufen eines Dienstes mit Java-Proxydateien und Base64-Kodierung
Erstellen einer .NET-Client-Assembly, die Base64-Kodierung verwendet
Sie können AEM Forms-Dienste mit dem Webdienststandard MTOM aufrufen. Dieser Standard definiert, wie binäre Daten, wie z. B. ein PDF-Dokument, über das Internet oder Intranet übertragen werden. Eine Funktion von MTOM ist die Verwendung des Elements XOP:Include
. Dieses Element ist in der XML Binary Optimized Packaging (XOP)-Spezifikation definiert, um auf die binären Anlagen einer SOAP-Nachricht zu verweisen.
In der Diskussion geht es um die Verwendung von MTOM zum Aufrufen des folgenden AEM Forms-Prozesses mit kurzer Lebensdauer mit dem Namen MyApplication/EncryptDocument
.
Dieser Prozess basiert nicht auf einem vorhandenen AEM Forms-Prozess. Um dem Codebeispiel zu folgen, erstellen Sie einen Prozess mit dem Namen MyApplication/EncryptDocument
in Workbench. (Siehe Verwenden von Workbench.)
Wenn dieser Prozess aufgerufen wird, führt er die folgenden Aktionen aus:
SetValue
. Der Eingangsparameter für diesen Prozess ist eine document
-Prozessvariable mit dem Namen inDoc
.PasswordEncryptPDF
. Das kennwortverschlüsselte PDF-Dokument wird in einer Prozessvariablen namens outDoc
zurückgegeben.MTOM-Unterstützung wurde in AEM Forms Version 9 hinzugefügt.
JAX WS-basierte Anwendungen, die das MTOM-Übertragungsprotokoll verwenden, sind auf 25 MB der gesendeten und empfangenen Daten beschränkt. Diese Einschränkung ist auf einen Fehler in JAX-WS zurückzuführen. Wenn die Gesamtgröße Ihrer gesendeten und empfangenen Dateien 25 MB überschreitet, verwenden Sie das SwaRef-Übertragungsprotokoll anstelle des MTOM-Protokolls. Andernfalls besteht die Möglichkeit einer OutOfMemory
-Ausnahme.
In der Diskussion geht es um die Verwendung von MTOM innerhalb eines Microsoft .NET-Projekts zum Aufrufen von AEM Forms-Diensten. Das verwendete .NET-Framework ist 3.5 und die Development-Umgebung ist Visual Studio 2008. Wenn auf Ihrem Entwicklungscomputer Webdienstverbesserungen (WSE) installiert sind, entfernen Sie diese. Das .NET 3.5-Framework unterstützt ein SOAP-Framework namens Windows Communication Foundation (WCF). Beim Aufrufen von AEM Forms mithilfe von MTOM wird nur WCF (nicht WSE) unterstützt.
Sie können ein Microsoft .NET-Projekt erstellen, das einen AEM Forms-Dienst mithilfe von Webdiensten aufrufen kann. Erstellen Sie zunächst ein Microsoft .NET-Projekt mit Visual Studio 2008. Um einen AEM Forms-Dienst aufzurufen, erstellen Sie eine Dienstreferenz für den AEM Forms-Dienst, den Sie in Ihrem Projekt aufrufen möchten. Wenn Sie eine Dienstreferenz erstellen, geben Sie eine URL für den AEM Forms-Dienst an:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Ersetzen Sie localhost
durch die IP-Adresse des J2EE-Anwendungsservers, auf dem AEM Forms gehostet wird. Ersetzen Sie MyApplication/EncryptDocument
durch den Namen des aufzurufenden AEM Forms-Dienstes. Um beispielsweise einen Rights Management-Vorgang aufzurufen, geben Sie Folgendes an:
http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
Die Option lc_version
stellt sicher, dass AEM Forms-Funktionen wie MTOM verfügbar sind. Ohne Angabe der Option lc_version
können Sie AEM Forms nicht mit MTOM aufrufen.
Nachdem Sie eine Dienstreferenz erstellt haben, stehen mit dem AEM Forms-Dienst verknüpfte Datentypen für die Verwendung in Ihrem .NET-Projekt zur Verfügung. So erstellen Sie ein .NET-Projekt, das einen AEM Forms-Dienst aufruft:
Erstellen Sie ein .NET-Projekt mit Microsoft Visual Studio 2008.
Wählen Sie im Menü Projekt die Option Hinzufügen Service Reference.
Geben Sie im Dialogfeld Adresse die WSDL für den AEM Forms-Dienst an. Beispiel:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Klicken Sie auf Go und dann auf OK.
Berücksichtigen Sie den MyApplication/EncryptDocument
-Vorgang, bei dem ein unbesichertes PDF-Dokument akzeptiert und ein kennwortverschlüsseltes PDF-Dokument zurückgegeben wird. So rufen Sie den Prozess MyApplication/EncryptDocument
(der in Workbench erstellt wurde) mit MTOM auf:
Erstellen Sie ein Microsoft .NET-Projekt.
Erstellen Sie ein MyApplication_EncryptDocumentClient
-Objekt mit dem Standardkonstruktor.
Erstellen Sie ein MyApplication_EncryptDocumentClient.Endpoint.Address
-Objekt mit dem Konstruktor System.ServiceModel.EndpointAddress
. Übergeben Sie einen Zeichenfolgenwert, der den WSDL-Dienst und den Kodierungstyp angibt:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
Sie müssen das Attribut lc_version
nicht verwenden. Dieses Attribut wird verwendet, wenn Sie eine Dienstreferenz erstellen. Stellen Sie jedoch sicher, dass Sie ?blob=mtom
angeben.
Ersetzen Sie hiro-xp
durch die IP-Adresse des J2EE-Anwendungsservers, auf dem AEM Forms gehostet wird.
Erstellen Sie ein System.ServiceModel.BasicHttpBinding
-Objekt, indem Sie den Wert des EncryptDocumentClient.Endpoint.Binding
-Datenelements abrufen. Wandeln Sie den Rückgabewert in BasicHttpBinding
um.
Setzen Sie das System.ServiceModel.BasicHttpBinding
-Datenelement des Objekts MessageEncoding
auf WSMessageEncoding.Mtom
. Dieser Wert stellt sicher, dass MTOM verwendet wird.
Aktivieren Sie die einfache HTTP-Authentifizierung, indem Sie die folgenden Aufgaben ausführen:
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName
den AEM Forms-Benutzernamen zu.MyApplication_EncryptDocumentClient.ClientCredentials.UserName.Password
zu.BasicHttpBindingSecurity.Transport.ClientCredentialType
den Konstantenwert HttpClientCredentialType.Basic
zu.BasicHttpBindingSecurity.Security.Mode
den Konstantenwert BasicHttpSecurityMode.TransportCredentialOnly
zu.Das folgende Codebeispiel zeigt diese Aufgaben.
//Enable BASIC HTTP authentication
encryptProcess.ClientCredentials.UserName.UserName = "administrator";
encryptProcess.ClientCredentials.UserName.Password = "password";
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b.MaxReceivedMessageSize = 4000000;
b.MaxBufferSize = 4000000;
b.ReaderQuotas.MaxArrayLength = 4000000;
Erstellen Sie ein Objekt BLOB
, indem Sie den Konstruktor verwenden. Das BLOB
-Objekt wird zum Speichern eines PDF-Dokuments verwendet, das an den MyApplication/EncryptDocument
-Prozess übergeben wird.
Erstellen Sie ein System.IO.FileStream
-Objekt, indem Sie den Konstruktor aufrufen. Übergeben Sie einen Zeichenfolgenwert, der den Dateispeicherort des PDF-Dokuments und den Dateimodus darstellt, in dem die Datei geöffnet werden soll.
Erstellen Sie ein Bytearray, das den Inhalt des Objekts System.IO.FileStream
speichert. Sie können die Größe des Byte-Arrays bestimmen, indem Sie die System.IO.FileStream
-Eigenschaft des Objekts Length
abrufen.
Füllen Sie das Bytearray mit Stream-Daten, indem Sie die System.IO.FileStream
-Methode des Objekts Read
aufrufen. Übergeben Sie das Bytearray, die Startposition und die zu lesende Stream-Länge.
Füllen Sie das BLOB
-Objekt, indem Sie dessen MTOM
-Datenelement mit dem Inhalt des Byte-Arrays zuweisen.
Rufen Sie den Prozess MyApplication/EncryptDocument
auf, indem Sie die MyApplication_EncryptDocumentClient
-Methode des Objekts invoke
aufrufen. Übergeben Sie das BLOB
-Objekt, das das PDF-Dokument enthält. Dieser Vorgang gibt ein verschlüsseltes PDF-Dokument innerhalb eines BLOB
-Objekts zurück.
Erstellen Sie ein System.IO.FileStream
-Objekt, indem Sie den Konstruktor aufrufen und einen Zeichenfolgenwert übergeben, der den Dateispeicherort des geschützten PDF-Dokuments darstellt.
Erstellen Sie ein Bytearray, das den Dateninhalt des BLOB
-Objekts speichert, das von der invoke
-Methode zurückgegeben wurde. Füllen Sie das Bytearray, indem Sie den Wert des BLOB
-Datenelements des Objekts MTOM
abrufen.
Erstellen Sie ein System.IO.BinaryWriter
-Objekt, indem Sie den Konstruktor aufrufen und das System.IO.FileStream
-Objekt übergeben.
Schreiben Sie den Inhalt des Byte-Arrays in eine PDF-Datei, indem Sie die System.IO.BinaryWriter
-Methode des Objekts aufrufen und das Bytearray übergeben.Write
Die meisten AEM Forms-Dienstvorgänge verfügen über einen MTOM-Quick-Beginn. Sie können diese schnellen Beginn im entsprechenden Abschnitt für den schnellen Beginn eines Dienstes Ansicht haben. Informationen zum schnellen Beginn der Ausgabe finden Sie unter Schnellere Beginn zur API des Output-Dienstes.
Siehe auch
Quick Beginn: Aufrufen eines Dienstes mit MTOM in einem .NET-Projekt
Zugreifen auf mehrere Dienste mithilfe von Webdiensten
Sie können AEM Forms-Dienste mit SwaRef aufrufen. Der Inhalt des XML-Elements wsi:swaRef
wird als Anlage innerhalb eines SOAP-Textkörpers gesendet, in dem der Verweis auf die Anlage gespeichert wird. Wenn Sie einen Forms-Dienst mit SwaRef aufrufen, erstellen Sie Java-Proxyklassen mithilfe der Java-API für XML-Webdienste (JAX-WS). (Siehe Java-API für XML-Webdienste.)
Die Diskussion hier handelt davon, den folgenden Forms-Prozess mit kurzer Lebensdauer mit dem Namen MyApplication/EncryptDocument
durch Verwendung von SwaRef aufzurufen.
Dieser Prozess basiert nicht auf einem vorhandenen AEM Forms-Prozess. Um dem Codebeispiel zu folgen, erstellen Sie einen Prozess mit dem Namen MyApplication/EncryptDocument
in Workbench. (Siehe Verwenden von Workbench.)
Wenn dieser Prozess aufgerufen wird, führt er die folgenden Aktionen aus:
SetValue
. Der Eingangsparameter für diesen Prozess ist eine document
-Prozessvariable mit dem Namen inDoc
.PasswordEncryptPDF
. Das kennwortverschlüsselte PDF-Dokument wird in einer Prozessvariablen namens outDoc
zurückgegeben.SwaRef-Unterstützung in AEM Forms hinzugefügt
In der folgenden Diskussion wird beschrieben, wie Sie Forms-Dienste aufrufen, indem Sie SwaRef in einer Java-Clientanwendung verwenden. Die Java-Anwendung verwendet Proxyklassen, die mit JAX-WS erstellt wurden.
So rufen Sie den Prozess MyApplication/EncryptDocument
mithilfe von Java-Proxydateien auf, die mit JAX-WS und SwaRef erstellt wurden:
Erstellen Sie Java-Proxyklassen mit JAX-WS, die die WSDL des Dienstes MyApplication/EncryptDocument
verwenden. Verwenden Sie den folgenden WSDL-Endpunkt:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Weitere Informationen finden Sie unter Java-Proxyklassen mit JAX-WS erstellen.
Ersetzen Sie hiro-xp
durch die IP-Adresse des J2EE-Anwendungsservers, auf dem AEM Forms gehostet wird.
Verpacken Sie die mit JAX-WS erstellten Java-Proxyklassen in einer JAR-Datei.
Schließen Sie die Java-Proxy-JAR-Datei und die JAR-Dateien im folgenden Pfad ein:
<install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
in den Klassenpfad Ihres Java-Client-Projekts.
Erstellen Sie ein Objekt MyApplicationEncryptDocumentService
, indem Sie den Konstruktor verwenden.
Erstellen Sie ein MyApplicationEncryptDocument
-Objekt, indem Sie die MyApplicationEncryptDocumentService
-Methode des Objekts getEncryptDocument
aufrufen.
Legen Sie die zum Aufrufen von AEM Forms erforderlichen Verbindungswerte fest, indem Sie den folgenden Datenmitgliedern Werte zuweisen:
Weisen Sie den WSDL-Endpunkt und den Kodierungstyp dem javax.xml.ws.BindingProvider
-Objektfeld ENDPOINT_ADDRESS_PROPERTY
zu. Um den MyApplication/EncryptDocument
-Dienst mit der SwaRef-Kodierung aufzurufen, geben Sie den folgenden URL-Wert an:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref
Weisen Sie den AEM Forms-Benutzer dem javax.xml.ws.BindingProvider
-Objektfeld USERNAME_PROPERTY
zu.
Weisen Sie den entsprechenden Kennwortwert dem javax.xml.ws.BindingProvider
-Objektfeld PASSWORD_PROPERTY
zu.
Das folgende Codebeispiel zeigt diese Anwendungslogik:
//Set connection values required to invoke AEM Forms
String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref";
String username = "administrator";
String password = "password";
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
Rufen Sie das PDF-Dokument ab, das mit dem Konstruktor an den MyApplication/EncryptDocument
-Prozess gesendet werden soll, indem Sie ein java.io.File
-Objekt erstellen. Übergeben Sie einen Zeichenfolgenwert, der den Speicherort des PDF-Dokuments angibt.
Erstellen Sie ein javax.activation.DataSource
-Objekt mit dem Konstruktor FileDataSource
. Übergeben Sie das java.io.File
-Objekt.
Erstellen Sie ein javax.activation.DataHandler
-Objekt, indem Sie seinen Konstruktor verwenden und das javax.activation.DataSource
-Objekt übergeben.
Erstellen Sie ein Objekt BLOB
, indem Sie den Konstruktor verwenden.
Füllen Sie das BLOB
-Objekt, indem Sie die setSwaRef
-Methode aufrufen und das javax.activation.DataHandler
-Objekt übergeben.
Rufen Sie den MyApplication/EncryptDocument
-Prozess auf, indem Sie die MyApplicationEncryptDocument
-Objektmethode invoke
aufrufen und das BLOB
-Objekt übergeben, das das PDF-Dokument enthält. Die invoke-Methode gibt ein BLOB
-Objekt zurück, das ein verschlüsseltes PDF-Dokument enthält.
Füllen Sie ein javax.activation.DataHandler
-Objekt, indem Sie die BLOB
-Methode des Objekts getSwaRef
aufrufen.
Konvertieren Sie das javax.activation.DataHandler
-Objekt in eine java.io.InputSteam
-Instanz, indem Sie die javax.activation.DataHandler
-Methode des Objekts aufrufen.getInputStream
Schreiben Sie die java.io.InputSteam
-Instanz in eine PDF-Datei, die das verschlüsselte PDF-Dokument darstellt.
Die meisten AEM Forms-Dienstvorgänge verfügen über einen SwaRef-Beginn. Sie können diese schnellen Beginn im entsprechenden Abschnitt für den schnellen Beginn eines Dienstes Ansicht haben. Informationen zum schnellen Beginn der Ausgabe finden Sie unter Schnellere Beginn zur API des Output-Dienstes.
Siehe auch
Quick Beginn: Aufrufen eines Dienstes mit SwaRef in einem Java-Projekt
Sie können AEM Forms-Dienste über Webdienste aufrufen und BLOB-Daten über HTTP weiterleiten. Das Übergeben von BLOB-Daten über HTTP ist eine alternative Methode, anstatt Base64-Kodierung, DIME oder MIME zu verwenden. Sie können beispielsweise Daten über HTTP in einem Microsoft .NET-Projekt übermitteln, das Web Service Enhancement 3.0 verwendet, das DIME oder MIME nicht unterstützt. Bei Verwendung von BLOB-Daten über HTTP werden Eingabedaten hochgeladen, bevor der AEM Forms-Dienst aufgerufen wird.
"Invoking AEM Forms using BLOB Data over HTTP"beschreibt den Aufruf des folgenden AEM Forms-Prozesses mit kurzer Lebensdauer MyApplication/EncryptDocument
durch Übergabe von BLOB-Daten über HTTP.
Dieser Prozess basiert nicht auf einem vorhandenen AEM Forms-Prozess. Um dem Codebeispiel zu folgen, erstellen Sie einen Prozess mit dem Namen MyApplication/EncryptDocument
in Workbench. (Siehe Verwenden von Workbench.)
Wenn dieser Prozess aufgerufen wird, führt er die folgenden Aktionen aus:
SetValue
. Der Eingangsparameter für diesen Prozess ist eine document
-Prozessvariable mit dem Namen inDoc
.PasswordEncryptPDF
. Das kennwortverschlüsselte PDF-Dokument wird in einer Prozessvariablen namens outDoc
zurückgegeben.Es wird empfohlen, mit Invoking AEM Forms using SOAP vertraut zu sein. (Siehe Aufrufen von AEM Forms mithilfe von Web-Services.)
Um eine Client-Assembly zu erstellen, die Daten über HTTP verwendet, führen Sie den unter Aufrufen von AEM Forms mit Base64-Kodierung angegebenen Prozess aus. Ändern Sie jedoch die URL in der Proxyklasse so, dass ?blob=http
anstelle von ?blob=base64
eingefügt wird. Diese Aktion stellt sicher, dass Daten über HTTP weitergegeben werden. Suchen Sie in der Proxyklasse die folgende Codezeile:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument";
und ändern Sie sie in:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument?blob=http";
Referenz der .NET clienMyApplication/EncryptDocument-Assembly
Platzieren Sie die neue .NET-Clientassembly auf dem Computer, auf dem Sie die Clientanwendung entwickeln. Nachdem Sie die .NET-Clientassembly in einem Verzeichnis abgelegt haben, können Sie von einem Projekt aus darauf verweisen. Verweisen Sie auf die System.Web.Services
-Bibliothek aus Ihrem Projekt. Wenn Sie diese Bibliothek nicht referenzieren, können Sie die .NET-Client-Assembly nicht zum Aufrufen eines Dienstes verwenden.
Aufrufen eines Dienstes mit einer .NET-Client-Assembly, die BLOB-Daten über HTTP verwendet
Sie können den Dienst MyApplication/EncryptDocument
(der in Workbench erstellt wurde) mit einer .NET-Client-Assembly aufrufen, die Daten über HTTP verwendet. So rufen Sie den Dienst MyApplication/EncryptDocument
auf:
System.Web.Services
.MyApplication_EncryptDocumentService
-Objekt, indem Sie dessen Standardkonstruktor aufrufen.MyApplication_EncryptDocumentService
des Objekts Credentials
mit einem Objekt System.Net.NetworkCredential
fest. Geben Sie im Konstruktor System.Net.NetworkCredential
einen AEM Forms-Benutzernamen und das entsprechende Kennwort ein. Legen Sie Authentifizierungswerte fest, damit Ihre .NET-Clientanwendung SOAP-Nachrichten erfolgreich mit AEM Forms austauschen kann.BLOB
, indem Sie den Konstruktor verwenden. Das BLOB
-Objekt wird verwendet, um Daten an den MyApplication/EncryptDocument
-Prozess zu übergeben.BLOB
-Datenelement des Objekts remoteURL
einen Zeichenfolgenwert zu, der den URI-Speicherort eines PDF-Dokuments angibt, das an den MyApplication/EncryptDocument
Dienst übergeben wird.MyApplication/EncryptDocument
auf, indem Sie die MyApplication_EncryptDocumentService
-Methode des Objekts invoke
aufrufen und das BLOB
-Objekt übergeben. Dieser Vorgang gibt ein verschlüsseltes PDF-Dokument innerhalb eines BLOB
-Objekts zurück.System.UriBuilder
-Objekt, indem Sie dessen Konstruktor verwenden und den Wert des BLOB
-Datenelements des zurückgegebenen remoteURL
-Objekts übergeben.System.UriBuilder
-Objekt in ein System.IO.Stream
-Objekt. (Der C# Quick-Beginn, der dieser Liste folgt, zeigt, wie diese Aufgabe ausgeführt wird.)System.IO.Stream
-Objekt.System.IO.BinaryWriter
-Objekt, indem Sie den Konstruktor aufrufen und das System.IO.FileStream
-Objekt übergeben.System.IO.BinaryWriter
-Methode des Objekts aufrufen und das Bytearray übergeben.Write
Sie können einen AEM Forms-Dienst über Java-Proxyklassen und BLOB-Daten über HTTP aufrufen. So rufen Sie den MyApplication/EncryptDocument
-Dienst mit Java-Proxyklassen auf:
Erstellen Sie Java-Proxyklassen mit JAX-WS, die die WSDL des Dienstes MyApplication/EncryptDocument
verwenden. Verwenden Sie den folgenden WSDL-Endpunkt:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Weitere Informationen finden Sie unter Java-Proxyklassen mit JAX-WS erstellen.
Ersetzen Sie hiro-xp
durch die IP-Adresse des J2EE-Anwendungsservers, auf dem AEM Forms gehostet wird.
Verpacken Sie die mit JAX-WS erstellten Java-Proxyklassen in einer JAR-Datei.
Schließen Sie die Java-Proxy-JAR-Datei und die JAR-Dateien im folgenden Pfad ein:
<install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
in den Klassenpfad Ihres Java-Client-Projekts.
Erstellen Sie ein Objekt MyApplicationEncryptDocumentService
, indem Sie den Konstruktor verwenden.
Erstellen Sie ein MyApplicationEncryptDocument
-Objekt, indem Sie die MyApplicationEncryptDocumentService
-Methode des Objekts getEncryptDocument
aufrufen.
Legen Sie die zum Aufrufen von AEM Forms erforderlichen Verbindungswerte fest, indem Sie den folgenden Datenmitgliedern Werte zuweisen:
Weisen Sie den WSDL-Endpunkt und den Kodierungstyp dem javax.xml.ws.BindingProvider
-Objektfeld ENDPOINT_ADDRESS_PROPERTY
zu. Um den MyApplication/EncryptDocument
-Dienst mit BLOB über HTTP-Kodierung aufzurufen, geben Sie den folgenden URL-Wert an:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http
Weisen Sie den AEM Forms-Benutzer dem javax.xml.ws.BindingProvider
-Objektfeld USERNAME_PROPERTY
zu.
Weisen Sie den entsprechenden Kennwortwert dem javax.xml.ws.BindingProvider
-Objektfeld PASSWORD_PROPERTY
zu.
Das folgende Codebeispiel zeigt diese Anwendungslogik:
//Set connection values required to invoke AEM Forms
String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http";
String username = "administrator";
String password = "password";
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
Erstellen Sie ein Objekt BLOB
, indem Sie den Konstruktor verwenden.
Füllen Sie das BLOB
-Objekt, indem Sie die zugehörige setRemoteURL
-Methode aufrufen. Übergeben Sie einen Zeichenfolgenwert, der den URI-Speicherort eines PDF-Dokuments angibt, das an den MyApplication/EncryptDocument
-Dienst übergeben wird.
Rufen Sie den MyApplication/EncryptDocument
-Prozess auf, indem Sie die MyApplicationEncryptDocument
-Objektmethode invoke
aufrufen und das BLOB
-Objekt übergeben, das das PDF-Dokument enthält. Dieser Vorgang gibt ein verschlüsseltes PDF-Dokument innerhalb eines BLOB
-Objekts zurück.
Erstellen Sie ein Bytearray, um den Datenstrom zu speichern, der das verschlüsselte PDF-Dokument darstellt. Rufen Sie die BLOB
-Methode des Objekts auf (verwenden Sie das getRemoteURL
-Objekt, das von der invoke
-Methode zurückgegeben wird).BLOB
Erstellen Sie ein Objekt java.io.File
, indem Sie den Konstruktor verwenden. Dieses Objekt stellt das verschlüsselte PDF-Dokument dar.
Erstellen Sie ein java.io.FileOutputStream
-Objekt, indem Sie seinen Konstruktor verwenden und das java.io.File
-Objekt übergeben.
Rufen Sie die java.io.FileOutputStream
-Methode des Objekts write
auf. Übergeben Sie das Bytearray, das den Datenstrom enthält, der das verschlüsselte PDF-Dokument darstellt.
Sie können AEM Forms-Dienste mit SOAP mit Anlagen aufrufen. AEM Forms unterstützt sowohl MIME- als auch DIME-Webdienststandards. Mit DIME können Sie Binäranlagen wie PDF-Dokumente zusammen mit Aufrufanforderungen senden, anstatt die Anlage zu kodieren. Im Abschnitt Aufrufen von AEM Forms mit DIME wird das Aufrufen des folgenden AEM Forms-Prozesses mit kurzer Lebensdauer mit dem Namen MyApplication/EncryptDocument
mithilfe von DIME besprochen.
Wenn dieser Prozess aufgerufen wird, führt er die folgenden Aktionen aus:
SetValue
. Der Eingangsparameter für diesen Prozess ist eine document
-Prozessvariable mit dem Namen inDoc
.PasswordEncryptPDF
. Das kennwortverschlüsselte PDF-Dokument wird in einer Prozessvariablen namens outDoc
zurückgegeben.Dieser Prozess basiert nicht auf einem vorhandenen AEM Forms-Prozess. Um mit den Codebeispielen zu folgen, erstellen Sie einen Prozess mit dem Namen MyApplication/EncryptDocument
mithilfe von Workbench. (Siehe Verwenden von Workbench.)
Das Aufrufen von AEM Forms-Dienstvorgängen mit DIME ist veraltet. Es wird empfohlen, MTOM zu verwenden. (Siehe Aufrufen von AEM Forms mit MTOM.)
So erstellen Sie ein .NET-Projekt, das einen Forms-Dienst mit DIME aufrufen kann:
Web-Services-Verbesserungen installieren 2.0
Installieren Sie Web Services Enhancements 2.0 auf Ihrem Entwicklungscomputer und integrieren Sie es in Microsoft Visual Studio .NET. Sie können Web-Services-Verbesserungen 2.0 vom Microsoft Download Center herunterladen.
Suchen Sie auf dieser Webseite nach Web Services Enhancements 2.0 und laden Sie es auf Ihren Entwicklungscomputer herunter. Durch diesen Download wird eine Datei mit dem Namen Microsoft WSE 2.0 SPI.msi auf Ihrem Computer gespeichert. Führen Sie das Programm aus und befolgen Sie die Online-Anweisungen.
Web-Services-Erweiterungen 2.0 unterstützen DIME. Die unterstützte Version von Microsoft Visual Studio ist 2003, wenn mit Web Services Enhancements 2.0 gearbeitet wird. Web Services Enhancements 3.0 unterstützt DIME nicht. jedoch unterstützt es MTOM.
Erstellen von Webverweisen auf einen AEM Forms-Dienst
Nachdem Sie Web Services Enhancements 2.0 auf Ihrem Entwicklungscomputer installiert und ein Microsoft .NET-Projekt erstellt haben, erstellen Sie einen Webverweis auf den Forms-Dienst. Um beispielsweise einen Webverweis auf den MyApplication/EncryptDocument
-Prozess zu erstellen und vorausgesetzt, dass Forms auf dem lokalen Computer installiert ist, geben Sie die folgende URL an:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL
Nachdem Sie einen Webverweis erstellt haben, stehen Ihnen die folgenden zwei Proxydatentypen zur Verfügung, die Sie in Ihrem .NET-Projekt verwenden können: EncryptDocumentService
und EncryptDocumentServiceWse
. Um den MyApplication/EncryptDocument
-Prozess mit DIME aufzurufen, verwenden Sie den EncryptDocumentServiceWse
-Typ.
Bevor Sie einen Webverweis auf den Forms-Dienst erstellen, vergewissern Sie sich, dass Sie in Ihrem Projekt auf Web-Services-Verbesserungen 2.0 verweisen. (Siehe "Installieren von Web-Services-Erweiterungen 2.0".)
Referenzieren der WSE-Bibliothek
Webverweis auf einen Forms-Dienst erstellen
Stellen Sie sicher, dass Sie die Verwendung der WSE-Bibliothek für Ihr .NET-Projekt aktivieren. Klicken Sie im Project Explorer mit der rechten Maustaste auf den Projektnamen und wählen Sie WSE 2.0 aktivieren. Stellen Sie sicher, dass das Kontrollkästchen im angezeigten Dialogfeld aktiviert ist.
Aufrufen eines Dienstes mit DIME in einem .NET-Projekt
Sie können einen Forms-Dienst mit DIME aufrufen. Berücksichtigen Sie den MyApplication/EncryptDocument
-Vorgang, bei dem ein unbesichertes PDF-Dokument akzeptiert und ein kennwortverschlüsseltes PDF-Dokument zurückgegeben wird. So rufen Sie den MyApplication/EncryptDocument
-Prozess mit DIME auf:
Erstellen Sie ein Microsoft .NET-Projekt, mit dem Sie einen Forms-Dienst mit DIME aufrufen können. Stellen Sie sicher, dass Sie Web-Services-Verbesserungen 2.0 einbeziehen und einen Webverweis auf den AEM Forms-Dienst erstellen.
Nachdem Sie einen Webverweis auf den MyApplication/EncryptDocument
-Prozess festgelegt haben, erstellen Sie ein EncryptDocumentServiceWse
-Objekt mit dem Standardkonstruktor.
Legen Sie den Datenmember des Objekts Credentials
mit dem Wert System.Net.NetworkCredential
fest, der den Benutzernamen und das Kennwort für AEM Formulare angibt.EncryptDocumentServiceWse
Erstellen Sie ein Microsoft.Web.Services2.Dime.DimeAttachment
-Objekt, indem Sie den Konstruktor verwenden und die folgenden Werte übergeben:
System.Guid.NewGuid.ToString
-Methode aufrufen.application/pdf
an.TypeFormat
-Auflistung-Wert. Geben Sie Folgendes an TypeFormat.MediaType
.Erstellen Sie ein Objekt BLOB
, indem Sie den Konstruktor verwenden.
hinzufügen Sie die DIME-Anlage zum BLOB
-Objekt, indem Sie den Microsoft.Web.Services2.Dime.DimeAttachment
-Datenelementwert des Id
-Objekts dem BLOB
-Datenmember des Objekts attachmentID
zuweisen.
Rufen Sie die EncryptDocumentServiceWse.RequestSoapContext.Attachments.Add
-Methode auf und übergeben Sie das Microsoft.Web.Services2.Dime.DimeAttachment
-Objekt.
Rufen Sie den Prozess MyApplication/EncryptDocument
auf, indem Sie die EncryptDocumentServiceWse
-Methode des Objekts invoke
aufrufen und das BLOB
-Objekt übergeben, das die DIME-Anlage enthält. Dieser Vorgang gibt ein verschlüsseltes PDF-Dokument innerhalb eines BLOB
-Objekts zurück.
Rufen Sie den Wert für den Anlagenbezeichner ab, indem Sie den Wert des BLOB
-Datenelements des zurückgegebenen attachmentID
-Objekts abrufen.
Durchlaufen Sie die Anlagen in EncryptDocumentServiceWse.ResponseSoapContext.Attachments
und verwenden Sie den Wert für die Anlagenkennung, um das verschlüsselte PDF-Dokument abzurufen.
Rufen Sie ein System.IO.Stream
-Objekt ab, indem Sie den Wert des Attachment
-Datenelements des Objekts Stream
abrufen.
Erstellen Sie ein Bytearray und übergeben Sie dieses Bytearray an die System.IO.Stream
-Methode des Objekts Read
. Diese Methode füllt das Bytearray mit einem Datenstrom, der das verschlüsselte PDF-Dokument darstellt.
Erstellen Sie ein System.IO.FileStream
-Objekt, indem Sie den Konstruktor aufrufen und einen Zeichenfolgenwert übergeben, der den Speicherort einer PDF-Datei darstellt. Dieses Objekt stellt das verschlüsselte PDF-Dokument dar.
Erstellen Sie ein System.IO.BinaryWriter
-Objekt, indem Sie den Konstruktor aufrufen und das System.IO.FileStream
-Objekt übergeben.
Schreiben Sie den Inhalt des Byte-Arrays in die PDF-Datei, indem Sie die Write
-Methode des Objekts aufrufen und das Bytearray übergeben.System.IO.BinaryWriter
Mit dem Apache Axis WSDL2Java-Tool können Sie einen Dienst-WSDL in Java-Proxyklassen konvertieren, damit Sie Dienstvorgänge aufrufen können. Mit Apache Ant können Sie Axis-Bibliotheksdateien aus einer AEM Forms-Dienst-WSDL generieren, mit der Sie den Dienst aufrufen können. (Siehe Java-Proxyklassen mit Apache Axis erstellen.)
Das Apache Axis WSDL2Java-Tool generiert JAVA-Dateien, die Methoden enthalten, mit denen SOAP-Anforderungen an einen Dienst gesendet werden. SOAP-Anforderungen, die von einem Dienst empfangen werden, werden von den Axis-generierten Bibliotheken dekodiert und in die Methoden und Argumente zurückumgewandelt.
So rufen Sie den Dienst MyApplication/EncryptDocument
(der in Workbench erstellt wurde) mit Axis-generierten Bibliotheksdateien und DIME auf:
Erstellen Sie Java-Proxyklassen, die die WSDL des MyApplication/EncryptDocument
-Dienstes mit Apache Axis verwenden. (Siehe Java-Proxyklassen mit Apache Axis erstellen.)
Schließen Sie die Java-Proxyklassen in Ihren Klassenpfad ein.
Erstellen Sie ein Objekt MyApplicationEncryptDocumentServiceLocator
, indem Sie den Konstruktor verwenden.
Erstellen Sie ein URL
-Objekt, indem Sie dessen Konstruktor verwenden und einen Zeichenfolgenwert übergeben, der die WSDL-Definition des AEM Forms-Dienstes angibt. Stellen Sie sicher, dass Sie ?blob=dime
am Ende der SOAP-Endpunkt-URL angeben. Beispiele
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
Erstellen Sie ein EncryptDocumentSoapBindingStub
-Objekt, indem Sie den Konstruktor aufrufen und das MyApplicationEncryptDocumentServiceLocator
- und das URL
-Objekt übergeben.
Legen Sie den AEM forms-Benutzernamen und -Kennwortwert fest, indem Sie die setUsername
- und setPassword
-Methoden des Objekts aufrufen.EncryptDocumentSoapBindingStub
encryptionClientStub.setUsername("administrator");
encryptionClientStub.setPassword("password");
Rufen Sie das PDF-Dokument ab, das an den MyApplication/EncryptDocument
-Dienst gesendet werden soll, indem Sie ein java.io.File
-Objekt erstellen. Übergeben Sie einen Zeichenfolgenwert, der den Speicherort des PDF-Dokuments angibt.
Erstellen Sie ein javax.activation.DataHandler
-Objekt, indem Sie den Konstruktor verwenden und ein javax.activation.FileDataSource
-Objekt übergeben. Das javax.activation.FileDataSource
-Objekt kann mithilfe des Konstruktors erstellt und das java.io.File
-Objekt, das das PDF-Dokument darstellt, übergeben werden.
Erstellen Sie ein org.apache.axis.attachments.AttachmentPart
-Objekt, indem Sie den Konstruktor verwenden und das javax.activation.DataHandler
-Objekt übergeben.
Hängen Sie die Anlage an, indem Sie die EncryptDocumentSoapBindingStub
-Methode des Objekts addAttachment
aufrufen und das org.apache.axis.attachments.AttachmentPart
-Objekt übergeben.
Erstellen Sie ein Objekt BLOB
, indem Sie den Konstruktor verwenden. Füllen Sie das BLOB
-Objekt mit dem Wert für den Anlagenbezeichner, indem Sie die setAttachmentID
-Methode des Objekts aufrufen und den Wert für den Anlagenbezeichner übergeben. BLOB
Dieser Wert kann durch Aufrufen der org.apache.axis.attachments.AttachmentPart
-Objektmethode getContentId
abgerufen werden.
Rufen Sie den Prozess MyApplication/EncryptDocument
auf, indem Sie die EncryptDocumentSoapBindingStub
-Methode des Objekts invoke
aufrufen. Übergeben Sie das BLOB
-Objekt, das die DIME-Anlage enthält. Dieser Vorgang gibt ein verschlüsseltes PDF-Dokument innerhalb eines BLOB
-Objekts zurück.
Rufen Sie den Wert für den Anlagenbezeichner ab, indem Sie die BLOB
-Methode des zurückgegebenen Objekts getAttachmentID
aufrufen. Diese Methode gibt einen Zeichenfolgenwert zurück, der den Bezeichnerwert der zurückgegebenen Anlage darstellt.
Rufen Sie die Anlagen ab, indem Sie die EncryptDocumentSoapBindingStub
-Methode des Objekts getAttachments
aufrufen. Diese Methode gibt ein Array von Objects
zurück, das die Anlagen darstellt.
Durchlaufen Sie die Anlagen (das Object
-Array) und verwenden Sie den Wert für den Anlagenbezeichner, um das verschlüsselte PDF-Dokument abzurufen. Jedes Element ist ein org.apache.axis.attachments.AttachmentPart
-Objekt.
Rufen Sie das mit der Anlage verknüpfte javax.activation.DataHandler
-Objekt ab, indem Sie die getDataHandler
-Methode des Objekts aufrufen.org.apache.axis.attachments.AttachmentPart
Rufen Sie ein java.io.FileStream
-Objekt ab, indem Sie die javax.activation.DataHandler
-Methode des Objekts getInputStream
aufrufen.
Erstellen Sie ein Bytearray und übergeben Sie dieses Bytearray an die java.io.FileStream
-Methode des Objekts read
. Diese Methode füllt das Bytearray mit einem Datenstrom, der das verschlüsselte PDF-Dokument darstellt.
Erstellen Sie ein Objekt java.io.File
, indem Sie den Konstruktor verwenden. Dieses Objekt stellt das verschlüsselte PDF-Dokument dar.
Erstellen Sie ein java.io.FileOutputStream
-Objekt, indem Sie seinen Konstruktor verwenden und das java.io.File
-Objekt übergeben.
Rufen Sie die write
-Methode des Objekts auf und übergeben Sie das Bytearray, das den Datenstrom enthält, der das verschlüsselte PDF-Dokument darstellt.java.io.FileOutputStream
Siehe auch
Quick Beginn: Aufrufen eines Dienstes mit DIME in einem Java-Projekt
AEM Forms unterstützt beim Aufrufen von Diensten verschiedene Webdienst-Authentifizierungsmodi. Ein Authentifizierungsmodus gibt sowohl einen Benutzernamen- als auch einen Kennwortwert mithilfe eines einfachen Autorisierungsheaders im Webdienstaufruf an. AEM Forms unterstützt auch die Assertionsbasierte Authentifizierung von SAML. Wenn eine Clientanwendung einen AEM Forms-Dienst mithilfe eines Webdiensts aufruft, kann die Clientanwendung Authentifizierungsinformationen auf eine der folgenden Arten bereitstellen:
AEM Forms unterstützt keine standardmäßige zertifikatbasierte Authentifizierung, unterstützt aber eine zertifikatbasierte Authentifizierung in einem anderen Formular.
Die Beginn des Webdiensts "Schnellprogrammierung mit AEM Forms"geben die Werte für Benutzername und Kennwort an, um eine Autorisierung durchzuführen.
Die Identität AEM Formularbenutzer kann durch eine SAML-Zusicherung dargestellt werden, die mit einem geheimen Schlüssel signiert wurde. Der folgende XML-Code zeigt ein Beispiel für eine SAML-Zusicherung.
<Assertion xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
AssertionID="fd4bd0c87302780e0d9bbfa8726d5bc0" IssueInstant="2008-04-17T13:47:00.720Z" Issuer="LiveCycle"
MajorVersion="1" MinorVersion="1">
<Conditions NotBefore="2008-04-17T13:47:00.720Z" NotOnOrAfter="2008-04-17T15:47:00.720Z">
</Conditions>
<AuthenticationStatement
AuthenticationInstant="2008-04-17T13:47:00.720Z"
AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:unspecified">
<Subject>
<NameIdentifier NameQualifier="DefaultDom">administrator</NameIdentifier>
<SubjectConfirmation>
<ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:sender-vouches</ConfirmationMethod>
</SubjectConfirmation>
</Subject>
</AuthenticationStatement>
<ds:Signature >
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#hmac-sha1"></ds:SignatureMethod>
<ds:Reference URI="#fd4bd0c87302780e0d9bbfa8726d5bc0">
<ds:Transforms>
<ds:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
<ds:Transform Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces
PrefixList="code ds kind rw saml samlp typens #default">
</ec:InclusiveNamespaces>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
<ds:DigestValue>hVrtqjWr+VzaVUIpQx0YI9lIjaY=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>UMbBb+cUcPtcWDCIhXes4n4FxfU=</ds:SignatureValue>
</ds:Signature>
</Assertion>
Diese Beispielassertion wird für einen Administratorbenutzer ausgegeben. Diese Zusicherung enthält die folgenden bemerkenswerten Elemente:
Eine Clientanwendung kann die Zusicherung von jeder AEM Forms AuthenticationManager-API abrufen, die ein AuthResult
-Objekt zurückgibt. Sie können eine AuthResult
-Instanz abrufen, indem Sie eine der beiden folgenden Methoden ausführen:
AuthenticationManager.getAuthResultOnBehalfOfUser
-Methode. Mit dieser Methode kann eine Client-Anwendung ein AuthResult
-Objekt für jeden AEM Forms-Benutzer abrufen.Ein AEM Forms-Benutzer kann mit einem SAML-Token authentifiziert werden, das abgerufen wird. Diese SAML-Zusicherung (XML-Fragment) kann als Teil des WS-Security-Headers mit dem Webdienst-Aufruf zur Benutzerauthentifizierung gesendet werden. Normalerweise hat eine Clientanwendung einen Benutzer authentifiziert, die Benutzerberechtigungen jedoch nicht gespeichert. (Oder der Benutzer hat sich über einen anderen Mechanismus als den Benutzernamen und das Kennwort bei diesem Client angemeldet.) In diesem Fall muss die Clientanwendung AEM Forms aufrufen und einen bestimmten Benutzer imitieren, der AEM Forms aufrufen darf.
Um die Identität eines bestimmten Benutzers zu imitieren, rufen Sie die AuthenticationManager.getAuthResultOnBehalfOfUser
-Methode mit einem Webdienst auf. Diese Methode gibt eine AuthResult
-Instanz zurück, die die SAML-Zusicherung für diesen Benutzer enthält.
Verwenden Sie anschließend diese SAML-Zusicherung, um alle Dienste aufzurufen, für die eine Authentifizierung erforderlich ist. Diese Aktion umfasst das Senden der Zusicherung als Teil des SOAP-Headers. Wenn mit dieser Zusicherung ein Webdienstaufruf erfolgt, identifiziert AEM Forms den Benutzer als den Benutzer, der durch diese Zusicherung repräsentiert wird. Das heißt, der in der Zusicherung angegebene Benutzer ist der Benutzer, der den Dienst aufruft.
Sie können einen AEM Forms-Dienst von Java-Proxyklassen aufrufen, die mit der Achsenbibliothek erstellt wurden. (Siehe Java-Proxyklassen mit Apache Axis erstellen.)
Wenn Sie AXIS mit SAML-basierter Authentifizierung verwenden, registrieren Sie den Anforderungs- und Antworthandler bei Axis. Apache Axis ruft den Handler auf, bevor eine Aufrufanforderung an AEM Forms gesendet wird. Um einen Handler zu registrieren, erstellen Sie eine Java-Klasse, die org.apache.axis.handlers.BasicHandler
erweitert.
Erstellen eines AssertionHandlers mit Axis
Die folgende Java-Klasse mit dem Namen AssertionHandler.java
zeigt ein Beispiel einer Java-Klasse, die org.apache.axis.handlers.BasicHandler
erweitert.
public class AssertionHandler extends BasicHandler {
public void invoke(MessageContext ctx) throws AxisFault {
String assertion = (String) ctx.getProperty(LC_ASSERTION);
//no assertion hence nothing to insert
if(assertion == null) return;
try {
MessageElement samlElement = new MessageElement(convertToXML(assertion));
SOAPHeader header = (SOAPHeader) ctx.getRequestMessage().getSOAPHeader();
//Create the wsse:Security element which would contain the SAML element
SOAPElement wsseHeader = header.addChildElement("Security", "wsse", WSSE_NS);
wsseHeader.appendChild(samlElement);
//remove the actor attribute as in LC we do not specify any actor. This would not remove the actor attribute though
//it would only remove it from the soapenv namespace
wsseHeader.getAttributes().removeNamedItem("actor");
} catch (SOAPException e) {
throw new AxisFault("Error occured while adding the assertion to the SOAP Header",e);
}
}
}
Handler registrieren
Um einen Handler mit Axis zu registrieren, erstellen Sie eine Datei "client-config.wsd". Standardmäßig sucht Axis nach einer Datei mit diesem Namen. Der folgende XML-Code ist ein Beispiel für eine Datei "client-config.wsd". Weitere Informationen finden Sie in der Achsendokumentation.
<deployment xmlns="https://xml.apache.org/axis/wsdd/" xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<globalConfiguration >
<requestFlow >
<handler type="java:com.adobe.idp.um.example.AssertionHandler" />
</requestFlow >
</globalConfiguration >
</deployment>
Aufrufen eines AEM Forms-Dienstes
Im folgenden Codebeispiel wird ein AEM Forms-Dienst mit SAML-basierter Authentifizierung aufgerufen.
public class ImpersonationExample {
. . .
public void authenticateOnBehalf(String superUsername,String password,
String canonicalName,String domainName) throws UMException, RemoteException{
((org.apache.axis.client.Stub) authenticationManager).setUsername(superUsername);
((org.apache.axis.client.Stub) authenticationManager).setPassword(password);
//Step 1 - Invoke the Auth manager api to get an assertion for the user to be impersonated
AuthResult ar = authenticationManager.getAuthResultOnBehalfOfUser(canonicalName, domainName, null);
String assertion = ar.getAssertion();
//Step 2 - Setting the assertion here to be picked later by the AssertionHandler. Note that stubs are not threadSafe
//hence should not be reused. For this simple example we have made them instance variable but care should be taken
//regarding the thread safety
((javax.xml.rpc.Stub) authorizationManager)._setProperty(AssertionHandler.LC_ASSERTION, assertion);
}
public Role findRole(String roleId) throws UMException, RemoteException{
//This api would be invoked under bob's user rights
return authorizationManager.findRole(roleId);
}
public static void main(String[] args) throws Exception {
ImpersonationExample ie = new ImpersonationExample("http://localhost:5555");
//Get the SAML assertion for the user to impersonate and store it in stub
ie.authenticateOnBehalf(
"administrator", //The Super user which has the required impersonation permission
"password", // Password of the super user as referred above
"bob", //Cannonical name of the user to impersonate
"testdomain" //Domain of the user to impersonate
);
Role r = ie.findRole("BASIC_ROLE_ADMINISTRATOR");
System.out.println("Role "+r.getName());
}
}
Sie können einen Forms-Dienst mit einer .NET-Client-Assembly und einer SAML-basierten Authentifizierung aufrufen. Dazu müssen Sie die Web Service Enhancements 3.0 (WSE) verwenden. Informationen zum Erstellen einer .NET-Client-Assembly, die WSE verwendet, finden Sie unter Erstellen eines .NET-Projekts, das DIME verwendet.
Der Abschnitt DIME verwendet WSE 2.0. Um die SAML-basierte Authentifizierung zu verwenden, befolgen Sie die gleichen Anweisungen wie im DIME-Thema. Ersetzen Sie WSE 2.0 jedoch durch WSE 3.0. Installieren Sie Web Services Enhancements 3.0 auf Ihrem Entwicklungscomputer und integrieren Sie es in Microsoft Visual Studio .NET. Sie können Web Services Enhancements 3.0 vom Microsoft Download Center herunterladen.
Die WSE-Architektur verwendet die Datentypen Richtlinien, Zuordnungen und SecurityToken. Geben Sie für einen Webdienstaufruf kurz eine Richtlinie an. Eine Richtlinie kann mehrere Zusicherungen aufweisen. Jede Zusicherung kann Filter enthalten. Ein Filter wird in bestimmten Phasen eines Webdienstaufrufs aufgerufen und kann zu diesem Zeitpunkt die SOAP-Anforderung ändern. Ausführliche Informationen finden Sie in der Dokumentation zu Web Service Enhancements 3.0.
Assertion und Filter erstellen
Im folgenden C#-Codebeispiel werden Filter- und Assertionsklassen erstellt. In diesem Codebeispiel wird ein SamlAssertionOutputFilter erstellt. Dieser Filter wird vom WSE-Framework aufgerufen, bevor die SOAP-Anforderung an AEM Forms gesendet wird.
class LCSamlPolicyAssertion : Microsoft.Web.ServicES4.Design.PolicyAssertion
{
public override Microsoft.Web.ServicES4.SoapFilter CreateClientOutputFilter(FilterCreationContext context)
{
return new SamlAssertionOutputFilter();
}
. . .
}
class SamlAssertionOutputFilter : SendSecurityFilter
{
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
// Get the SamlToken from the SessionState
SamlToken samlToken = envelope.Context.Credentials.UltimateReceiver.GetClientToken<SamlToken>();
security.Tokens.Add(samlToken);
}
}
Erstellen des SAML-Tokens
Erstellen Sie eine Klasse zur Darstellung der SAML-Zusicherung. Die wichtigste Aufgabe, die diese Klasse ausführt, ist die Konvertierung von Datenwerten von Zeichenfolge in XML und die Beibehaltung des Leerraums. Diese Assertion-XML wird später in die SOAP-Anforderung importiert.
class SamlToken : SecurityToken
{
public const string SAMLAssertion = "https://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1";
private XmlElement _assertionElement;
public SamlToken(string assertion)
: base(SAMLAssertion)
{
XmlDocument xmlDoc = new XmlDocument();
//The white space has to be preserved else the digital signature would get broken
xmlDoc.PreserveWhitespace = true;
xmlDoc.LoadXml(assertion);
_assertionElement = xmlDoc.DocumentElement;
}
public override XmlElement GetXml(XmlDocument document)
{
return (XmlElement)document.ImportNode(_assertionElement, true);
}
. . .
}
Aufrufen eines AEM Forms-Dienstes
Im folgenden C#-Codebeispiel wird ein Forms-Dienst mithilfe der SAML-basierten Authentifizierung aufgerufen.
public class ImpersonationExample
{
. . .
public void AuthenticateOnBehalf(string superUsername, string password, string canonicalName, string domainName)
{
//Create a policy for UsernamePassword Token
Policy usernamePasswordPolicy = new Policy();
usernamePasswordPolicy.Assertions.Add(new UsernameOverTransportAssertion());
UsernameToken token = new UsernameToken(superUsername, password, PasswordOption.SendPlainText);
authenticationManager.SetClientCredential(token);
authenticationManager.SetPolicy(usernamePasswordPolicy);
//Get the SAML assertion for impersonated user
AuthClient.AuthenticationManagerService.AuthResult ar
= authenticationManager.getAuthResultOnBehalfOfUser(canonicalName, domainName, null);
System.Console.WriteLine("Received assertion " + ar.assertion);
//Create a policy for inserting SAML assertion
Policy samlPolicy = new Policy();
samlPolicy.Assertions.Add(new LCSamlPolicyAssertion());
authorizationManager.SetPolicy(samlPolicy);
//Set the SAML assertion obtained previously as the token
authorizationManager.SetClientCredential(new SamlToken(ar.assertion));
}
public Role findRole(string roleId)
{
return authorizationManager.findRole(roleId);
}
static void Main(string[] args)
{
ImpersonationExample ie = new ImpersonationExample("http://localhost:5555");
ie.AuthenticateOnBehalf(
"administrator", //The Super user which has the required impersonation permission
"password", // Password of the super user as referred above
"bob", //Cannonical name of the user to impersonate
"testdomain" //Domain of the user to impersonate
);
Role r = ie.findRole("BASIC_ROLE_ADMINISTRATOR");
System.Console.WriteLine("Role "+r.name);
}
}
Manchmal treten Probleme auf, wenn bestimmte AEM Forms-Dienste über Webdienste aufgerufen werden. Ziel dieser Diskussion ist es, diese Fragen zu ermitteln und eine Lösung zu finden, sofern eine Lösung vorliegt.
Wenn Sie versuchen, einen AEM Forms-Dienstvorgang asynchron aufzurufen, z. B. den Vorgang htmlToPDF
des Generate PDF-Dokuments, tritt ein SoapFaultException
auf. Um dieses Problem zu beheben, erstellen Sie eine XML-Datei mit benutzerdefinierter Bindung, die das ExportPDF_Result
-Element und andere Elemente verschiedenen Klassen zuordnet. Die folgende XML stellt eine benutzerdefinierte Bindungsdatei dar.
<bindings
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:jxb="https://java.sun.com/xml/ns/jaxb" jxb:version="1.0"
xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/"
wsdlLocation="http://localhost:8080/soap/services/GeneratePDFService?wsdl&async=true&lc_version=9.0.0"
xmlns="https://java.sun.com/xml/ns/jaxws">
<enableAsyncMapping>false</enableAsyncMapping>
<package name="external_customize.client"/>
<enableWrapperStyle>true</enableWrapperStyle>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='ExportPDF_Result']">
<jxb:class name="ExportPDFAsyncResult">
</jxb:class>
</bindings>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='CreatePDF_Result']">
<jxb:class name="CreatePDFAsyncResult">
</jxb:class>
</bindings>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='HtmlToPDF_Result']">
<jxb:class name="HtmlToPDFAsyncResult">
</jxb:class>
</bindings>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='OptimizePDF_Result']">
<jxb:class name="OptimizePDFAsyncResult">
</jxb:class>
</bindings>
<!--bindings node="//wsdl:portType[@name='GeneratePDFService']/wsdl:operation[@name='HtmlToPDF_Result']">
<jxb:class name="HtmlToPDFAsyncResult"/>
</bindings-->
</bindings>
Verwenden Sie diese XML-Datei, wenn Sie Java-Proxydateien mit JAX-WS erstellen. (Siehe Java-Proxyklassen mit JAX-WS erstellen.)
Referenzieren Sie diese XML-Datei beim Ausführen des JAX-WS-Tools (wsimport.exe) mit der Befehlszeilenoption - b
. Aktualisieren Sie das Element wsdlLocation
in der XML-Bindungsdatei, um die URL von AEM Forms anzugeben.
Um sicherzustellen, dass der asynchrone Aufruf funktioniert, ändern Sie den URL-Endpunkt-Wert und geben Sie async=true
an. Geben Sie beispielsweise für Java-Proxydateien, die mit JAX-WS erstellt werden, Folgendes für BindingProvider.ENDPOINT_ADDRESS_PROPERTY
an.
https://server:port/soap/services/ServiceName?wsdl&async=true&lc_version=9.0.0
Die folgende Liste gibt weitere Dienste an, die beim asynchronen Aufruf eine benutzerdefinierte Bindungsdatei benötigen:
Manchmal ruft eine mit einem bestimmten J2EE-Anwendungsserver erstellte Proxybibliothek AEM Forms nicht erfolgreich auf, das auf einem anderen J2EE-Anwendungsserver gehostet wird. Betrachten Sie eine Proxybibliothek, die mit AEM Forms generiert wird und auf WebSphere bereitgestellt wird. Diese Proxybibliothek kann auf dem JBoss-Anwendungsserver bereitgestellte AEM Forms-Dienste nicht erfolgreich aufrufen.
Einige komplexe AEM Forms-Datentypen wie PrincipalReference
werden anders definiert, wenn AEM Forms auf WebSphere bereitgestellt wird als JBoss Application Server. Unterschiede in den JDKs, die von den verschiedenen J2EE-Anwendungsdiensten verwendet werden, sind der Grund für Unterschiede in den WSDL-Definitionen. Verwenden Sie daher Proxy-Bibliotheken, die vom gleichen J2EE-Anwendungsserver generiert werden.
Aufgrund von Namensraum-Konflikten können Datenobjekte nicht für mehrere Dienst-WSDLs freigegeben werden. Verschiedene Dienste können Datentypen gemeinsam nutzen, sodass die Dienste die Definition dieser Typen in den WSDLs gemeinsam nutzen. Sie können beispielsweise nicht zwei .NET-Clientassemblys hinzufügen, die einen BLOB
-Datentyp enthalten, der demselben .NET-Clientprojekt hinzugefügt wird. Wenn Sie dies versuchen, tritt ein Kompilierungsfehler auf.
Die folgende Liste gibt Datentypen an, die nicht für mehrere Dienst-WSDLs freigegeben werden können:
User
Principals
PrincipalReference
Groups
Roles
BLOB
Um dieses Problem zu vermeiden, sollten Sie die Datentypen vollständig qualifizieren. Angenommen, eine .NET-Anwendung referenziert sowohl den Forms-Dienst als auch den Signature-Dienst mit einem Dienstverweis. Beide Dienstverweise enthalten eine BLOB
-Klasse. Um eine BLOB
-Instanz zu verwenden, müssen Sie das BLOB
-Objekt vollständig qualifizieren, wenn Sie es deklarieren. Dieser Ansatz ist im folgenden Codebeispiel dargestellt. Weitere Informationen zu diesem Codebeispiel finden Sie unter Interaktives Forms für digitale Signierung.
Im folgenden C#-Codebeispiel wird ein interaktives Formular signiert, das vom Forms-Dienst wiedergegeben wird. Die Clientanwendung verfügt über zwei Dienstverweise. Die mit dem Forms-Dienst verknüpfte BLOB
-Instanz gehört zum Namensraum SignInteractiveForm.ServiceReference2
. Ebenso gehört die mit dem Signature-Dienst verknüpfte BLOB
-Instanz zum Namensraum SignInteractiveForm.ServiceReference1
. Das signierte interaktive Formular wird als PDF-Datei mit dem Namen LoanXFASigned.pdf gespeichert.
???/**
* Ensure that you create a .NET project that uses
* MS Visual Studio 2008 and version 3.5 of the .NET
* framework. This is required to invoke a
* AEM Forms service using MTOM.
*
* For information, see "Invoking AEM Forms using MTOM" in Programming with AEM forms
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
//A reference to the Signature service
using SignInteractiveForm.ServiceReference1;
//A reference to the Forms service
using SignInteractiveForm.ServiceReference2;
namespace SignInteractiveForm
{
class Program
{
static void Main(string[] args)
{
try
{
//Because BLOB objects are used in both service references
//it is necessary to fully-qualify the BLOB objects
//Retrieve the form -- invoke the Forms service
SignInteractiveForm.ServiceReference2.BLOB formData = GetForm();
//Create a BLOB object associated with the Signature service
SignInteractiveForm.ServiceReference1.BLOB sigData = new SignInteractiveForm.ServiceReference1.BLOB();
//Transfer the byte stream from one Forms BLOB object to the
//Signature BLOB object
sigData.MTOM = formData.MTOM;
//Sign the Form -- invoke the Signature service
SignForm(sigData);
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
}
//Creates an interactive PDF form based on a XFA form - invoke the Forms service
private static SignInteractiveForm.ServiceReference2.BLOB GetForm()
{
try
{
//Create a FormsServiceClient object
FormsServiceClient formsClient = new FormsServiceClient();
formsClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/FormsService?blob=mtom");
//Enable BASIC HTTP authentication
BasicHttpBinding b = (BasicHttpBinding)formsClient.Endpoint.Binding;
b.MessageEncoding = WSMessageEncoding.Mtom;
formsClient.ClientCredentials.UserName.UserName = "administrator";
formsClient.ClientCredentials.UserName.Password = "password";
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b.MaxReceivedMessageSize = 2000000;
b.MaxBufferSize = 2000000;
b.ReaderQuotas.MaxArrayLength = 2000000;
//Create a BLOB to store form data
SignInteractiveForm.ServiceReference2.BLOB formData = new SignInteractiveForm.ServiceReference2.BLOB();
SignInteractiveForm.ServiceReference2.BLOB pdfForm = new SignInteractiveForm.ServiceReference2.BLOB();
//Specify a XML form data
string path = "C:\\Adobe\Loan.xml";
FileStream fs = new FileStream(path, FileMode.Open);
//Get the length of the file stream
int len = (int)fs.Length;
byte[] ByteArray = new byte[len];
fs.Read(ByteArray, 0, len);
formData.MTOM = ByteArray;
//Specify a XML form data
string path2 = "C:\\Adobe\LoanSigXFA.pdf";
FileStream fs2 = new FileStream(path2, FileMode.Open);
//Get the length of the file stream
int len2 = (int)fs2.Length;
byte[] ByteArray2 = new byte[len2];
fs2.Read(ByteArray2, 0, len2);
pdfForm.MTOM = ByteArray2;
PDFFormRenderSpec renderSpec = new PDFFormRenderSpec();
renderSpec.generateServerAppearance = true;
//Set out parameter values
long pageCount = 1;
String localValue = "en_US";
FormsResult result = new FormsResult();
//Render an interactive PDF form
formsClient.renderPDFForm2(
pdfForm,
formData,
renderSpec,
null,
null,
out pageCount,
out localValue,
out result);
//Write the data stream to the BLOB object
SignInteractiveForm.ServiceReference2.BLOB outForm = result.outputContent;
return outForm;
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
return null;
}
//Sign the form -- invoke the Signature service
private static void SignForm(SignInteractiveForm.ServiceReference1.BLOB inDoc)
{
try
{
//Create a SignatureServiceClient object
SignatureServiceClient signatureClient = new SignatureServiceClient();
signatureClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/SignatureService?blob=mtom");
//Enable BASIC HTTP authentication
BasicHttpBinding b = (BasicHttpBinding)signatureClient.Endpoint.Binding;
b.MessageEncoding = WSMessageEncoding.Mtom;
signatureClient.ClientCredentials.UserName.UserName = "administrator";
signatureClient.ClientCredentials.UserName.Password = "password";
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b.MaxReceivedMessageSize = 2000000;
b.MaxBufferSize = 2000000;
b.ReaderQuotas.MaxArrayLength = 2000000;
//Specify the name of the signature field
string fieldName = "form1[0].grantApplication[0].page1[0].SignatureField1[0]";
//Create a Credential object
Credential myCred = new Credential();
myCred.alias = "secure";
//Specify the reason to sign the document
string reason = "The document was reviewed";
//Specify the location of the signer
string location = "New York HQ";
//Specify contact information
string contactInfo = "Tony Blue";
//Create a PDFSignatureAppearanceOptions object
//and show date information
PDFSignatureAppearanceOptionSpec appear = new PDFSignatureAppearanceOptionSpec();
appear.showDate = true;
//Sign the PDF document
SignInteractiveForm.ServiceReference1.BLOB signedDoc = signatureClient.sign(
inDoc,
fieldName,
myCred,
HashAlgorithm.SHA1,
reason,
location,
contactInfo,
appear,
true,
null,
null,
null);
//Populate a byte array with BLOB data that represents the signed form
byte[] outByteArray = signedDoc.MTOM;
//Save the signed PDF document
string fileName = "C:\\Adobe\LoanXFASigned.pdf";
FileStream fs2 = new FileStream(fileName, FileMode.OpenOrCreate);
//Create a BinaryWriter object
BinaryWriter w = new BinaryWriter(fs2);
w.Write(outByteArray);
w.Close();
fs2.Close();
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
}
}
}
Der Name einiger von AEM Forms generierter Proxyklassen ist bei Verwendung von Microsoft .Net 3.5 und WCF nicht korrekt. Dieses Problem tritt auf, wenn Proxyklassen für IBMFilenetContentRepositoryConnector, IDPSchedulerService oder einen anderen Dienst erstellt werden, dessen Name mit dem Brief I Beginn. Beispielsweise lautet der Name des generierten Clients im Fall von IBMFileNetContentRepositoryConnector BMFileNetContentRepositoryConnectorClient
. Der Brief, den ich in der generierten Proxyklasse fehlt.