本文中的範例和範例僅適用於AEM Forms的JEE環境。
AEM Forms可透過使用AEM FormsJava API來呼叫。 使用AEM FormsJava API時,您可以使用Invocation API或Java客戶端庫。 Java客戶端庫可用於服務,如Rights Management服務。 這些強式型別API可讓您開發叫用AEM Forms的Java應用程式。
調用API是位於com.adobe.idp.dsc
包中的類。 使用這些類,您可以直接向服務發送調用請求並處理返回的調用響應。 使用「呼叫API」來叫用使用Workbench建立的短期或長期流程。
建議以程式設計方式叫用服務的方式是使用與服務對應的Java用戶端程式庫,而非叫用API。 例如,要調用加密服務,請使用加密服務客戶端庫。 要執行加密服務操作,請調用屬於加密服務客戶端對象的方法。 您可以叫用EncryptionServiceClient
物件的encryptPDFUsingPassword
方法,以密碼加密PDF檔案。
Java API支援下列功能:
Adobe開發人員網站
Adobe開發人員網站包含下列文章,討論如何使用Java API叫用AEM Forms服務:
另請參閱
若要使用Java API以程式設計方式叫用AEM Forms服務,請在Java專案的類路徑中加入必要的程式庫檔案(JAR檔案)。 您在客戶端應用程式的類路徑中包含的JAR檔案取決於以下幾個因素:
(僅交鑰匙)使用命令standalone.bat -b <Server IP> -c lc_turnkey.xml
啟動AEM Forms伺服器,以指定EJB的伺服器IP
下表列出調用AEM Forms服務所需的JAR檔案。
檔案 |
說明 |
位置 |
---|---|---|
adobe-livecycle-client.jar |
必須一律包含在Java用戶端應用程式的類別路徑中。 |
<>install directory>/sdk/client-libs/common |
adobe-usermanager-client.jar |
必須一律包含在Java用戶端應用程式的類別路徑中。 |
<>install directory>/sdk/client-libs/common |
adobe-utilities.jar |
必須一律包含在Java用戶端應用程式的類別路徑中。 |
<>install directory>/sdk//client-libs/<app server=""> |
adobe-applicationmanager-client-sdk.jar |
調用應用程式管理器服務時必需。 |
<>install directory>/sdk/client-libs/common |
adobe-assembler-client.jar |
調用Assembler服務所需。 |
<>install directory>/sdk/client-libs/common |
adobe-backup-restore-client-sdk.jar |
調用備份和還原服務API時必需。 |
<>install directory>/sdk/client-libs/common |
adobe-barcodedforms-client.jar |
呼叫條形碼表單服務所需。 |
<>install directory>/sdk/client-libs/common |
adobe-convertpdf-client.jar |
需要叫用轉換PDF服務。 |
<>install directory>/sdk/client-libs/common |
adobe-distiller-client.jar |
必須叫用Distiller服務。 |
<>install directory>/sdk/client-libs/common |
adobe-docconverter-client.jar |
調用DocConverter服務時必需。 |
<>install directory>/sdk/client-libs/common |
adobe-contentservices-client.jar |
需要叫用「檔案管理」服務。 |
<>install directory>/sdk/client-libs/common |
adobe-encryption-client.jar |
調用加密服務時必需。 |
<>install directory>/sdk/client-libs/common |
adobe-forms-client.jar |
必須叫用Forms服務。 |
<>install directory>/sdk/client-libs/common |
adobe-formdataintegration-client.jar |
需要呼叫表單資料整合服務。 |
<>install directory>/sdk/client-libs/common |
adobe-generatepdf-client.jar |
需要叫用「產生PDF」服務。 |
<>install directory>/sdk/client-libs/common |
adobe-generate3dpdf-client.jar |
需要叫用「產生3D PDF」服務。 |
<>install directory>/sdk/client-libs/common |
adobe-jobmanager-client-sdk.jar |
調用作業管理器服務時必需。 |
<>install directory>/sdk/client-libs/common |
adobe-output-client.jar |
調用輸出服務時需要。 |
<>install directory>/sdk/client-libs/common |
adobe-pdfutility-client.jar |
需要叫用PDF公用程式或公用程XMP式服務。 |
<>install directory>/sdk/client-libs/common |
adobe-reader-extensions-client.jar |
需要調用Acrobat Reader DC擴展服務。 |
<>install directory>/sdk/client-libs/common |
adobe-repository-client.jar commons-codec-1.3.jar |
調用儲存庫服務所需。 |
<>install directory>/sdk/client-libs/common <>install directory>/sdk/client-libs\thirdparty |
|
調用Rights Management服務時必需。 如果AEM Forms部署在JBoss上,請包括所有這些檔案。 |
<>install directory>/sdk/client-libs/common JBoss專用的lib目錄 |
adobe-signatures-client.jar |
需要叫用簽名服務。 |
<>install directory>/sdk/client-libs/common |
adobe-taskmanager-client-sdk.jar |
調用Task Manager服務時必需。 |
<>install directory>/sdk/client-libs/common |
adobe-truststore-client.jar |
需要叫用信任商店服務。 |
<>install directory>/sdk/client-libs/common |
下表列出了取決於連接模式的JAR檔案以及部署了AEM Forms的J2EE應用程式伺服器。
檔案 |
說明 |
位置 |
---|---|---|
|
如果使用SOAP模式調用AEM Forms,請包括這些JAR檔案。 |
<>install directory>/sdk/client-libs/協力廠商 |
jboss-client.jar |
如果AEM Forms部署在JBoss Application Server上,請包含此JAR檔案。 如果jboss-client.jar和引用的jar未共同定位,則classloader將找不到所需的類。 |
JBoss客戶端lib目錄 如果您將用戶端應用程式部署在相同的J2EE應用程式伺服器上,就不需要包含此檔案。 |
wlclient.jar |
如果AEM Forms部署在BEA WebLogic Server®上,則包含此JAR檔案。 |
WebLogic專用的lib目錄 如果您將用戶端應用程式部署在相同的J2EE應用程式伺服器上,就不需要包含此檔案。 |
|
|
WebSphere專用的lib目錄([WAS_HOME]/runtimes) 如果您將用戶端應用程式部署在相同的J2EE應用程式伺服器上,就不必包含這些檔案。 |
下表指定調用方案並列出成功調用AEM Forms所需的JAR檔案。
服務 |
調用模式 |
J2EE應用程式伺服器 |
所需的JAR檔案 |
---|---|---|---|
Forms服務 |
EJB |
JBoss |
|
Forms服務 Acrobat Reader DC擴展服務 簽名服務 |
EJB |
JBoss |
|
Forms服務 |
SOAP |
WebLogic |
|
Forms服務 Acrobat Reader DC擴展服務 簽名服務 |
SOAP |
WebLogic |
|
如果您要從LiveCycle升級至AEM Forms,建議您將AEM FormsJAR檔案加入Java專案的類別路徑中。 例如,如果您使用Rights Management服務等服務,如果類路徑中未包含AEM FormsJAR檔案,則會遇到相容性問題。
假設您要升級至AEM Forms。 要使用調用Rights Management服務的Java應用程式,請包括以下JAR檔案的AEM Forms版本:
另請參閱
使用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,請指定下列值之一:
https://<ServerName>:8080 (default port)
iiop://<ServerName>:2809 (default port)
t3://<ServerName>:7001 (default port)
DSC_DEFAULT_SOAP_ENDPOINT:如果您使用SOAP連接模式,此值表示發送調用請求的端點。若要遠端叫用AEM Forms,請指定部署AEM Forms的J2EE應用程式伺服器名稱。 如果您的客戶端應用程式位於同一J2EE應用程式伺服器上,則可以指定localhost
(例如http://localhost:8080
)。
8080
適用。 如果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
屬性設為符合您需求的值。您可以使用ServiceClientFactoryProperties
類別的靜態成員,而不是使用字串來設定DSC_SERVER_TYPE
連接屬性。 可使用下列值: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
枚舉值如果您使用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
枚舉值如果您使用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上並使用EJB連接模式的AEM Forms。
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上並使用EJB連接模式的AEM Forms。
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");
如果選擇SOAP連接模式,請確保在客戶端應用程式的類路徑中包含其他JAR檔案。
禁用服務安全性時設定連接屬性
以下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");
所有與「使用AEM Forms進行寫程式」關聯的Java快速入門都顯示EJB和SOAP連接設定。
使用自訂請求逾時限制設定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
使用Context對象調用AEM Forms
您可以使用com.adobe.idp.Context
物件來與已驗證的使用者呼叫AEM Forms服務(com.adobe.idp.Context
物件代表已驗證的使用者)。 使用com.adobe.idp.Context
物件時,您不需要設定DSC_CREDENTIAL_USERNAME
或DSC_CREDENTIAL_PASSWORD
屬性。 使用AuthenticationManagerServiceClient
物件的authenticate
方法,在驗證使用者時,可取得com.adobe.idp.Context
物件。
authenticate
方法返回包含驗證結果的AuthResult
對象。 通過調用com.adobe.idp.Context
對象的建構子,可以建立對象。 然後呼叫com.adobe.idp.Context
物件的initPrincipal
方法並傳遞AuthResult
物件,如下列程式碼所示:
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
您可以叫用ServiceClientFactory
物件的setContext
方法並傳遞com.adobe.idp.Context
物件,而不是設定DSC_CREDENTIAL_USERNAME
或DSC_CREDENTIAL_PASSWORD
屬性。 使用表AEM單用戶調用服務時,請確保其具有調用AEM Forms服務所需的Services User
角色。
以下代碼示例說明如何在用於建立EncryptionServiceClient
對象的連接設定中使用com.adobe.idp.Context
對象。
//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);
有關驗證用戶的完整詳細資訊,請參閱驗證用戶。
本節將討論以下調用的情形:
下圖顯示了在自己的JVM中運行並調用獨立的AEM Forms實例的客戶端應用程式。
在此案例中,用戶端應用程式在其JVM中執行,並叫用AEM Forms服務。
此方案是所有快速啟動都基於的調用方案。
下圖顯示了在自己的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
請洽詢您的管理員以判斷J2EE應用程式伺服器名稱和埠號。
另請參閱
AEM Forms服務營運通常會使用或產生PDF檔案。 當您叫用服務時,有時需要將PDF檔案(或其他檔案類型,例如XML資料)傳遞至服務。 同樣地,有時也需要處理從服務傳回的PDF檔案。 使您能夠將資料傳入和傳出AEM Forms服務的Java類為com.adobe.idp.Document
。
AEM Forms服務不接受PDF檔案做為其他資料類型,例如java.io.InputStream
物件或位元組陣列。 com.adobe.idp.Document
物件也可用來將其他類型的資料(例如XML資料)傳遞至服務。
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
物件時WebLogic中的記憶體洩漏,請以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();
另請參閱
在叫用需要PDF文檔(或其他文檔類型)作為輸入值的服務操作之前,建立com.adobe.idp.Document
對象。 com.adobe.idp.Document
類提供了建構子,使您能夠從以下內容類型建立文檔:
com.adobe.idp.Document
物件java.io.File
物件java.io.InputStream
物件java.net.URL
物件下面的代碼示例建立基於位元組陣列的com.adobe.idp.Document
對象。
建立基於位元組陣列的Document對象
Document myPDFDocument = new Document(myByteArray);
下面的代碼示例建立基於另一個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);
以下代碼示例建立基於名為map.pdf的PDF檔案的com.adobe.idp.Document
對象。 此檔案位於C硬碟的根目錄中。 此建構子嘗試使用檔案副檔名設定com.adobe.idp.Document
對象的MIME內容類型。
接受java.io.File
物件的com.adobe.idp.Document
建構函式也接受布林參數。 通過將此參數設定為true
, com.adobe.idp.Document
對象將刪除檔案。 此動作表示您不必在將檔案傳遞至com.adobe.idp.Document
建構函式後移除檔案。
將此參數設為false
表示您保有此檔案的所有權。 將此參數設為true
會更有效率。 原因是com.adobe.idp.Document
對象可以將檔案直接移動到本地管理區,而不是複製檔案(速度較慢)。
建立以PDF檔案為基礎的Document物件
//Create a Document object based on the map.pdf source file
File mySourceMap = new File("C:\\map.pdf");
Document myPDFDocument = new Document(mySourceMap,true);
以下Java代碼示例建立基於java.io.InputStream
對象的com.adobe.idp.Document
對象。
基於InputStream對象建立文檔
//Create a Document object based on an InputStream object
InputStream is = new FileInputStream("C:\\Map.pdf");
Document myPDFDocument = new Document(is);
以下Java代碼示例建立基於名為map.pdf的PDF檔案的com.adobe.idp.Document
對象。 此檔案位於名為WebApp
的Web應用程式中,該Web應用程式運行在localhost
上。 此建構函式會嘗試使用URL通訊協定傳回的內容類型來設定com.adobe.idp.Document
物件的MIME內容類型。
提供給com.adobe.idp.Document
對象的URL始終在建立原始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);
另請參閱
將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);
另請參閱
調用com.adobe.idp.Document
物件的getContentType
方法,以判斷com.adobe.idp.Document
物件的MIME類型。 此方法返回一個字串值,該字串值指定com.adobe.idp.Document
對象的內容類型。 下表說明AEM Forms傳回的不同內容類型。
MIME類型 |
說明 |
---|---|
|
PDF檔案 |
|
XML資料封裝(XDP),用於匯出XMLForms架構(XFA)表單 |
|
書籤、附件或其他XML檔案 |
|
Forms資料格式(FDF),用於匯出Acrobat表格 |
|
XMLForms資料格式(XFDF),用於匯出Acrobat表單 |
|
多樣化資料格式與XML |
|
通用資料格式 |
|
未指定的MIME類型 |
以下代碼示例確定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);
另請參閱
當您不再需要Document
物件時,建議您叫用dispose
方法來處理它。 每個Document
物件會在應用程式的主機平台上使用檔案描述子和高達75 MB的RAM空間。 如果Document
物件未放置,則Java Garage收集程式會放置它。 但是,通過使用dispose
方法,可以更快地處理它,從而釋放Document
對象佔用的記憶體。
另請參閱
AEM Forms服務作業可使用服務的強式型別API來呼叫,此API稱為Java用戶端程式庫。 Java客戶端庫是一組具體類,它提供對服務容器中部署的服務的訪問。 使用調用API實例化表示要調用的服務的Java對象,而不是建立InvocationRequest
對象。 調用API用於調用在Workbench中建立的進程,如長壽命進程。 (請參閱叫用以人為中心的長壽命進程。)
要執行服務操作,請調用屬於Java對象的方法。 Java客戶端庫包含通常以服務操作一對一映射的方法。 使用Java客戶端庫時,請設定所需的連接屬性。 (請參閱設定連接屬性。)
在設定連接屬性後,建立ServiceClientFactory
對象,該對象用於實例化Java對象以便調用服務。 每個具有Java客戶端庫的服務都有相應的客戶端對象。 例如,要調用儲存庫服務,請使用其建構子建立ResourceRepositoryClient
對象並傳遞ServiceClientFactory
對象。 ServiceClientFactory
對象負責維護調用AEM Forms服務所需的連接設定。
雖然獲取ServiceClientFactory
通常很快,但首次使用工廠時會涉及一些開銷。 此對象經過優化以便重複使用,因此,在建立多個Java客戶端對象時,請盡可能使用相同的ServiceClientFactory
對象。 也就是說,請勿為您所建立的每個用戶端程式庫物件建立個別的ServiceClientFactory
物件。
「使用者管理員」設定可控制com.adobe.idp.Context
物件內影響ServiceClientFactory
物件的SAML斷言的存留期。 此設定控制整個AEM Forms的所有驗證上下文期限,包括使用Java API執行的所有調用。 預設情況下,ServiceCleintFactory
對象可使用的時段為2小時。
要說明如何使用Java API調用服務,將調用儲存庫服務的writeResource
操作。 此操作將新資源放入儲存庫。
通過使用Java客戶端庫並執行以下步驟,可以調用儲存庫服務:
在Java專案的類別路徑中包含用戶端JAR檔案,例如adobe-repository-client.jar。 有關這些檔案位置的資訊,請參見包括AEM FormsJava庫檔案。
設定調用服務所需的連接屬性。
調用ServiceClientFactory
對象的靜態createInstance
方法並傳遞包含連接屬性的java.util.Properties
對象,以建立ServiceClientFactory
對象。
使用其建構子並傳遞ServiceClientFactory
對象,建立ResourceRepositoryClient
對象。 使用ResourceRepositoryClient
對象調用儲存庫服務操作。
使用其建構子建立RepositoryInfomodelFactoryBean
對象並傳遞null
。 此對象允許您建立Resource
對象,該對象代表添加到儲存庫的內容。
調用RepositoryInfomodelFactoryBean
對象的newImage
方法並傳遞以下值,以建立Resource
對象:
new Id()
以獲得唯一ID值。new Lid()
的唯一UUID值。將返回值轉換為Resource
。
調用RepositoryInfomodelFactoryBean
物件的newImage
方法並將傳回值傳至ResourceContent
,以建立ResourceContent
物件。 此對象表示添加到儲存庫的內容。
通過傳遞java.io.FileInputStream
對象來建立com.adobe.idp.Document
對象,該對象儲存要添加到儲存庫的XDP檔案。 (請參閱根據InputStream對象建立文檔。)
調用ResourceContent
物件的setDataDocument
方法,將com.adobe.idp.Document
物件的內容新增至ResourceContent
物件。 傳遞com.adobe.idp.Document
物件。
調用ResourceContent
對象的setMimeType
方法並傳遞application/vnd.adobe.xdp+xml
,將XDP檔案的MIME類型設定為添加到儲存庫。
通過調用Resource
對象「s setContent
」方法並傳遞ResourceContent
對象,將ResourceContent
對象的內容添加到Resource
對象。
通過調用Resource
對象「s setDescription
」方法並傳遞表示資源說明的字串值來添加資源說明。
調用ResourceRepositoryClient
物件的writeResource
方法並傳遞下列值,將表單設計新增至儲存庫:
Resource
對象另請參閱
您可以使用Java調用API調用短時間進程。 使用調用API調用短時間進程時,可使用java.util.HashMap
對象傳遞所需參數值。 對於要傳遞至服務的每個參數,請調用java.util.HashMap
物件的put
方法,並指定服務所需的名稱——值對,以執行指定的操作。 指定屬於短期進程的參數的確切名稱。
有關調用長壽命進程的資訊,請參見調用以人為中心的長壽命進程。
這裡討論的是使用調用API調用以下名為MyApplication/EncryptDocument
的AEM Forms短期進程。
此程式不基於現有的AEM Forms程式。 要跟隨代碼示例,請使用Workbench建立名為MyApplication/EncryptDocument
的流程。 (請參閱使用Workbench。)
調用此進程時,它執行以下操作:
SetValue
操作。 此進程的輸入參數是名為inDoc
的document
進程變數。PasswordEncryptPDF
操作。 密碼加密的PDF檔案會在名為outDoc
的流程變數中傳回。使用Java調用API調用MyApplication/EncryptDocument
短期進程:
在您Java專案的類別路徑中包含用戶端JAR檔案,例如adobe-livecycle-client.jar。 (請參閱包含AEM FormsJava庫檔案。)
建立包含連接屬性的ServiceClientFactory
對象。 (請參閱設定連接屬性。)
使用其建構子並傳遞ServiceClientFactory
對象,建立ServiceClient
對象。 ServiceClient
物件可讓您叫用服務作業。 它可處理如定位、調度和路由調用請求等任務。
使用其建構子建立java.util.HashMap
對象。
請針對每個輸入參數叫用java.util.HashMap
物件的put
方法,以傳遞至長壽命的程式。 由於MyApplication/EncryptDocument
短期進程需要一個類型Document
的輸入參數,因此只需調用put
方法一次,如以下示例所示。
//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);
調用ServiceClientFactory
對象的createInvocationRequest
方法並傳遞以下值,以建立InvocationRequest
對象:
MyApplication/EncryptDocument
進程,請指定MyApplication/EncryptDocument
。invoke
。java.util.HashMap
物件,其中包含服務作業所需的參數值。true
的布林值,可建立同步請求(此值適用於叫用短時程)。調用ServiceClient
物件的invoke
方法並傳遞InvocationRequest
物件,將呼叫請求傳送至服務。 invoke
方法返回InvocationReponse
對象。
通過將值false
作為createInvocationRequest
方法的第四個參數來調用長壽命進程。 傳遞值false
會建立非同步請求。
叫用InvocationReponse
物件的getOutputParameter
方法並傳遞指定輸出參數名稱的字串值,以擷取程式的傳回值。 在這種情況下,請指定outDoc
(outDoc
是MyApplication/EncryptDocument
進程的輸出參數的名稱)。 將返回值轉換為Document
,如下例所示。
InvocationResponse response = myServiceClient.invoke(request);
Document encryptDoc = (Document) response.getOutputParameter("outDoc");
建立java.io.File
物件,並確定副檔名為。pdf。
調用com.adobe.idp.Document
物件的copyToFile
方法,將com.adobe.idp.Document
物件的內容複製至檔案。 請確定您使用getOutputParameter
方法傳回的com.adobe.idp.Document
物件。
另請參閱