使用Java API叫用AEM Forms invoking-aem-forms-using-the-javaapi
AEM Forms可透過使用AEM Forms Java API來叫用。 使用AEM Forms Java API時,您可以使用叫用API或Java用戶端程式庫。 Java用戶端程式庫適用於服務,例如Rights Management服務。 這些強式類型API可讓您開發叫用AEM Forms的Java應用程式。
叫用API是位於 com.adobe.idp.dsc
包。 使用這些類,您可以直接將調用請求發送到服務並處理返回的調用響應。 使用叫用API來叫用使用Workbench建立的短期或長期處理程式。
以程式設計方式叫用服務的建議方式,是使用與服務相對應的Java用戶端程式庫,而非叫用API。 例如,要調用加密服務,請使用加密服務客戶端庫。 要執行加密服務操作,請調用屬於加密服務客戶端對象的方法。 您可以叫用以下命令,以密碼加密PDF檔案: EncryptionServiceClient
物件 encryptPDFUsingPassword
方法。
Java API支援下列功能:
- 用於遠程調用的RMI傳輸協定
- 用於本地調用的VM傳輸
- 遠程調用的SOAP
- 不同的驗證,如用戶名和密碼
- 同步和非同步調用請求
另請參閱
建立調用以人為中心的長生命週期過程的Java Web應用程式
包含AEM Forms Java程式庫檔案 including-aem-forms-java-library-files
要使用Java API以寫程式方式調用AEM Forms服務,請在Java項目的類路徑中包括所需的庫檔案(JAR檔案)。 您在客戶端應用程式的類路徑中包括的JAR檔案取決於以下幾個因素:
- 要叫用的AEM Forms服務。 客戶端應用程式可以調用一個或多個服務。
- 您要叫用AEM Forms服務的模式。 可以使用EJB或SOAP模式。 (請參閱 設定連接屬性.)
standalone.bat -b <Server IP> -c lc_turnkey.xml
指定EJB的伺服器IP。- 部署了AEM Forms的J2EE應用程式伺服器。
特定於服務的JAR檔案 service-specific-jar-files
下表列出調用AEM Forms服務所需的JAR檔案。
adobe-repository-client.jar
commons-codec-1.3.jar
<安裝目錄>/sdk/client-libs/common
<安裝目錄>/sdk/client-libs\thirdparty
-
adobe-rightsmanagement-client.jar
-
namespace.jar
-
jaxb-api.jar
-
jaxb-impl.jar
-
jaxb-libs.jar
-
jaxb-xjc.jar
-
relaxngDatatype.jar
-
xsdlib.jar
叫用Rights Management服務時需要。
如果AEM Forms部署在JBoss上,請納入所有這些檔案。
<安裝目錄>/sdk/client-libs/common
JBoss專用的lib目錄
連接模式和J2EE應用程式JAR檔案 connection-mode-and-j2ee-application-jar-files
下表列出了取決於連接模式和部署了AEM Forms的J2EE應用程式伺服器的JAR檔案。
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-api-2.5.0.jar
-
jaxen-1.1-beta-9.jar
-
jaxrpc.jar
-
log4j.jar
-
mail.jar
-
saaj.jar
-
wsdl4j.jar
-
xalan.jar
-
xbean.jar
- xercesImpl.jar
- commons-httpclient-3.1.jar
如果AEM Forms部署在JBoss Application Server上,請包含此JAR檔案。
如果jboss-client.jar和引用的jar不是共用的,則類載入器將找不到所需類。
JBoss客戶端庫目錄
如果將客戶端應用程式部署在同一個J2EE應用程式伺服器上,則無需包含此檔案。
WebLogic特定庫目錄
如果將客戶端應用程式部署在同一個J2EE應用程式伺服器上,則無需包含此檔案。
-
com.ibm.ws.admin.client_6.1.0.jar
-
com.ibm.ws.webservices.thinclient_6.1.0.jar
-
如果AEM Forms部署在WebSphere應用程式伺服器上,請包括這些JAR檔案。
-
(com.ibm.ws.webservices.thinclient_6.1.0.jar是Web服務調用的必需項)。
WebSphere特定庫目錄([WAS_HOME]/runtimes)
如果將客戶端應用程式部署在同一個J2EE應用程式伺服器上,則無需包括這些檔案。
叫用方案 invoking-scenarios
下表指定調用方案,並列出了成功調用AEM Forms所需的JAR檔案。
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
- jboss-client.jar
- adobe-forms-client.jar
- commons-httpclient-3.1.jar
Forms服務
Acrobat Reader DC擴充功能
簽名服務
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
- jboss-client.jar
- commons-httpclient-3.1.jar
-
adobe-forms-client.jar
-
adobe-reader-extensions-client.jar
-
adobe-signatures-client.jar
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
-
wlclient.jar
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-api-2.5.0.jar
-
jai_imageio.jar
-
jaxen-1.1-beta-9.jar
-
jaxrpc.jar
-
log4j.jar
-
mail.jar
-
saaj.jar
-
wsdl4j.jar
-
xalan.jar
-
xbean.jar
-
xercesImpl.jar
-
adobe-forms-client.jar
Forms服務
Acrobat Reader DC擴充功能
簽名服務
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
-
wlclient.jar
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-api-2.5.0.jar
-
jai_imageio.jar
-
jaxen-1.1-beta-9.jar
-
jaxrpc.jar
-
log4j.jar
-
mail.jar
-
saaj.jar
-
wsdl4j.jar
-
xalan.jar
-
xbean.jar
-
xercesImpl.jar
-
adobe-forms-client.jar
-
adobe-reader-extensions-client.jar
-
adobe-signatures-client.jar
升級JAR檔案 upgrading-jar-files
如果您要從LiveCycle升級為AEM Forms,建議您將AEM Forms JAR檔案包含在Java專案的類別路徑中。 例如,如果您使用Rights Management服務等服務,若您的類路徑中未包含AEM Forms JAR檔案,則會遇到相容性問題。
假設您要升級至AEM Forms。 要使用調用Rights Management服務的Java應用程式,請包括以下JAR檔案的AEM Forms版本:
- adobe-rightsmanagement-client.jar
- adobe-livecycle-client.jar
- adobe-usermanager-client.jar
另請參閱
設定連接屬性 setting-connection-properties
使用Java API時,您可以設定連線屬性來叫用AEM Forms。 在設定連接屬性時,指定是遠程還是本地調用服務,還指定連接模式和驗證值。 如果已啟用服務安全性,則需要驗證值。 但是,如果禁用了服務安全性,則無需指定驗證值。
連接模式可以是SOAP模式或EJB模式。 EJB模式使用RMI/IIOP協定,EJB模式的效能比SOAP模式的效能好。 SOAP模式用於消除J2EE應用程式伺服器依賴性,或當防火牆位於AEM Forms和客戶端應用程式之間時。 SOAP模式使用https協定作為基礎傳輸,並可跨防火牆邊界通信。 如果J2EE應用程式伺服器依賴關係或防火牆均不是問題,則建議使用EJB模式。
若要成功叫用AEM Forms服務,請設定下列連線屬性:
-
DSC_DEFAULT_EJB_ENDPOINT: 如果使用EJB連接模式,則此值表示部署了AEM Forms的J2EE應用程式伺服器的URL。 要遠程調用AEM Forms,請指定部署了AEM Forms的J2EE應用程式伺服器名稱。 如果您的客戶端應用程式位於相同的J2EE應用程式伺服器上,則可以指定
localhost
. 根據部署了哪些J2EE應用程式伺服器AEM Forms,指定以下值之一:- JBoss:
https://<ServerName>:8080 (default port)
- WebSphere:
iiop://<ServerName>:2809 (default port)
- WebLogic:
t3://<ServerName>:7001 (default port)
- JBoss:
-
DSC_DEFAULT_SOAP_ENDPOINT:如果您使用SOAP連接模式,此值表示將調用請求發送到的端點。 要遠程調用AEM Forms,請指定部署了AEM Forms的J2EE應用程式伺服器名稱。 如果您的客戶端應用程式位於同一個J2EE應用程式伺服器上,則可以指定
localhost
(例如,http://localhost:8080
.)- 埠值
8080
若J2EE應用程式為JBoss,則適用。 如果J2EE應用程式伺服器是IBM® WebSphere®,請使用埠9080
. 同樣,如果J2EE應用程式伺服器是WebLogic,請使用埠7001
. (這些值是預設埠值。 如果更改埠值,請使用適用的埠號。)
- 埠值
-
DSC_TRANSPORT_PROTOCOL:如果使用EJB連接模式,請指定
ServiceClientFactoryProperties.DSC_EJB_PROTOCOL
的值。 如果使用SOAP連接模式,請指定ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL
. -
DSC_SERVER_TYPE:指定部署了AEM Forms的J2EE應用程式伺服器。 有效值為
JBoss
,WebSphere
,WebLogic
.- 如果將此連接屬性設定為
WebSphere
,java.naming.factory.initial
值設為com.ibm.ws.naming.util.WsnInitCtxFactory
. - 如果將此連接屬性設定為
WebLogic
,java.naming.factory.initial
值設為weblogic.jndi.WLInitialContextFactory
. - 同樣地,如果將此連接屬性設定為
JBoss
,java.naming.factory.initial
值設為org.jnp.interfaces.NamingContextFactory
. - 您可以設定
java.naming.factory.initial
屬性,以取得符合您要求的值(如果您不想使用預設值)。
note note NOTE 而非使用字串來設定 DSC_SERVER_TYPE
connection屬性,您可以使用ServiceClientFactoryProperties
類別。 可使用下列值:ServiceClientFactoryProperties.DSC_WEBSPHERE_SERVER_TYPE
,ServiceClientFactoryProperties.DSC_WEBLOGIC_SERVER_TYPE
,或ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE
. - 如果將此連接屬性設定為
-
DSC_CREDENTIAL_USERNAME: 指定AEM表單使用者名稱。 若要讓使用者成功叫用AEM Forms服務,他們需要「服務使用者」角色。 用戶也可以具有包含服務調用權限的其他角色。 否則,當它們嘗試調用服務時會引發異常。 如果禁用了服務安全,則無需指定此連接屬性。
-
DSC_CREDENTIAL_PASSWORD: 指定相應的密碼值。 如果禁用了服務安全,則無需指定此連接屬性。
-
DSC_REQUEST_TIMEOUT: SOAP請求的預設請求超時限制為1200000毫秒(20分鐘)。 某個時候,請求完成操作可能需要較長的時間。 例如,擷取大量記錄的SOAP請求可能需要較長的逾時限制。 您可以使用
ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT
以增加SOAP請求的請求呼叫逾時限制。note note NOTE 只有基於SOAP的調用支援DSC_REQUEST_TIMEOUT屬性。
要設定連接屬性,請執行以下任務:
-
建立
java.util.Properties
物件,使用其建構子。 -
若要設定
DSC_DEFAULT_EJB_ENDPOINT
連接屬性,調用java.util.Properties
物件setProperty
方法,並傳遞下列值:- 此
ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT
枚舉值 - 指定承載AEM Forms之J2EE應用程式伺服器URL的字串值
note note NOTE 如果您使用SOAP連接模式,請指定 ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT
分項清單值,而非ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT
枚舉值。 - 此
-
若要設定
DSC_TRANSPORT_PROTOCOL
連接屬性,調用java.util.Properties
物件setProperty
方法,並傳遞下列值:- 此
ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL
枚舉值 - 此
ServiceClientFactoryProperties.DSC_EJB_PROTOCOL
枚舉值
note note NOTE 如果您使用SOAP連接模式,請指定 ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL
分項清單值,而非ServiceClientFactoryProperties.DSC_EJB_PROTOCOL
枚舉值。 - 此
-
若要設定
DSC_SERVER_TYPE
連接屬性,調用java.util.Properties
物件setProperty
方法,並傳遞下列值:-
此
ServiceClientFactoryProperties.DSC_SERVER_TYPE
枚舉值 -
指定托管AEM Forms的J2EE應用程式伺服器的字串值(例如,如果已在JBoss上部署AEM Forms,請指定
JBoss
)。- 若要設定
DSC_CREDENTIAL_USERNAME
連接屬性,調用java.util.Properties
物件setProperty
方法,並傳遞下列值:
- 若要設定
-
此
ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME
枚舉值 -
字串值,指定叫用AEM Forms所需的使用者名稱
- 若要設定
DSC_CREDENTIAL_PASSWORD
連接屬性,調用java.util.Properties
物件setProperty
方法,並傳遞下列值:
- 若要設定
-
此
ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD
枚舉值 -
指定相應密碼值的字串值
-
為JBoss設定EJB連接模式
以下Java代碼示例設定連接屬性,以調用部署在JBoss上的AEM Forms並使用EJB連接模式。
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "https://<hostname>:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"https://<hostname>:8080");
設定WebLogic的EJB連接模式
以下Java代碼示例設定連接屬性,以調用部署在WebLogic上的AEM Forms並使用EJB連接模式。
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "t3://localhost:7001");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "WebLogic");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
設定WebSphere的EJB連接模式
以下Java代碼示例設定連接屬性,以調用部署在WebSphere上的AEM Forms並使用EJB連接模式。
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "iiop://localhost:2809");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "WebSphere");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
設定SOAP連接模式
以下Java代碼示例在SOAP模式下設定連接屬性,以調用部署在JBoss上的AEM Forms。
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
在禁用服務安全時設定連接屬性
以下Java代碼示例設定調用部署在JBoss Application Server上的AEM Forms以及禁用服務安全時所需的連接屬性。
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://localhost:1099");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
使用自訂請求逾時限制設定SOAP連線模式
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT, "1800000"); // Request timeout limit 30 Minutes
使用內容物件叫用AEM Forms
您可以使用 com.adobe.idp.Context
物件以向已驗證的使用者叫用AEM Forms服務( com.adobe.idp.Context
物件代表已驗證的使用者)。 使用 com.adobe.idp.Context
物件,您不需要設定 DSC_CREDENTIAL_USERNAME
或 DSC_CREDENTIAL_PASSWORD
屬性。 您可以取得 com.adobe.idp.Context
對象 AuthenticationManagerServiceClient
物件 authenticate
方法。
此 authenticate
方法傳回 AuthResult
包含驗證結果的物件。 您可以建立 com.adobe.idp.Context
對象,方法是調用其建構子。 然後叫用 com.adobe.idp.Context
物件 initPrincipal
方法並傳遞 AuthResult
物件,如下列程式碼所示:
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
而非設定 DSC_CREDENTIAL_USERNAME
或 DSC_CREDENTIAL_PASSWORD
屬性,您可以叫用 ServiceClientFactory
物件 setContext
方法並傳遞 com.adobe.idp.Context
物件。 使用AEM表單使用者叫用服務時,請確定他們的角色為 Services User
叫用AEM Forms服務時所需的URL。
下列程式碼範例說明如何使用 com.adobe.idp.Context
連接設定內用於建立的對象 EncryptionServiceClient
物件。
//Authenticate a user and use the Context object within connection settings
// Authenticate the user
String username = "wblue";
String password = "password";
AuthResult authResult = authClient.authenticate(username, password.getBytes());
//Set a Content object that represents the authenticated user
//Use the Context object to invoke the Encryption service
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
//Set connection settings
Properties connectionProps = new Properties();
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://<server>:1099");
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL, ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"jnp://<server>:1099");
//Create a ServiceClientFactory object
ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
myFactory.setContext(myCtx);
//Create an EncryptionServiceClient object
EncryptionServiceClient encryptClient = new EncryptionServiceClient(myFactory);
叫用方案 invoking_scenarios-1
本節將討論以下叫用的情況:
- 在自己的Java虛擬機(JVM)中運行的客戶端應用程式調用獨立的AEM Forms實例。
- 在自己的JVM中運行的客戶端應用程式調用群集的AEM Forms實例。
叫用獨立AEM Forms例項的用戶端應用程式 client-application-invoking-a-stand-alone-aem-forms-instance
下圖顯示在其JVM中執行並叫用獨立AEM Forms例項的用戶端應用程式。
在此情況下,客戶端應用程式在其自己的JVM中運行,並調用AEM Forms服務。
客戶端應用程式調用群集AEM Forms實例 client-application-invoking-clustered-aem-forms-instances
下圖顯示在自己的JVM中運行並調用群集中的AEM Forms實例的客戶端應用程式。
此情境類似於叫用獨立AEM Forms例項的用戶端應用程式。 但提供者URL不同。 如果客戶端應用程式要連接到特定的J2EE應用程式伺服器,應用程式必須更改URL以引用特定的J2EE應用程式伺服器。
不建議參考特定的J2EE應用程式伺服器,因為如果應用程式伺服器停止,客戶端應用程式與AEM Forms之間的連接將終止。 建議提供程式URL引用單元級JNDI管理器,而不是特定的J2EE應用程式伺服器。
使用SOAP連接模式的客戶端應用程式可以使用群集的HTTP負載平衡器埠。 使用EJB連接模式的客戶端應用程式可以連接到特定J2EE應用程式伺服器的EJB埠。 此操作處理群集節點之間的負載平衡。
WebSphere
以下示例顯示用於連接到部署在WebSphere上的AEM Forms的jndi.properties檔案的內容。
java.naming.factory.initial=com.ibm.websphere.naming.
WsnInitialContextFactory
java.naming.provider.url=corbaloc::appserver1:9810,:appserver2:9810
WebLogic
以下示例顯示用於連接到部署在WebLogic上的AEM Forms的jndi.properties檔案的內容。
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://appserver1:8001, appserver2:8001
JBoss
以下示例顯示用於連接到部署在JBoss上的AEM Forms的jndi.properties檔案的內容。
java.naming.factory.initial= org.jnp.interfaces.NamingContextFactory
java.naming.provider.url= jnp://appserver1:1099, appserver2:1099,
appserver3:1099
另請參閱
使用Java API將資料傳遞至AEM Forms服務 passing-data-to-aem-forms-services-using-the-java-api
AEM Forms服務作業通常會使用或產生PDF檔案。 叫用服務時,有時需要將PDF檔案(或其他檔案類型,如XML資料)傳遞至服務。 同樣,有時也需要處理從服務傳回的PDF檔案。 可讓您將資料傳遞至AEM Forms服務及從Java類別為 com.adobe.idp.Document
.
AEM Forms服務不接受PDF檔案作為其他資料類型,例如 java.io.InputStream
物件或位元組陣列。 A com.adobe.idp.Document
物件也可用來將其他類型的資料(例如XML資料)傳遞至服務。
A com.adobe.idp.Document
對象是Java可序列化的類型,因此可通過RMI調用傳遞。 接收方可以配置(同一主機、同一類載入器)、本地(同一主機、不同類載入器)或遠程(不同主機)。 針對每個案例最佳化檔案內容的傳遞。 例如,如果傳送者和接收者位於相同的主機上,則內容會透過本機檔案系統傳遞。 (在某些情況下,檔案可以傳入記憶體。)
視 com.adobe.idp.Document
物件大小,則會在 com.adobe.idp.Document
對象或儲存在伺服器的檔案系統上。 由 com.adobe.idp.Document
物件會在 com.adobe.idp.Document
處置。 (請參閱 處理文檔對象.)
有時需要知道 com.adobe.idp.Document
物件,才能將其傳遞至服務。 例如,如果操作需要特定內容類型,例如 application/pdf
,建議您判斷內容類型。 (請參閱 確定文檔的內容類型.)
此 com.adobe.idp.Document
物件會嘗試使用提供的資料來判斷內容類型。 如果無法從提供的資料中檢索內容類型(例如,當資料以位元組陣列形式提供時),請設定內容類型。 若要設定內容類型,請叫用 com.adobe.idp.Document
物件 setContentType
方法。 (請參閱 確定文檔的內容類型)
如果宣傳資料檔案位於同一檔案系統上,請建立 com.adobe.idp.Document
物件速度更快。 如果宣傳資料檔案位於遠程檔案系統上,則必須執行複製操作,這會影響效能。
應用程式可包含兩者 com.adobe.idp.Document
和 org.w3c.dom.Document
資料類型。 不過,請確定您完全符合 org.w3c.dom.Document
資料類型。 如需轉換 org.w3c.dom.Document
對象 com.adobe.idp.Document
對象,請參見 快速入門(EJB模式):使用Java API以可流式配置預填Forms.
com.adobe.idp.Document
對象,以2048位元組或更少的塊讀取文檔資訊。 例如,以下代碼以2048位元組的塊讀取文檔資訊: // Set up the chunk size to prevent a potential memory leak
int buffSize = 2048;
// Determine the total number of bytes to read
int docLength = (int) inDoc.length();
byte [] byteDoc = new byte[docLength];
// Set up the reading position
int pos = 0;
// Loop through the document information, 2048 bytes at a time
while (docLength > 0) {
// Read the next chunk of information
int toRead = Math.min(buffSize, docLength);
int bytesRead = inDoc.read(pos, byteDoc, pos, toRead);
// Handle the exception in case data retrieval failed
if (bytesRead == -1) {
inDoc.doneReading();
inDoc.dispose();
throw new RuntimeException("Data retrieval failed!");
}
// Update the reading position and number of bytes remaining
pos += bytesRead;
docLength -= bytesRead;
}
// The document information has been successfully read
inDoc.doneReading();
inDoc.dispose();
另請參閱
建立文檔 creating-documents
建立 com.adobe.idp.Document
在調用需要PDF文檔(或其他文檔類型)作為輸入值的服務操作之前,對象。 此 com.adobe.idp.Document
類提供了建構子,使您能夠從以下內容類型中建立文檔:
- 位元組陣列
- 現有
com.adobe.idp.Document
物件 - A
java.io.File
物件 - A
java.io.InputStream
物件 - A
java.net.URL
物件
根據位元組陣列建立文檔 creating-a-document-based-on-a-byte-array
下列程式碼範例會建立 com.adobe.idp.Document
基於位元組陣列的對象。
建立基於位元組陣列的文檔對象
Document myPDFDocument = new Document(myByteArray);
根據其他文檔建立文檔 creating-a-document-based-on-another-document
下列程式碼範例會建立 com.adobe.idp.Document
以其他 com.adobe.idp.Document
物件。
建立基於其他文檔的文檔對象
//Create a Document object based on a byte array
InputStream is = new FileInputStream("C:\\Map.pdf");
int len = is.available();
byte [] myByteArray = new byte[len];
int i = 0;
while (i < len) {
i += is.read(myByteArray, i, len);
}
Document myPDFDocument = new Document(myByteArray);
//Create another Document object
Document anotherDocument = new Document(myPDFDocument);
根據檔案建立文檔 creating-a-document-based-on-a-file
下列程式碼範例會建立 com.adobe.idp.Document
以名為的PDF檔案為基礎的物件 map.pdf. 此檔案位於C硬碟的根目錄中。 此建構函式會嘗試設定 com.adobe.idp.Document
物件,使用副檔名。
此 com.adobe.idp.Document
接受的建構子 java.io.File
物件也接受布林值參數。 將此參數設為 true
, com.adobe.idp.Document
物件會刪除檔案。 此動作表示您不必在將檔案傳遞至 com.adobe.idp.Document
建構子。
將此參數設為 false
表示您保留此檔案的所有權。 將此參數設為 true
效率更高。 原因是 com.adobe.idp.Document
對象可以將檔案直接移動到本地管理區域,而不是複製它(速度較慢)。
建立基於PDF檔案的文檔對象
//Create a Document object based on the map.pdf source file
File mySourceMap = new File("C:\\map.pdf");
Document myPDFDocument = new Document(mySourceMap,true);
根據InputStream對象建立文檔 creating-a-document-based-on-an-inputstream-object
下列Java程式碼範例會建立 com.adobe.idp.Document
以 java.io.InputStream
物件。
根據InputStream對象建立文檔
//Create a Document object based on an InputStream object
InputStream is = new FileInputStream("C:\\Map.pdf");
Document myPDFDocument = new Document(is);
根據可從URL存取的內容建立檔案 creating-a-document-based-on-content-accessible-from-an-url
下列Java程式碼範例會建立 com.adobe.idp.Document
以名為的PDF檔案為基礎的物件 map.pdf. 此檔案位於名為的Web應用程式中 WebApp
正在運行 localhost
. 此建構子會嘗試將 com.adobe.idp.Document
物件的MIME內容類型,使用隨URL通訊協定傳回的內容類型。
提供給 com.adobe.idp.Document
在原始 com.adobe.idp.Document
物件已建立,如以下範例所示:
Document doc = new Document(new java.net.URL("file:c:/temp/input.pdf"));
c:/temp/input.pdf檔案必須位於客戶端電腦上(而不是伺服器電腦上)。 用戶端電腦是讀取URL的位置,以及 com.adobe.idp.Document
對象已建立。
根據可從URL存取的內容建立檔案
//Create a Document object based on a java.net.URL object
URL myURL = new URL("http", "localhost", 8080,"/WebApp/map.pdf");
//Create another Document object
Document myPDFDocument = new Document(myURL);
另請參閱
處理返回的文檔 handling-returned-documents
將PDF文檔(或其他資料類型,如XML資料)作為輸出值返回的服務操作將返回 com.adobe.idp.Document
物件。 在您收到 com.adobe.idp.Document
物件,您可將其轉換為下列格式:
- A
java.io.File
物件 - A
java.io.InputStream
物件 - 位元組陣列
下列一行程式碼會轉換 com.adobe.idp.Document
對象 java.io.InputStream
物件。 假設 myPDFDocument
代表a com.adobe.idp.Document
物件:
java.io.InputStream resultStream = myDocument.getInputStream();
同樣地,您也可以複製 com.adobe.idp.Document
執行下列工作,將檔案重新命名為本機檔案:
- 建立
java.io.File
物件。 - 叫用
com.adobe.idp.Document
物件copyToFile
方法並傳遞java.io.File
物件。
下列程式碼範例會複製 com.adobe.idp.Document
對象為 AnotherMap.pdf.
將文檔對象的內容複製到檔案
File outFile = new File("C:\\AnotherMap.pdf");
myDocument.copyToFile (outFile);
另請參閱
確定文檔的內容類型 determining-the-content-type-of-a-document
決定的MIME類型 com.adobe.idp.Document
對象,方法是調用 com.adobe.idp.Document
物件 getContentType
方法。 此方法會傳回字串值,指定 com.adobe.idp.Document
物件。 下表說明AEM Forms傳回的不同內容類型。
application/pdf
application/vnd.adobe.xdp+xml
text/xml
application/vnd.fdf
application/vnd.adobe.xfdf
application/rdf+xml
application/octet-stream
NULL
下列程式碼範例會判斷 com.adobe.idp.Document
物件。
確定文檔對象的內容類型
//Determine the content type of the Document object
String ct = myDocument.getContentType();
System.out.println("The content type of the Document object is " +ct);
另請參閱
處理文檔對象 disposing-document-objects
當您不再需要 Document
對象,建議您通過調用其 dispose
方法。 每個 Document
對象佔用應用程式的主機平台上的檔案描述符和多達75 MB的RAM空間。 若 Document
對象未處理,則Java Garage收集過程會處理它。 不過,使用 dispose
方法,您可以釋放 Document
物件。
另請參閱
使用Java客戶端庫調用服務 invoking-a-service-using-a-java-client-library
AEM Forms服務作業可透過服務的強制類型API來叫用,此API稱為Java用戶端程式庫。 A Java客戶端庫 是一組具體類,可提供對服務容器中部署的服務的訪問。 將代表服務的Java物件實例化以叫用,而非建立 InvocationRequest
物件(使用叫用API)。 叫用API可用來叫用在Workbench中建立的程式,例如長期使用的程式。 (請參閱 調用以人為中心的長壽命過程.)
要執行服務操作,請調用屬於Java對象的方法。 Java用戶端程式庫包含通常會將一對一與服務操作對應的方法。 使用Java客戶端庫時,請設定所需的連接屬性。 (請參閱 設定連接屬性.)
設定連線屬性後,請建立 ServiceClientFactory
用於實例化Java對象的對象,它允許您調用服務。 每個具有Java客戶端庫的服務都有相應的客戶端對象。 例如,要調用儲存庫服務,請建立 ResourceRepositoryClient
對象,使用其建構子並傳遞 ServiceClientFactory
物件。 此 ServiceClientFactory
物件負責維護叫用AEM Forms服務所需的連線設定。
雖然已取得 ServiceClientFactory
通常速度很快,當首次使用工廠時會涉及一些開銷。 此對象經過優化以便重複使用,因此,如果可能,請使用 ServiceClientFactory
對象。 也就是說,請勿建立個別 ServiceClientFactory
您建立的每個用戶端程式庫物件的物件。
有一個「使用者管理員」設定,可控制位於 com.adobe.idp.Context
影響 ServiceClientFactory
物件。 此設定會控制整個AEM Forms中的所有驗證內容存留期,包括使用Java API執行的所有叫用。 依預設, ServiceCleintFactory
物件的使用時間為2小時。
writeResource
叫用操作。 此操作會將新資源放入儲存庫。您可以使用Java客戶端庫並執行以下步驟來調用儲存庫服務:
-
在Java專案的類別路徑中包含用戶端JAR檔案,例如adobe-repository-client.jar。 如需這些檔案的位置資訊,請參閱 包含AEM Forms Java程式庫檔案.
-
設定調用服務所需的連接屬性。
-
建立
ServiceClientFactory
對象,方法是調用ServiceClientFactory
對象的靜態createInstance
方法和傳遞java.util.Properties
包含連接屬性的對象。 -
建立
ResourceRepositoryClient
對象,使用其建構子並傳遞ServiceClientFactory
物件。 使用ResourceRepositoryClient
對象,以調用儲存庫服務操作。 -
建立
RepositoryInfomodelFactoryBean
使用其建構子來對象null
. 此物件可讓您建立Resource
代表新增至存放庫之內容的物件。 -
建立
Resource
對象,方法是調用RepositoryInfomodelFactoryBean
物件newImage
方法並傳遞下列值:- 唯一ID值,需指定
new Id()
. - 唯一UUID值,需指定
new Lid()
. - 資源的名稱。 您可以指定XDP檔案的檔案名。
將傳回值轉換為
Resource
. - 唯一ID值,需指定
-
建立
ResourceContent
對象,方法是調用RepositoryInfomodelFactoryBean
物件newImage
將返回值轉換為ResourceContent
. 此物件代表新增至存放庫的內容。 -
建立
com.adobe.idp.Document
物件,透過傳遞java.io.FileInputStream
儲存要新增至存放庫之XDP檔案的物件。 (請參閱 根據InputStream對象建立文檔.) -
新增
com.adobe.idp.Document
物件ResourceContent
對象,方法是調用ResourceContent
物件setDataDocument
方法。 傳遞com.adobe.idp.Document
物件。 -
叫用
ResourceContent
物件setMimeType
方法與傳遞application/vnd.adobe.xdp+xml
. -
新增
ResourceContent
物件Resource
對象,方法是調用Resource
物件ssetContent
方法和傳遞ResourceContent
物件。 -
叫用
Resource
物件ssetDescription
方法,並傳遞代表資源說明的字串值。 -
叫用
ResourceRepositoryClient
物件writeResource
方法並傳遞下列值:- 一個字串值,它指定包含新資源的資源集合的路徑
- 此
Resource
建立的對象
另請參閱
使用叫用API叫用短期處理程式 invoking-a-short-lived-process-using-the-invocation-api
您可以使用Java調用API調用短期進程。 當您使用叫用API叫用短期處理程式時,請使用 java.util.HashMap
物件。 對於要傳遞至服務的每個參數,請叫用 java.util.HashMap
物件 put
方法,並指定服務執行指定操作所需的名稱值組。 指定屬於短期進程的參數的確切名稱。
這裡討論的是使用叫用API來叫用下列名為的AEM Forms短期處理程式 MyApplication/EncryptDocument
.
MyApplication/EncryptDocument
使用Workbench。 (請參閱 使用Workbench.)叫用此程式時,會執行下列動作:
- 獲取傳遞至流程的不安全PDF文檔。 此動作以
SetValue
操作。 此程式的輸入參數為document
進程變數已命名inDoc
. - 使用密碼加密PDF文檔。 此動作以
PasswordEncryptPDF
操作。 密碼加密的PDF文檔在名為的進程變數中返回outDoc
.
使用Java調用API調用MyApplication/EncryptDocument短期進程 invoke-the-myapplication-encryptdocument-short-lived-process-using-the-java-invocation-api
叫用 MyApplication/EncryptDocument
使用Java調用API的短期過程:
-
在您Java專案的類別路徑中加入用戶端JAR檔案,例如adobe-livecycle-client.jar。 (請參閱 包含AEM Forms Java程式庫檔案.)
-
建立
ServiceClientFactory
包含連接屬性的對象。 (請參閱 設定連接屬性.) -
建立
ServiceClient
對象,使用其建構子並傳遞ServiceClientFactory
物件。 AServiceClient
物件可讓您叫用服務操作。 它處理諸如查找、調度和路由調用請求等任務。 -
建立
java.util.HashMap
物件,使用其建構子。 -
叫用
java.util.HashMap
物件put
方法,將每個輸入參數傳遞至長期處理。 因為MyApplication/EncryptDocument
短期過程需要一個類型的輸入參數Document
,您只需叫用put
方法一次,如下列範例所示。code language-as3 //Create a Map object to store the parameter value for inDoc Map params = new HashMap(); InputStream inFile = new FileInputStream("C:\\Adobe\Loan.pdf"); Document inDoc = new Document(inFile); params.put("inDoc", inDoc);
-
建立
InvocationRequest
對象,方法是調用ServiceClientFactory
物件createInvocationRequest
方法並傳遞下列值:- 一個字串值,它指定要調用的長期進程的名稱。 叫用
MyApplication/EncryptDocument
進程,指定MyApplication/EncryptDocument
. - 表示流程操作名稱的字串值。 短期流程操作的名稱通常為
invoke
. - 此
java.util.HashMap
包含服務操作所需參數值的對象。 - 一個布爾值,它指定
true
,會建立同步請求(此值適用於叫用短期處理程式)。
- 一個字串值,它指定要調用的長期進程的名稱。 叫用
-
叫用
ServiceClient
物件invoke
方法和傳遞InvocationRequest
物件。 此invoke
方法傳回InvocationReponse
物件。note note NOTE 傳遞值可叫用長期的程式 false
作為createInvocationRequest
方法。 傳遞值false
建立非同步請求。 -
叫用
InvocationReponse
物件getOutputParameter
方法,並傳遞指定輸出參數名稱的字串值。 在此情況下,請指定outDoc
(outDoc
是MyApplication/EncryptDocument
程式)。 將傳回值轉換為Document
,如下列範例所示。code language-as3 InvocationResponse response = myServiceClient.invoke(request); Document encryptDoc = (Document) response.getOutputParameter("outDoc");
-
建立
java.io.File
物件,並確定副檔名為.pdf。 -
叫用
com.adobe.idp.Document
物件copyToFile
複製內容的方法com.adobe.idp.Document
物件。 請確定您使用com.adobe.idp.Document
由傳回的物件getOutputParameter
方法。
另請參閱