服務容器中的大多數AEM Forms服務都配置為公開Web服務,完全支援生成Web服務定義語言(WSDL)。 也就是說,您可以建立代理物件,使用AEM Forms服務的原生SOAP堆疊。 因此,AEM Forms服務可以交換及處理下列SOAP訊息:
使用網站服務,您可以執行與使用Java API相同的AEM Forms服務作業。 使用Web服務來叫用AEM Forms服務的好處是,您可以在支援SOAP的開發環境中建立用戶端應用程式。 客戶端應用程式不綁定到特定的開發環境或寫程式語言。 例如,您可以使用Microsoft Visual Studio .NET和C#作為寫程式語言建立客戶端應用程式。
AEM Forms服務會透過SOAP通訊協定公開,且符合WSI基本設定檔1.1。 Web服務互操作性(WSI)是一個開放標準組織,它促進了不同平台間的Web服務互操作性。 如需詳細資訊,請參閱https://www.ws-i.org/。
AEM Forms支援下列網站服務標準:
若要使用Web服務叫用AEM Forms服務,通常需建立會使用服務WSDL的代理程式庫。 使用Web服務調用AEM Forms節使用JAX-WS建立Java代理類以調用服務。 (請參閱使用JAX-WS建立Java代理類。)
您可以指定下列URL定義來擷取服務WDSL(方括弧中的項目為選用項目):
https://<your_serverhost>:<your_port>/soap/services/<service_name>?wsdl[&version=<version>][&async=true|false][lc_version=<lc_version>]
其中:
async
指定值,以 true
便為非同步調用啟用其他 false
操作(預設)。下表列出了服務WSDL定義(假設已在本地主機上部署了AEM Forms,而貼文為8080)。
服務 |
WSDL定義 |
---|---|
組合器 |
|
返回和還原 |
|
條碼式表單 |
|
轉換PDF |
|
Distiller |
|
DocConverter |
|
DocumentManagement |
|
加密 |
|
表單 |
|
表單資料整合 |
|
產生PDF |
|
生成3D PDF |
|
輸出 |
|
PDF公用程式 |
|
Acrobat Reader DC擴充功能 |
|
存放庫 |
|
版權管理 |
|
簽名 |
|
XMP公用程式 |
|
AEM Forms進程WSDL定義
您必須在WSDL定義中指定應用程式名稱和進程名稱,才能訪問屬於在Workbench中建立的進程的WSDL。 假設應用程式的名稱為MyApplication
,且進程的名稱為EncryptDocument
。 在這種情況下,請指定以下WSDL定義:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl
有關示例MyApplication/EncryptDocument
短期進程的資訊,請參閱短期進程示例。
應用程式可以包含資料夾。 在這種情況下,請在WSDL定義中指定資料夾名稱:
http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl
使用網站服務存取新功能
新的AEM Forms服務功能可使用網站服務來存取。 例如,在AEM Forms中,引入了使用MTOM對附件進行編碼的功能。 (請參閱使用MTOM叫用AEM Forms。)
若要存取AEM Forms中推出的新功能,請在WSDL定義中指定lc_version
屬性。 例如,要訪問新服務功能(包括MTOM支援),請指定以下WSDL定義:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl&lc_version=9.0.1
設定lc_version
屬性時,請務必使用三位數。 例如,9.0.1等於9.0版。
Web服務BLOB資料類型
AEM Forms服務WSDL定義了許多資料類型。 Web服務中公開的最重要資料類型之一是BLOB
類型。 使用AEM Forms Java API時,此資料類型會對應至com.adobe.idp.Document
類別。 (請參閱使用Java API將資料傳遞至AEM Forms服務。)
BLOB
物件會傳送二進位資料(例如PDF檔案、XML資料等),並從AEM Forms服務中取得。 BLOB
類型在服務WSDL中定義如下:
<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>
MTOM
和swaRef
欄位僅在AEM Forms中受支援。 只有在指定包含lc_version
屬性的URL時,才可使用這些新欄位。
在服務請求中提供BLOB對象
如果AEM Forms服務操作需要BLOB
類型作為輸入值,請在應用程式邏輯中建立BLOB
類型的例項。 (許多Web服務快速入門位於使用AEM表單寫程式中,說明如何使用BLOB資料類型。)
將值指派給屬於BLOB
例項的欄位,如下所示:
BLOB.binaryData
位中設定資料,並在欄位中以MIME格式(例如 application/pdf
)設定資料類 BLOB.contentType
型。(請參閱使用Base64編碼叫用AEM Forms。)BLOB.MTOM
資料。此設定使用Java JAX-WS框架或SOAP框架的本機API將資料附加到SOAP請求。 (請參閱使用MTOM叫用AEM Forms。)BLOB.swaRef
資料。此設定使用Java JAX-WS框架將資料附加到SOAP請求。 (請參閱使用SwaRef叫用AEM Forms。)BLOB.attachmentID
欄位中設定附件標識符。 (請參閱使用Base64編碼叫用AEM Forms。)BLOB.remoteURL
HTTP URL。(請參閱透過HTTP使用BLOB資料叫用AEM Forms。)訪問從服務返回的BLOB對象中的資料
返回BLOB
對象的傳輸協定取決於多個因素,這些因素按以下順序考慮,在滿足主要條件時停止:
目標URL指定傳輸通訊協定。如果在SOAP調用中指定的目標URL包含參數blob="
BLOB_TYPE",則BLOB_TYPE將確定傳輸協定。 BLOB_ TYPE是base64、dime、mime、http、mtom或swaref的預留位置。
服務SOAP端點是智慧。如果以下條件為真,則使用與輸入文檔相同的傳輸協定返回輸出文檔:
輸出Blob對象的服務的SOAP端點參數預設協定設定為Smart。
對於每個具有SOAP端點的服務,管理控制台允許您為任何返回的Blob指定傳輸協定。 (請參閱管理幫助。)
AEM Forms服務會以一或多個檔案作為輸入。
服務SOAP端點不是智慧。配置的協定確定文檔傳輸協定,並在相應的BLOB
欄位中返回資料。 例如,如果SOAP端點設定為DIME,則返回的blob位於blob.attachmentID
欄位中,而不管任何輸入文檔的傳輸協定如何。
否則。如果服務未將文檔類型作為輸入,則通過HTTP協定在BLOB.remoteURL
欄位中返回輸出文檔。
如第一個條件所述,您可以通過擴展尾碼為SOAP端點URL來確保任何返回文檔的傳輸類型,如下所示:
https://<your_serverhost>:<your_port>/soap/services/<service
name>?blob=base64|dime|mime|http|mtom|swaref
以下是傳輸類型與從中獲取資料的欄位之間的關聯:
blob
碼設為 base64
,以傳回欄位中的 BLOB.binaryData
資料。blob
設為 DIME
或, MIME
以傳回資料作為對應的附件類型,並在欄位中傳回附件識 BLOB.attachmentID
別碼。使用SOAP框架的專有API從附件中讀取資料。blob
碼設為 http
,以保留應用程式伺服器上的資料,並傳回欄位中指向資料的 BLOB.remoteURL
URL。blob
設為 mtom
或, swaref
以相應的附件類型傳回資料,並在或欄位中傳回附 BLOB.MTOM
件識 BLOB.swaRef
別碼。使用SOAP框架的本機API從附件讀取資料。建議您叫用setBinaryData
方法來填入BLOB
物件時,不要超過30 MB。 否則,可能會發生OutOfMemory
異常。
使用MTOM傳輸協定的基於JAX WS的應用程式限制為25MB的已發送和已接收資料。 此限制是由於JAX-WS中的錯誤。 如果已發送和已接收檔案的總大小超過25MB,請使用SwaRef傳輸協定,而不是MTOM協定。 否則,可能出現OutOfMemory
異常。
基於64編碼位元組陣列的MTOM傳輸
除了BLOB
對象外,MTOM協定還支援任何複雜類型的位元組陣列參數或位元組陣列欄位。 這表示支援MTOM的用戶端SOAP架構可以傳送任何xsd:base64Binary
元素作為MTOM附件(而非base64編碼的文字)。 AEM Forms SOAP端點可以讀取此類型的位元組陣列編碼。 不過,AEM Forms服務一律會傳回位元組陣列類型,作為base64編碼文字。 輸出位元組陣列參數不支援MTOM。
傳回大量二進位資料的AEM Forms服務會使用Document/BLOB類型,而非位元組陣列類型。 對於傳輸大量資料而言,「文檔」類型要高效得多。
下表列出Java資料類型,並顯示對應的Web服務資料類型。
Java資料類型 |
Web服務資料類型 |
---|---|
|
|
|
|
|
如果AEM Forms服務操作以 |
|
如果AEM Forms服務操作以 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
地圖會以索引鍵/值組的順序呈現。 |
|
|
|
|
|
|
|
XML類型,在服務WSDL中定義如下:
如果AEM Forms服務操作接受 設定 |
|
XML類型,在服務WSDL中定義如下:
如果AEM Forms服務操作以 設定 |
使用自訂元件叫用Web服務說明如何建立會叫用協力廠商Web服務的AEM Forms元件。
可以使用JAX-WS將Forms服務WSDL轉換為Java代理類。 這些類別可讓您叫用AEM Forms服務作業。 Apache Ant可讓您建立生成指令碼,該指令碼通過引用AEM Forms服務WSDL來生成Java代理類。 通過執行以下步驟,可以生成JAX-WS代理檔案:
在客戶端電腦上安裝Apache Ant。 (請參閱https://ant.apache.org/bindownload.cgi。)
ANT_HOME
環境變數設定為安裝Ant的目錄。安裝JDK 1.6或更高版本。
JAVA_HOME
環境變數設定為JDK安裝所在的目錄。JDK 1.6包括build.xml檔案中使用的wsimport程式。 JDK 1.5不包含該程式。
在客戶端電腦上安裝JAX-WS。 (請參閱XML網站服務的Java API。)
使用JAX-WS和Apache Ant生成Java代理類。 建立Ant生成指令碼以完成此任務。 以下指令碼是名為build.xml的示例Ant生成指令碼:
<?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>
在此Ant生成指令碼中,請注意url
屬性已設定為引用本地主機上運行的加密服務WSDL。 必須將username
和password
屬性設定為有效的AEM表單用戶名和密碼。 請注意,URL包含lc_version
屬性。 若未指定lc_version
選項,則無法叫用新的AEM Forms服務操作。
將EncryptionService
替換為要使用Java代理類調用的AEM Forms服務名。 例如,要為Rights Management服務建立Java代理類,請指定:
http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
建立BAT檔案以執行Ant生成指令碼。 以下命令可位於負責執行Ant生成指令碼的BAT檔案中:
ant -buildfile "build.xml" wsdl
將ANT生成指令碼放在C:\Program Files\Java\jaxws-ri\bin directory中。 指令碼會將JAVA檔案寫入。/classes資料夾。 指令碼會產生可叫用服務的JAVA檔案。
將JAVA檔案封裝為JAR檔案。 如果您使用Eclipse,請依照下列步驟操作:
com.adobe.idp.services
包。com.adobe.idp.services
套件,然後從adobe/idp/services資料夾將JAVA檔案匯入套件中。org/apache/xml/xmlsoap
包。使用AEM表單寫程式時,位於「使用JAX-WS建立Java代理檔案」中的所有Java Web服務快速啟動(Forms服務除外)。 此外,所有Java Web服務都快速啟動,請使用SwaRef。 (請參閱使用SwaRef叫用AEM Forms。)
另請參閱
您可以使用Apache Axis WSDL2Java工具將Forms服務轉換為Java代理類。 這些類別可讓您叫用Forms服務作業。 使用Apache Ant,可以從服務WSDL生成Axis庫檔案。 您可以在URL https://ws.apache.org/axis/下載Apache Axis。
與Forms服務相關聯的Web服務快速入門使用使用Apache Axis建立的Java代理類。 Forms Web服務快速入門也使用Base64作為編碼類型。 (請參閱Forms服務API快速入門。)
通過執行以下步驟,可以生成Axis Java庫檔案:
在客戶端電腦上安裝Apache Ant。 可在https://ant.apache.org/bindownload.cgi取得。
ANT_HOME
環境變數設定為安裝Ant的目錄。在用戶端電腦上安裝Apache Axis 1.4。 可在https://ws.apache.org/axis/取得。
設定類路徑以在Web服務客戶端中使用Axis JAR檔案,如https://ws.apache.org/axis/java/install.html的Axis安裝說明中所述。
使用Axis中的Apache WSDL2Java工具生成Java代理類。 建立Ant生成指令碼以完成此任務。 以下指令碼是名為build.xml的示例Ant生成指令碼:
<?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>
在此Ant生成指令碼中,請注意url
屬性已設定為引用本地主機上運行的加密服務WSDL。 必須將username
和password
屬性設定為有效的AEM表單用戶名和密碼。
建立BAT檔案以執行Ant生成指令碼。 以下命令可位於負責執行Ant生成指令碼的BAT檔案中:
ant -buildfile "build.xml" encryption-wsdl2java-client
JAVA檔案將寫入C:\JavaFiles folder as specified by the output
屬性。 若要成功叫用Forms服務,請將這些JAVA檔案匯入您的類別路徑。
預設情況下,這些檔案屬於名為com.adobe.idp.services
的Java包。 建議您將這些JAVA檔案放入JAR檔案中。 然後將JAR檔案導入客戶端應用程式的類路徑。
將.JAVA檔案放入JAR有不同的方法。 一種方式是使用Java IDE,如Eclipse。 建立Java項目並建立com.adobe.idp.services
包(所有.JAVA檔案均屬於此包)。 接下來,將所有.JAVA檔案匯入套件中。 最後,將項目導出為JAR檔案。
修改EncryptionServiceLocator
類中的URL以指定編碼類型。 例如,若要使用base64,請指定?blob=base64
以確保BLOB
對象返回二進位資料。 也就是說,在EncryptionServiceLocator
類中,找到以下代碼行:
http://localhost:8080/soap/services/EncryptionService;
並將其變更為:
http://localhost:8080/soap/services/EncryptionService?blob=base64;
將以下Axis JAR檔案添加到Java項目的類路徑中:
這些JAR檔案位於[install目錄]/Adobe/Adobe Experience Manager Forms/sdk/lib/thirdparty目錄中。
另請參閱
您可以使用Base64編碼叫用AEM Forms服務。 Base64編碼對隨Web服務調用請求發送的附件進行編碼。 也就是說,BLOB
資料是Base64編碼,而不是整個SOAP消息。
"使用Base64編碼叫用AEM Forms"討論使用Base64編碼叫用以下名為MyApplication/EncryptDocument
的AEM Forms短期進程。
此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument
的程式。 (請參閱使用Workbench。)
叫用此程式時,會執行下列動作:
SetValue
操作。 此進程的輸入參數是名為inDoc
的document
進程變數。PasswordEncryptPDF
操作。 在名為outDoc
的進程變數中返回密碼加密的PDF文檔。您可以建立.NET客戶端程式集,從Microsoft Visual Studio .NET項目調用Forms服務。 要建立使用base64編碼的.NET客戶端程式集,請執行以下步驟:
建立代理類
您可以使用Microsoft Visual Studio附帶的工具建立用於建立.NET客戶端程式集的代理類。 該工具的名稱為wsdl.exe,位於Microsoft Visual Studio安裝資料夾中。 要建立代理類,請開啟命令提示符並導航到包含wsdl.exe檔案的資料夾。 有關wsdl.exe工具的詳細資訊,請參閱MSDN幫助。
在命令提示符下輸入以下命令:
wsdl https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
預設情況下,此工具會在基於WSDL名稱的同一資料夾中建立CS檔案。 在此情況下,它會建立名為EncryptDocumentService.cs的CS檔案。 您可使用此CS檔案建立代理對象,該對象允許您調用調用URL中指定的服務。
修改代理類中的URL以包含?blob=base64
,以確保BLOB
對象返回二進位資料。 在Proxy類別中,找出下列程式碼行:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument";
並將其變更為:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";
使用Base64 Encoding區段叫用AEM Forms以MyApplication/EncryptDocument
為例。 如果要為另一個Forms服務建立.NET客戶端程式集,請確保將MyApplication/EncryptDocument
替換為服務的名稱。
開發.NET客戶端程式集
建立生成.NET客戶端程式集的Visual Studio類庫項目。 可以將使用wsdl.exe建立的CS檔案導入此項目。 此項目將生成一個DLL檔案(.NET客戶端程式集),您可以在其他Visual Studio .NET項目中使用該檔案來調用服務。
此過程建立名為DocumentService.dll的.NET客戶端程式集,可用於向MyApplication/EncryptDocument
服務發送SOAP請求。
請務必將?blob=base64
添加到用於建立.NET客戶端程式集的代理類的URL中。 否則,無法從BLOB
對象中檢索二進位資料。
引用.NET客戶端程式集
將新建立的.NET客戶端程式集放置在正在開發客戶端應用程式的電腦上。 將.NET客戶端程式集放置到目錄後,可以從項目中引用它。 也會從專案參考System.Web.Services
資料庫。 如果未引用此庫,則不能使用.NET客戶端程式集調用服務。
使用使用Base64編碼的.NET客戶端程式集調用服務
您可以使用使用Base64編碼的.NET用戶端程式集來叫用MyApplication/EncryptDocument
服務(已在Workbench中建置)。 要調用MyApplication/EncryptDocument
服務,請執行以下步驟:
MyApplication/EncryptDocument
服務WSDL的Microsoft .NET客戶端程式集。System.Web.Services
。MyApplication_EncryptDocumentService
對象。System.Net.NetworkCredential
對象設定MyApplication_EncryptDocumentService
對象的Credentials
屬性。 在System.Net.NetworkCredential
建構函式內,指定AEM表單使用者名稱及對應的密碼。 設定驗證值,使您的.NET客戶端應用程式能夠成功與AEM Forms交換SOAP消息。BLOB
物件。 BLOB
對象用於儲存傳遞到MyApplication/EncryptDocument
進程的PDF文檔。System.IO.FileStream
對象的建構子以建立對象。 傳遞一個字串值,該字串值表示PDF文檔的檔案位置以及開啟檔案的模式。System.IO.FileStream
對象內容的位元組陣列。 通過獲取System.IO.FileStream
對象的Length
屬性,可以確定位元組陣列的大小。System.IO.FileStream
物件的Read
方法,以串流資料填入位元組陣列。 傳遞位元組陣列、起始位置和資料流長度以讀取。binaryData
物件指派包含位元組陣列內容的屬性,以填入BLOB
物件。MyApplication_EncryptDocumentService
對象的invoke
方法並傳遞包含PDF文檔的BLOB
對象,以調用MyApplication/EncryptDocument
進程。 此過程在BLOB
對象內返回加密的PDF文檔。System.IO.FileStream
對象的建構子並傳遞一個字串值,該字串值表示密碼加密文檔的檔案位置。MyApplicationEncryptDocumentService
對象的invoke
方法返回的BLOB
對象的資料內容。 獲取BLOB
對象的binaryData
資料成員的值,以填充位元組陣列。System.IO.FileStream
對象來建立System.IO.BinaryWriter
對象。System.IO.BinaryWriter
對象的Write
方法並傳遞位元組陣列,將位元組陣列內容寫入PDF檔案。您可以使用Java代理類和Base64調用AEM Forms服務。 要使用Java代理類調用MyApplication/EncryptDocument
服務,請執行以下步驟:
使用佔用MyApplication/EncryptDocument
服務WSDL的JAX-WS建立Java代理類。 使用以下WSDL端點:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
將hiro-xp
替換為托管AEM Forms的J2EE應用程式伺服器的IP地址。
將使用JAX-WS建立的Java代理類打包到JAR檔案中。
包括位於以下路徑中的Java代理JAR檔案和JAR檔案:
<install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
進入Java客戶端項目的類路徑。
使用其建構子建立MyApplicationEncryptDocumentService
物件。
調用MyApplicationEncryptDocumentService
對象的getEncryptDocument
方法,建立MyApplicationEncryptDocument
對象。
將值指派給下列資料成員,以設定叫用AEM Forms所需的連線值:
將WSDL端點和編碼類型分配給javax.xml.ws.BindingProvider
對象的ENDPOINT_ADDRESS_PROPERTY
欄位。 要使用Base64編碼調用MyApplication/EncryptDocument
服務,請指定以下URL值:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64
將AEM表單使用者指派至javax.xml.ws.BindingProvider
物件的USERNAME_PROPERTY
欄位。
將相應的密碼值分配給javax.xml.ws.BindingProvider
對象的PASSWORD_PROPERTY
欄位。
下列程式碼範例顯示此應用程式邏輯:
//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);
通過使用其建構子建立java.io.FileInputStream
對象,檢索要發送到MyApplication/EncryptDocument
進程的PDF文檔。 傳遞指定PDF文檔位置的字串值。
建立位元組陣列,並將java.io.FileInputStream
物件的內容填入。
使用其建構子建立BLOB
物件。
叫用setBinaryData
方法並傳遞位元組陣列,以填入BLOB
物件。 使用Base64編碼時,BLOB
物件的setBinaryData
是要呼叫的方法。 請參閱在服務請求中提供BLOB對象。
調用MyApplicationEncryptDocument
對象的invoke
方法來調用MyApplication/EncryptDocument
進程。 傳遞包含PDF檔案的BLOB
物件。 調用方法返回包含加密PDF文檔的BLOB
對象。
調用BLOB
對象的getBinaryData
方法,建立包含加密PDF文檔的位元組陣列。
將加密的PDF檔案儲存為PDF檔案。 將位元組陣列寫入檔案。
另請參閱
您可以使用網站服務標準MTOM叫用AEM Forms服務。 此標準定義了二進位資料(如PDF檔案)如何通過網際網路或內聯網傳輸。 MTOM的一項功能是使用XOP:Include
元素。 此元素在XML二進位優化包裝(XOP)規範中定義,以引用SOAP消息的二進位附件。
這裡討論的是使用MTOM來調用以下名為MyApplication/EncryptDocument
的AEM Forms短期進程。
此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument
的程式。 (請參閱使用Workbench。)
叫用此程式時,會執行下列動作:
SetValue
操作。 此進程的輸入參數是名為inDoc
的document
進程變數。PasswordEncryptPDF
操作。 在名為outDoc
的進程變數中返回密碼加密的PDF文檔。AEM Forms 9版新增MTOM支援。
使用MTOM傳輸協定的基於JAX WS的應用程式限制為25MB的已發送和已接收資料。 此限制是由於JAX-WS中的錯誤。 如果已發送和已接收檔案的總大小超過25MB,請使用SwaRef傳輸協定,而不是MTOM協定。 否則,可能出現OutOfMemory
異常。
這裡討論的是在Microsoft .NET項目中使用MTOM來調用AEM Forms服務。 使用的.NET框架為3.5,開發環境為Visual Studio 2008。 如果您的開發電腦上已安裝Web服務增強功能(WSE),請將其移除。 .NET 3.5框架支援名為Windows Communication Foundation(WCF)的SOAP框架。 使用MTOM叫用AEM Forms時,僅支援WCF(不支援WSE)。
您可以建立Microsoft .NET項目,該項目可以使用Web服務調用AEM Forms服務。 首先,使用Visual Studio 2008建立Microsoft .NET項目。 若要叫用AEM Forms服務,請建立要在專案中叫用之AEM Forms服務的服務參考。 建立服務參考時,請指定AEM Forms服務的URL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
將localhost
替換為托管AEM Forms之J2EE應用程式伺服器的IP位址。 以要叫用的AEM Forms服務名稱取代MyApplication/EncryptDocument
。 例如,要調用Rights Management操作,請指定:
http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
lc_version
選項可確保AEM Forms功能(例如MTOM)可供使用。 若未指定lc_version
選項,則無法使用MTOM叫用AEM Forms。
建立服務參考後,與AEM Forms服務相關聯的資料類型便可在您的.NET專案中使用。 要建立調用AEM Forms服務的.NET項目,請執行以下步驟:
使用Microsoft Visual Studio 2008建立.NET項目。
在Project菜單中,選擇添加服務引用。
在Address對話框中,指定AEM Forms服務的WSDL。 例如,
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
按一下「Go」,然後按一下「確定」。
請考慮MyApplication/EncryptDocument
程式,該程式接受不安全的PDF檔案並傳回密碼加密的PDF檔案。 若要使用MTOM叫用MyApplication/EncryptDocument
程式(已在Workbench中建置),請執行下列步驟:
建立Microsoft .NET項目。
使用其預設建構子建立MyApplication_EncryptDocumentClient
物件。
使用System.ServiceModel.EndpointAddress
建構子建立MyApplication_EncryptDocumentClient.Endpoint.Address
物件。 將指定WSDL的字串值傳遞至AEM Forms服務和編碼類型:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
您不需要使用lc_version
屬性。 建立服務參考時,會使用此屬性。 但請務必指定?blob=mtom
。
將hiro-xp
替換為托管AEM Forms的J2EE應用程式伺服器的IP地址。
獲取EncryptDocumentClient.Endpoint.Binding
資料成員的值,建立System.ServiceModel.BasicHttpBinding
對象。 將傳回值轉換為BasicHttpBinding
。
將System.ServiceModel.BasicHttpBinding
對象的MessageEncoding
資料成員設定為WSMessageEncoding.Mtom
。 此值可確保使用MTOM。
通過執行以下任務來啟用基本HTTP身份驗證:
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName
。MyApplication_EncryptDocumentClient.ClientCredentials.UserName.Password
分配相應的密碼值。HttpClientCredentialType.Basic
分配給資料成員BasicHttpBindingSecurity.Transport.ClientCredentialType
。BasicHttpSecurityMode.TransportCredentialOnly
分配給資料成員BasicHttpBindingSecurity.Security.Mode
。下列程式碼範例顯示這些工作。
//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;
使用其建構子建立BLOB
物件。 BLOB
對象用於儲存要傳遞至MyApplication/EncryptDocument
進程的PDF文檔。
調用System.IO.FileStream
對象的建構子以建立對象。 傳遞一個字串值,該字串值表示PDF文檔的檔案位置以及開啟檔案的模式。
建立儲存System.IO.FileStream
對象內容的位元組陣列。 通過獲取System.IO.FileStream
對象的Length
屬性,可以確定位元組陣列的大小。
叫用System.IO.FileStream
物件的Read
方法,以串流資料填入位元組陣列。 傳遞位元組陣列、起始位置和資料流長度以讀取。
為MTOM
資料成員分配位元組陣列的內容,以填充BLOB
對象。
調用MyApplication_EncryptDocumentClient
對象的invoke
方法來調用MyApplication/EncryptDocument
進程。 傳遞包含PDF檔案的BLOB
物件。 此過程在BLOB
對象內返回加密的PDF文檔。
調用System.IO.FileStream
對象的建構子並傳遞一個字串值,該字串值表示安全PDF文檔的檔案位置。
建立位元組陣列,用於儲存invoke
方法返回的BLOB
對象的資料內容。 獲取BLOB
對象的MTOM
資料成員的值,以填充位元組陣列。
通過調用其建構子並傳遞System.IO.FileStream
對象來建立System.IO.BinaryWriter
對象。
調用System.IO.BinaryWriter
對象的Write
方法並傳遞位元組陣列,將位元組陣列的內容寫入PDF檔案。
大部分的AEM Forms服務作業都有MTOM快速入門。 您可以在服務的相應快速入門部分中查看這些快速入門。 例如,要查看輸出快速入門部分,請參閱輸出服務API快速入門。
另請參閱
建立ASP.NET Web應用程式,該應用程式調用以人為中心的長生命週期過程
您可以使用SwaRef叫用AEM Forms服務。 wsi:swaRef
XML元素的內容作為附件在儲存對附件的引用的SOAP主體內發送。 使用SwaRef叫用Forms服務時,請使用XML Web Services(JAX-WS)的Java API建立Java代理類。 (請參閱XML網站服務的Java API。)
這裡討論的是使用SwaRef調用以下名為MyApplication/EncryptDocument
的Forms短期進程。
此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument
的程式。 (請參閱使用Workbench。)
叫用此程式時,會執行下列動作:
SetValue
操作。 此進程的輸入參數是名為inDoc
的document
進程變數。PasswordEncryptPDF
操作。 在名為outDoc
的進程變數中返回密碼加密的PDF文檔。AEM Forms中新增SwaRef支援
以下討論如何在Java用戶端應用程式中使用SwaRef來叫用Forms服務。 Java應用程式使用由JAX-WS建立的代理類。
要使用使用JAX-WS和SwaRef建立的Java代理檔案調用MyApplication/EncryptDocument
進程,請執行以下步驟:
使用佔用MyApplication/EncryptDocument
服務WSDL的JAX-WS建立Java代理類。 使用以下WSDL端點:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
有關資訊,請參閱使用JAX-WS建立Java代理類。
將hiro-xp
替換為托管AEM Forms的J2EE應用程式伺服器的IP地址。
將使用JAX-WS建立的Java代理類打包到JAR檔案中。
包括位於以下路徑中的Java代理JAR檔案和JAR檔案:
<install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
進入Java客戶端項目的類路徑。
使用其建構子建立MyApplicationEncryptDocumentService
物件。
調用MyApplicationEncryptDocumentService
對象的getEncryptDocument
方法,建立MyApplicationEncryptDocument
對象。
將值指派給下列資料成員,以設定叫用AEM Forms所需的連線值:
將WSDL端點和編碼類型分配給javax.xml.ws.BindingProvider
對象的ENDPOINT_ADDRESS_PROPERTY
欄位。 要使用SwaRef編碼調用MyApplication/EncryptDocument
服務,請指定以下URL值:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref
將AEM表單使用者指派至javax.xml.ws.BindingProvider
物件的USERNAME_PROPERTY
欄位。
將相應的密碼值分配給javax.xml.ws.BindingProvider
對象的PASSWORD_PROPERTY
欄位。
下列程式碼範例顯示此應用程式邏輯:
//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);
通過使用其建構子建立java.io.File
對象,檢索要發送到MyApplication/EncryptDocument
進程的PDF文檔。 傳遞指定PDF文檔位置的字串值。
使用FileDataSource
建構子建立javax.activation.DataSource
物件。 傳遞java.io.File
物件。
使用其建構子並傳遞javax.activation.DataSource
物件,以建立javax.activation.DataHandler
物件。
使用其建構子建立BLOB
物件。
叫用setSwaRef
方法並傳遞javax.activation.DataHandler
物件,以填入BLOB
物件。
調用MyApplicationEncryptDocument
對象的invoke
方法並傳遞包含PDF文檔的BLOB
對象,以調用MyApplication/EncryptDocument
進程。 invoke方法返回包含加密PDF文檔的BLOB
對象。
叫用BLOB
物件的getSwaRef
方法,填入javax.activation.DataHandler
物件。
調用javax.activation.DataHandler
對象的getInputStream
方法,將javax.activation.DataHandler
對象轉換為java.io.InputSteam
實例。
將java.io.InputSteam
實例寫入表示加密PDF文檔的PDF檔案。
大部分的AEM Forms服務操作都有SwaRef快速啟動。 您可以在服務的相應快速入門部分中查看這些快速入門。 例如,要查看輸出快速入門部分,請參閱輸出服務API快速入門。
另請參閱
您可以使用網站服務叫用AEM Forms服務,並透過HTTP傳遞BLOB資料。 透過HTTP傳遞BLOB資料是替代技術,而非使用base64編碼、DIME或MIME。 例如,在使用不支援DIME或MIME的Web服務增強3.0的Microsoft .NET專案中,您可以透過HTTP傳遞資料。 透過HTTP使用BLOB資料時,會先上傳輸入資料,再叫用AEM Forms服務。
「使用HTTP上的BLOB資料叫用AEM Forms」討論透過透過HTTP傳遞BLOB資料,以叫用下列名為MyApplication/EncryptDocument
的AEM Forms短期處理程式。
此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument
的程式。 (請參閱使用Workbench。)
叫用此程式時,會執行下列動作:
SetValue
操作。 此進程的輸入參數是名為inDoc
的document
進程變數。PasswordEncryptPDF
操作。 在名為outDoc
的進程變數中返回密碼加密的PDF文檔。建議您先熟悉如何使用SOAP叫用AEM Forms。 (請參閱使用網站服務叫用AEM Forms。)
要建立使用通過HTTP的資料的客戶端程式集,請按照使用Base64編碼調用AEM Forms中指定的過程。 但是,將Proxy類別中的URL修改為包含?blob=http
而非?blob=base64
。 此動作可確保資料透過HTTP傳遞。 在Proxy類別中,找出下列程式碼行:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument";
並將其變更為:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument?blob=http";
引用.NET clienMyApplication/EncryptDocument程式集
將新的.NET客戶端程式集放置在要開發客戶端應用程式的電腦上。 將.NET客戶端程式集放置到目錄後,可以從項目中引用它。 從專案參考System.Web.Services
資料庫。 如果未引用此庫,則不能使用.NET客戶端程式集調用服務。
使用通過HTTP使用BLOB資料的.NET客戶端程式集調用服務
您可以使用透過HTTP使用資料的.NET用戶端程式集來叫用MyApplication/EncryptDocument
服務(此服務已在Workbench中建置)。 要調用MyApplication/EncryptDocument
服務,請執行以下步驟:
System.Web.Services
。MyApplication_EncryptDocumentService
對象。System.Net.NetworkCredential
對象設定MyApplication_EncryptDocumentService
對象的Credentials
屬性。 在System.Net.NetworkCredential
建構函式內,指定AEM表單使用者名稱及對應的密碼。 設定驗證值,使您的.NET客戶端應用程式能夠成功與AEM Forms交換SOAP消息。BLOB
物件。 BLOB
物件可用來將資料傳遞至MyApplication/EncryptDocument
程式。BLOB
對象的remoteURL
資料成員,該資料成員指定要傳遞到MyApplication/EncryptDocument
服務的PDF文檔的URI位置。MyApplication_EncryptDocumentService
對象的invoke
方法並傳遞BLOB
對象,以調用MyApplication/EncryptDocument
進程。 此過程在BLOB
對象內返回加密的PDF文檔。BLOB
物件的remoteURL
資料成員的值,以建立System.UriBuilder
物件。System.UriBuilder
物件轉換為System.IO.Stream
物件。 (此清單後面的C#快速入門說明了如何執行此任務。)System.IO.Stream
物件中的資料填入。System.IO.FileStream
對象來建立System.IO.BinaryWriter
對象。System.IO.BinaryWriter
對象的Write
方法並傳遞位元組陣列,將位元組陣列內容寫入PDF檔案。您可以使用Java代理類和BLOB資料,透過HTTP叫用AEM Forms服務。 要使用Java代理類調用MyApplication/EncryptDocument
服務,請執行以下步驟:
使用佔用MyApplication/EncryptDocument
服務WSDL的JAX-WS建立Java代理類。 使用以下WSDL端點:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
有關資訊,請參閱使用JAX-WS建立Java代理類。
將hiro-xp
替換為托管AEM Forms的J2EE應用程式伺服器的IP地址。
將使用JAX-WS建立的Java代理類打包到JAR檔案中。
包括位於以下路徑中的Java代理JAR檔案和JAR檔案:
<install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
進入Java客戶端項目的類路徑。
使用其建構子建立MyApplicationEncryptDocumentService
物件。
調用MyApplicationEncryptDocumentService
對象的getEncryptDocument
方法,建立MyApplicationEncryptDocument
對象。
將值指派給下列資料成員,以設定叫用AEM Forms所需的連線值:
將WSDL端點和編碼類型分配給javax.xml.ws.BindingProvider
對象的ENDPOINT_ADDRESS_PROPERTY
欄位。 若要使用BLOB over HTTP編碼叫用MyApplication/EncryptDocument
服務,請指定以下URL值:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http
將AEM表單使用者指派至javax.xml.ws.BindingProvider
物件的USERNAME_PROPERTY
欄位。
將相應的密碼值分配給javax.xml.ws.BindingProvider
對象的PASSWORD_PROPERTY
欄位。
下列程式碼範例顯示此應用程式邏輯:
//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);
使用其建構子建立BLOB
物件。
叫用setRemoteURL
方法,填入BLOB
物件。 傳遞一個字串值,該字串值指定PDF文檔的URI位置以傳遞至MyApplication/EncryptDocument
服務。
調用MyApplicationEncryptDocument
對象的invoke
方法並傳遞包含PDF文檔的BLOB
對象,以調用MyApplication/EncryptDocument
進程。 此過程在BLOB
對象內返回加密的PDF文檔。
建立位元組陣列,以儲存代表加密PDF檔案的資料流。 調用BLOB
對象的getRemoteURL
方法(使用invoke
方法返回的BLOB
對象)。
使用其建構子建立java.io.File
物件。 此對象表示加密的PDF文檔。
使用其建構子並傳遞java.io.File
物件,以建立java.io.FileOutputStream
物件。
調用java.io.FileOutputStream
對象的write
方法。 傳遞包含代表加密PDF檔案之資料流的位元組陣列。
您可以使用SOAP搭配附件來叫用AEM Forms服務。 AEM Forms支援MIME和DIME網站服務標準。 DIME可讓您傳送二進位附件(例如PDF檔案)以及叫用請求,而非對附件編碼。 使用DIME叫用AEM Forms一節討論使用DIME叫用以下AEM Forms短期進程MyApplication/EncryptDocument
。
叫用此程式時,會執行下列動作:
SetValue
操作。 此進程的輸入參數是名為inDoc
的document
進程變數。PasswordEncryptPDF
操作。 在名為outDoc
的進程變數中返回密碼加密的PDF文檔。此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument
**的程式。 (請參閱使用Workbench。)
不建議使用DIME叫用AEM Forms服務作業。 建議您使用MTOM。 (請參閱使用MTOM叫用AEM Forms。)
要建立可使用DIME調用Forms服務的.NET項目,請執行以下任務:
安裝網站服務增強功能2.0
在您的開發電腦上安裝Web服務增強功能2.0,並將其與Microsoft Visual Studio .NET整合。 您可以從Microsoft下載中心下載Web服務增強2.0。
從此網頁,搜索Web服務增強功能2.0,然後將其下載到您的開發電腦上。 此下載將名為Microsoft WSE 2.0 SPI.msi的檔案放在電腦上。 運行安裝程式,並遵循聯機指示。
網站服務增強功能2.0支援DIME。 使用Web服務增強2.0時,支援的Microsoft Visual Studio版本為2003。Web服務增強3.0不支援DIME;不過,它支援MTOM。
建立AEM Forms服務的網頁參考
在開發電腦上安裝Web服務增強2.0並建立Microsoft .NET項目後,請建立Forms服務的Web參考。 例如,要建立MyApplication/EncryptDocument
進程的Web引用,並假設本地電腦上安裝了Forms,請指定以下URL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL
建立Web引用後,可在.NET項目中使用以下兩種代理資料類型:EncryptDocumentService
和EncryptDocumentServiceWse
。 要使用DIME調用MyApplication/EncryptDocument
進程,請使用EncryptDocumentServiceWse
類型。
在建立Forms服務的網頁參考之前,請務必在專案中參考網站服務增強功能2.0。 (請參閱「安裝網站服務增強功能2.0」。)
參考WSE程式庫
建立Forms服務的網頁參考
確保啟用.NET項目以使用WSE庫。 在「項目資源管理器」中,按一下右鍵項目名稱並選擇啟用WSE 2.0。確保選中顯示的對話框上的複選框。
在.NET項目中使用DIME調用服務
您可以使用DIME叫用Forms服務。 請考慮MyApplication/EncryptDocument
程式,該程式接受不安全的PDF檔案並傳回密碼加密的PDF檔案。 要使用DIME調用MyApplication/EncryptDocument
進程,請執行以下步驟:
建立Microsoft .NET項目,該項目允許您使用DIME調用Forms服務。 請確定您包含網站服務增強功能2.0,並建立AEM Forms服務的網頁參考。
將Web引用設定為MyApplication/EncryptDocument
進程後,使用其預設建構子建立EncryptDocumentServiceWse
對象。
使用System.Net.NetworkCredential
值設定EncryptDocumentServiceWse
對象的Credentials
資料成員,該值指定AEM表單用戶名和密碼值。
使用其建構子並傳遞下列值,建立Microsoft.Web.Services2.Dime.DimeAttachment
物件:
System.Guid.NewGuid.ToString
方法來取得GUID值。application/pdf
。TypeFormat
枚舉值。 指定TypeFormat.MediaType
。使用其建構子建立BLOB
物件。
通過將Microsoft.Web.Services2.Dime.DimeAttachment
對象的Id
資料成員值分配給BLOB
對象的attachmentID
資料成員,將DIME附件添加到BLOB
對象。
調用EncryptDocumentServiceWse.RequestSoapContext.Attachments.Add
方法並傳遞Microsoft.Web.Services2.Dime.DimeAttachment
對象。
調用EncryptDocumentServiceWse
對象的invoke
方法並傳遞包含DIME附件的BLOB
對象,以調用MyApplication/EncryptDocument
進程。 此過程在BLOB
對象內返回加密的PDF文檔。
通過獲取返回BLOB
對象的attachmentID
資料成員的值,獲取附件標識符值。
逐一查看EncryptDocumentServiceWse.ResponseSoapContext.Attachments
中的附件,並使用附件標識符值來獲取加密的PDF文檔。
通過獲取Attachment
對象的Stream
資料成員的值,獲取System.IO.Stream
對象。
建立位元組陣列,並將該位元組陣列傳遞至System.IO.Stream
物件的Read
方法。 此方法會以代表加密PDF檔案的資料流填入位元組陣列。
叫用System.IO.FileStream
物件的建構子並傳遞代表PDF檔案位置的字串值,以建立物件。 此對象表示加密的PDF文檔。
通過調用其建構子並傳遞System.IO.FileStream
對象來建立System.IO.BinaryWriter
對象。
調用System.IO.BinaryWriter
對象的Write
方法並傳遞位元組陣列,將位元組陣列的內容寫入PDF檔案。
可以使用Apache Axis WSDL2Java工具將服務WSDL轉換為Java代理類,以便調用服務操作。 使用Apache Ant,您可以從AEM Forms服務WSDL生成Axis庫檔案,該WSDL允許您調用該服務。 (請參閱使用Apache Axis建立Java代理類。)
Apache Axis WSDL2Java工具會生成包含用於向服務發送SOAP請求的方法的JAVA檔案。 由服務接收的SOAP請求由Axis生成的庫解碼,並轉回為方法和參數。
要使用軸生成的庫檔案和DIME調用MyApplication/EncryptDocument
服務(已在Workbench中構建),請執行以下步驟:
使用Apache Axis建立使用MyApplication/EncryptDocument
服務WSDL的Java代理類。 (請參閱使用Apache Axis建立Java代理類。)
將Java代理類包含到類路徑中。
使用其建構子建立MyApplicationEncryptDocumentServiceLocator
物件。
使用其建構子並傳遞指定AEM Forms服務WSDL定義的字串值,以建立URL
物件。 請務必在SOAP端點URL的結尾處指定?blob=dime
。 例如,使用
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
通過調用其建構子並傳遞MyApplicationEncryptDocumentServiceLocator
對象和URL
對象來建立EncryptDocumentSoapBindingStub
對象。
叫用EncryptDocumentSoapBindingStub
物件的setUsername
和setPassword
方法,以設定AEM表單使用者名稱和密碼值。
encryptionClientStub.setUsername("administrator");
encryptionClientStub.setPassword("password");
通過建立java.io.File
對象來檢索要發送到MyApplication/EncryptDocument
服務的PDF文檔。 傳遞指定PDF文檔位置的字串值。
使用其建構子並傳遞javax.activation.FileDataSource
物件,以建立javax.activation.DataHandler
物件。 javax.activation.FileDataSource
物件可使用其建構函式並傳遞代表PDF檔案的java.io.File
物件來建立。
使用其建構子並傳遞javax.activation.DataHandler
物件,以建立org.apache.axis.attachments.AttachmentPart
物件。
調用EncryptDocumentSoapBindingStub
對象的addAttachment
方法並傳遞org.apache.axis.attachments.AttachmentPart
對象,以附加附件。
使用其建構子建立BLOB
物件。 調用BLOB
對象的setAttachmentID
方法並傳遞附件標識符值,以附件標識符值填充BLOB
對象。 調用org.apache.axis.attachments.AttachmentPart
對象的getContentId
方法可獲得此值。
調用EncryptDocumentSoapBindingStub
對象的invoke
方法來調用MyApplication/EncryptDocument
進程。 傳遞包含DIME附件的BLOB
對象。 此過程在BLOB
對象內返回加密的PDF文檔。
調用返回的BLOB
對象的getAttachmentID
方法,獲取附件標識符值。 此方法會傳回字串值,代表傳回附件的識別碼值。
調用EncryptDocumentSoapBindingStub
對象的getAttachments
方法來檢索附件。 此方法會傳回Objects
陣列,代表附件。
逐一查看附件(Object
陣列),並使用附件標識符值來獲取加密的PDF文檔。 每個元素都是org.apache.axis.attachments.AttachmentPart
物件。
調用org.apache.axis.attachments.AttachmentPart
對象的getDataHandler
方法,獲取與附件關聯的javax.activation.DataHandler
對象。
調用javax.activation.DataHandler
對象的getInputStream
方法,獲取java.io.FileStream
對象。
建立位元組陣列,並將該位元組陣列傳遞至java.io.FileStream
物件的read
方法。 此方法會以代表加密PDF檔案的資料流填入位元組陣列。
使用其建構子建立java.io.File
物件。 此對象表示加密的PDF文檔。
使用其建構子並傳遞java.io.File
物件,以建立java.io.FileOutputStream
物件。
調用java.io.FileOutputStream
對象的write
方法,並傳遞包含表示加密PDF文檔的資料流的位元組陣列。
另請參閱
AEM Forms在叫用服務時支援各種web服務驗證模式。 一種驗證模式是使用Web服務調用中的基本授權頭指定用戶名和密碼值。 AEM Forms也支援SAML斷言式驗證。 當客戶端應用程式使用web服務調用AEM Forms服務時,客戶端應用程式可以以下列方式之一提供驗證資訊:
AEM Forms不支援標準憑證式驗證,但支援不同格式的憑證式驗證。
Web服務快速入門於使用AEM Forms進行程式設計,指定用戶名和密碼值以執行授權。
AEM表單使用者的身分可透過使用機密金鑰簽署的SAML斷言來表示。 以下XML程式碼顯示SAML斷言的範例。
<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>
向管理員用戶發出此示例聲明。 此斷言包含下列值得注意的項目:
用戶端應用程式可從任何傳回AuthResult
物件的AEM Forms AuthenticationManager API中擷取斷言。 通過執行以下兩種方法之一,可以獲取AuthResult
實例:
AuthenticationManager.getAuthResultOnBehalfOfUser
方法。 此方法可讓用戶端應用程式為任何AEM表單使用者取得AuthResult
物件。AEM表單使用者可使用所取得的SAML代號來驗證。 此SAML斷言(xml片段)可隨Web服務呼叫(用於用戶驗證)一併傳送,作為WS-Security標頭的一部分。 通常,客戶端應用程式已驗證用戶,但未儲存用戶憑據。 (或者,用戶已通過使用用戶名和密碼以外的機制登錄到該客戶端。) 在此情況下,用戶端應用程式必須叫用AEM Forms並模擬允許叫用AEM Forms的特定使用者。
要模擬特定用戶,請使用Web服務調用AuthenticationManager.getAuthResultOnBehalfOfUser
方法。 此方法會傳回AuthResult
例項,其中包含該使用者的SAML斷言。
接下來,使用該SAML斷言來叫用任何需要驗證的服務。 此動作包括將斷言傳送為SOAP標頭的一部分。 使用此斷言進行Web服務呼叫時,AEM Forms會將使用者識別為該斷言所代表的使用者。 也就是說,斷言中指定的使用者是叫用服務的使用者。
您可以使用Axis程式庫建立的Java代理類調用AEM Forms服務。 (請參閱使用Apache Axis建立Java代理類。)
使用使用SAML型驗證的AXIS時,請使用Axis註冊請求和回應處理常式。 Apache Axis會先叫用處理常式,再將叫用請求傳送至AEM Forms。 要註冊處理程式,請建立擴展org.apache.axis.handlers.BasicHandler
的Java類。
建立軸為的AssertionHandler
以下名為AssertionHandler.java
的Java類顯示了擴展org.apache.axis.handlers.BasicHandler
的Java類示例。
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);
}
}
}
註冊處理程式
要用Axis註冊處理程式,請建立client-config.wsdd檔案。 依預設,Axis會尋找具有此名稱的檔案。 以下XML代碼是client-config.wsdd檔案的示例。 如需詳細資訊,請參閱軸檔案。
<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>
叫用AEM Forms服務
下列程式碼範例使用SAML型驗證來叫用AEM Forms服務。
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());
}
}
您可以使用.NET用戶端程式集和SAML型驗證來叫用Forms服務。 要執行此操作,必須使用網站服務增強功能3.0(WSE)。 有關建立使用WSE的.NET客戶端程式集的資訊,請參閱建立使用DIME的.NET項目。
DIME部分使用WSE 2.0。要使用基於SAML的驗證,請遵循在DIME主題中指定的相同說明。 但是,用WSE 3.0替換WSE 2.0。請在開發電腦上安裝Web服務增強功能3.0,並將其與Microsoft Visual Studio .NET整合。 您可以從Microsoft下載中心下載Web服務增強3.0。
WSE體系結構使用策略、斷言和SecurityToken資料類型。 簡短地,對於Web服務呼叫,請指定策略。 策略可以有多個斷言。 每個斷言都可包含篩選器。 在Web服務呼叫的某些階段會叫用篩選器,屆時可以修改SOAP請求。 如需完整詳細資訊,請參閱網站服務增強功能3.0檔案。
建立斷言和篩選
以下C#代碼示例建立篩選器和斷言類。 此程式碼範例會建立SamlAssertionOutputFilter。 在將SOAP請求發送到AEM Forms之前,WSE框架會叫用此篩選器。
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);
}
}
建立SAML代號
建立類別以表示SAML斷言。 此類執行的主要任務是將資料值從字串轉換為xml並保留空白。 此斷言xml稍後會匯入SOAP請求中。
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);
}
. . .
}
叫用AEM Forms服務
以下C#程式碼範例使用SAML型驗證來叫用Forms服務。
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);
}
}
使用網站服務叫用特定AEM Forms服務作業時,有時會發生問題。 本次討論的目的是確定這些問題,並提供解決辦法(如果有)。
如果您嘗試非同步叫用AEM Forms服務操作(例如產生PDF的htmlToPDF
操作),則會發生SoapFaultException
。 要解決此問題,請建立一個自定義綁定XML檔案,該檔案將ExportPDF_Result
元素和其他元素映射到不同的類中。 以下XML表示自定義綁定檔案。
<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>
使用JAX-WS建立Java代理檔案時,請使用此XML檔案。 (請參閱使用JAX-WS建立Java代理類。)
使用 — b
命令行選項執行JAX-WS工具(wsimport.exe)時,請參考此XML檔案。 更新綁定XML檔案中的wsdlLocation
元素以指定AEM Forms的URL。
要確保非同步調用工作正常,請修改端點URL值並指定async=true
。 例如,對於使用JAX-WS建立的Java代理檔案,請為BindingProvider.ENDPOINT_ADDRESS_PROPERTY
指定以下內容。
https://server:port/soap/services/ServiceName?wsdl&async=true&lc_version=9.0.0
以下清單指定了非同步調用時需要自定義綁定檔案的其他服務:
有時,使用特定J2EE應用程式伺服器建立的Proxy程式庫無法成功叫用托管在不同J2EE應用程式伺服器上的AEM Forms。 考慮使用部署在WebSphere上的AEM Forms產生的代理程式庫。 此代理程式庫無法成功調用部署在JBoss應用程式伺服器上的AEM Forms服務。
與JBoss應用程式伺服器相比,在WebSphere上部署AEM Forms時,某些AEM Forms複雜的資料類型(例如PrincipalReference
)的定義不同。 不同J2EE應用程式服務使用的JDK中的差異是WSDL定義中出現差異的原因。 因此,請使用從相同J2EE應用程式伺服器產生的代理程式庫。
由於命名空間衝突,資料對象無法在多個服務WSDL之間共用。 不同的服務可以共用資料類型,因此,服務在WSDL中共用這些類型的定義。 例如,不能將包含BLOB
資料類型的兩個.NET客戶端程式集添加到同一個.NET客戶端項目。 如果嘗試執行此操作,則會發生編譯錯誤。
以下清單指定了不能在多個服務WSDL之間共用的資料類型:
User
Principals
PrincipalReference
Groups
Roles
BLOB
為避免此問題,建議您完全符合資料類型的資格。 例如,假設.NET應用程式使用服務引用同時引用Forms服務和簽名服務。 兩個服務引用都將包含BLOB
類。 若要使用BLOB
實例,請在聲明BLOB
對象時對其進行完全限定。 此方法如下列程式碼範例所示。 如需此程式碼範例的相關資訊,請參閱以數位方式簽署互動式Forms。
下列C#程式碼範例會簽署由Forms服務轉譯的互動式表單。 客戶端應用程式有兩個服務引用。 與Forms服務相關聯的BLOB
例項屬於SignInteractiveForm.ServiceReference2
命名空間。 同樣,與簽名服務關聯的BLOB
實例屬於SignInteractiveForm.ServiceReference1
命名空間。 已簽名的互動式表單將另存為名為LoanXFASided.pdf的PDF檔案。
???/**
* 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);
}
}
}
}
使用Microsoft .Net 3.5和WCF時,某些AEM Forms生成的代理類的名稱不正確。 當為IBMFilenetContentRepositoryConnector、IDPSschedulerService或任何其名稱以字母I開頭的其他服務建立代理類時,會發生此問題。例如,在IBMFileNetContentRepositoryConnector的情況下,生成的客戶端的名稱為BMFileNetContentRepositoryConnectorClient
。 生成的代理類中缺少字母I。