使用Java API叫用AEM Forms invoking-aem-forms-using-the-javaapi
本檔案中的範例和範例僅適用於JEE環境上的AEM Forms 。
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
- 不同的驗證,例如使用者名稱和密碼
- 同步和非同步呼叫要求
包含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專屬程式庫目錄
連線模式和J2EE應用程式JAR檔案 connection-mode-and-j2ee-application-jar-files
下表列出的JAR檔案,視連線模式以及部署AEM Forms的J2EE應用程式伺服器而定。
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-apis-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 Application Server上,請包含這些JAR檔案。
-
(Web服務呼叫需要com.ibm.ws.webservices.thinclient_6.1.0.jar)。
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-apis-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-apis-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,建議您在Java專案的類別路徑中包含AEM Forms JAR檔案。 例如,如果您使用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
. 視建置AEM Forms的J2EE應用程式伺服器而定,請指定下列其中一個值:- 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_伺服器_型別:指定部署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請求的請求呼叫逾時限制。注意:只有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應用程式伺服器(例如,如果AEM Forms部署在JBoss上,請指定
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服務所需的專案。
下列程式碼範例說明如何使用 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物件
Document myPDFDocument = new Document(myByteArray);
根據其他檔案建立檔案 creating-a-document-based-on-another-document
下列程式碼範例會建立 com.adobe.idp.Document
以其他物件為基礎的物件 com.adobe.idp.Document
物件。
建立以其他檔案為基礎的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
物件后,可以將其轉換為以下格式:
- 物件
java.io.File
- 物件
java.io.InputStream
- 位元組陣列
下列程式碼行會轉換 com.adobe.idp.Document
物件至 java.io.InputStream
物件。 假設 myPDFDocument
代表 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
物件。
決定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 (稱為Java使用者端程式庫)來叫用。 A Java使用者端資源庫 是一組具體類別,可讓您存取服務容器中部署的服務。 您可以具現化代表要叫用的服務的Java物件,而非建立 InvocationRequest
物件。 「叫用API」可用來叫用在Workbench中建立的程式,例如長期程式。 (請參閱 叫用以人為中心的長期流程.)
若要執行服務作業,請叫用屬於Java物件的方法。 Java使用者端程式庫所包含的方法,通常會將服務操作對應到一。 使用Java使用者端程式庫時,請設定必要的連線屬性。 (請參閱 設定連線屬性.)
設定連線屬性之後,建立 ServiceClientFactory
物件,用來例項化Java物件,讓您叫用服務。 每個具有Java使用者端程式庫的服務都有對應的使用者端物件。 例如,若要叫用儲存庫服務,請建立 ResourceRepositoryClient
物件,使用它的建構函式並傳遞 ServiceClientFactory
物件。 此 ServiceClientFactory
物件負責維護呼叫AEM Forms服務所需的連線設定。
雖然取得 ServiceClientFactory
通常速度快,工廠第一次使用時會產生一些額外負荷。 此物件已針對重複使用進行最佳化,因此,在可能的情況下,請使用相同的 ServiceClientFactory
物件。 也就是說,請勿建立個別的 ServiceClientFactory
您所建立的每個使用者端程式庫物件的物件。
有一個使用者管理員設定可控制位於內的SAML宣告的存留期 com.adobe.idp.Context
影響 ServiceClientFactory
物件。 此設定會控制整個AEM Forms的所有驗證內容存留期,包括使用Java API執行的所有叫用。 依預設,時間週期 ServiceCleintFactory
物件可使用兩個小時。
writeResource
已叫用作業。 此操作會將新資源放入存放庫中。您可以使用 Java 客戶機資料庫並執行以下步驟來呼叫儲存庫服務:
-
將用戶端 JAR 檔案 (例如 adobe-存放庫-client.jar) 包含在 Java 專案的類別路徑中。 有關這些檔的位置的資訊,請參閱 包括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
物件。 -
透過叫用「 」,設定要新增到存放庫的XDP檔案的MIME型別
ResourceContent
物件的setMimeType
方法和傳遞application/vnd.adobe.xdp+xml
. -
新增的內容
ResourceContent
物件至Resource
物件(透過叫用Resource
物件setContent
方法並傳遞ResourceContent
物件。 -
透過叫用新增資源的說明
Resource
物件setDescription
方法並傳遞代表資源說明的字串值。 -
透過叫用將表單設計新增到存放庫
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-java //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
流'b5'7b)。 將傳回值轉換為Document
,如下列範例所示。code language-java 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
方法。
另請參閱