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。 例如,要调用加密服务,请使用加密服务客户端库。 要执行加密服务操作,请调用属于加密服务客户端对象的方法。 可以通过调用EncryptionServiceClient
对象的encryptPDFUsingPassword
方法,使用口令加密PDF文档。
Java API支持以下功能:
Adobe Developer网站
Adobe开发人员网站包含以下文章,讨论使用Java API调用AEM Forms服务:
从Java调用AEM Forms Distiller API
另请参阅
创建一个Java Web应用程序,它调用以人为中心的长寿命进程
要通过使用Java API以编程方式调用AEM Forms服务,请在Java项目的类路径中包含所需的库文件(JAR文件)。 包含在客户端应用程序的类路径中的JAR文件取决于以下几个因素:
(仅限Turnkey)使用命令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 |
调用Application Manager服务时必需。 |
<>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 |
调用barcoded forms服务时需要。 |
<>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 |
调用任务管理器服务时必需。 |
<>install directory>/sdk/client-libs/common |
adobe-truststore-client.jar |
调用信任存储服务时需要。 |
<>install directory>/sdk/client-libs/common |
下表列表了依赖于连接模式和部署了AEM Forms的J2EE应用程序服务器的JAR文件。
文件 |
描述 |
位置 |
---|---|---|
|
如果使用SOAP模式调用AEM Forms,请包括这些JAR文件。 |
<>install directory>/sdk/client-libs/thirdparty |
jboss-client.jar |
如果AEM Forms部署在JBoss Application Server上,请包含此JAR文件。 如果jboss-client.jar和引用的jar不在同一位置,则classloader将找不到所需的类。 |
JBoss客户端库目录 如果在同一J2EE应用程序服务器上部署客户端应用程序,则无需包含此文件。 |
wlclient.jar |
如果AEM Forms部署在BEA WebLogic Server®上,则包含此JAR文件。 |
特定于WebLogic的lib目录 如果在同一J2EE应用程序服务器上部署客户端应用程序,则无需包含此文件。 |
|
|
特定于WebSphere的lib目录([WAS_HOME]/运行时) 如果在同一J2EE应用程序服务器上部署客户端应用程序,则不必包括这些文件。 |
下表指定调用所需的JAR文件以成功调用AEM Forms的方案和列表。
服务 |
调用模式 |
J2EE应用程序服务器 |
所需的JAR文件 |
---|---|---|---|
Forms服务 |
EJB |
JBoss |
|
Forms服务 Acrobat Reader DC extensions service 签名服务 |
EJB |
JBoss |
|
Forms服务 |
SOAP |
WebLogic |
|
Forms服务 Acrobat Reader DC extensions service 签名服务 |
SOAP |
WebLogic |
|
如果从LiveCycle升级到AEM Forms,建议将AEM Forms JAR文件包含在Java项目的类路径中。 例如,如果您使用的是Rights Management服务等服务,则在类路径中不包含AEM Forms JAR文件时,将会遇到兼容性问题。
假设您要升级到AEM Forms。 要使用调用Rights Management服务的AEM Forms应用程序,请包括以下JAR文件的Java版本:
另请参阅
使用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上部署的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");
如果选择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服务传递数据的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 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文件的文档对象
//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代码示例创建一个com.adobe.idp.Document
对象,该对象基于名为map.pdf的PDF文件。 此文件位于localhost
上运行的名为WebApp
的Web应用程序中。 此构造函数尝试使用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),用于导出的XML Forms体系架构(XFA)表单 |
|
书签、附件或其他XML文档 |
|
Forms数据格式(FDF),用于导出Acrobat表单 |
|
XML Forms数据格式(XFDF),用于导出的Acrobat表单 |
|
丰富数据格式和XML |
|
通用数据格式 |
|
未指定MIME类型 |
下面的代码示例确定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);
另请参阅
当不再需要Document
对象时,建议通过调用其dispose
方法来处理该对象。 每个Document
对象都使用一个文件描述符,并在应用程序的主机平台上占用多达75 MB的RAM空间。 如果Document
对象未处置,则Java Garage收集过程将处理它。 但是,通过使用dispose
方法更快地处理它,您可以释放由Document
对象占用的内存。
另请参阅
AEM Forms服务操作可通过使用服务的强类型API(称为Java客户端库)来调用。 Java客户端库是一组具体类,提供对在服务容器中部署的服务的访问。 使用调用API实例化表示要调用的服务的Java对象,而不是创建InvocationRequest
对象。 调用API用于调用在Workbench中创建的进程等长寿命进程。 (请参阅调用以人为中心的长寿命进程。)
要执行服务操作,请调用属于Java对象的方法。 Java客户端库包含通常将服务操作一对一映射的方法。 使用Java客户端库时,设置所需的连接属性。 (请参阅设置连接属性。)
设置连接属性后,创建一个ServiceClientFactory
对象,用于实例化允许调用服务的Java对象。 具有Java客户端库的每个服务都具有相应的客户端对象。 例如,要调用Repository服务,请使用ResourceRepositoryClient
对象的构造函数创建一个ServiceClientFactory
对象。 ServiceClientFactory
对象负责维护调用AEM Forms服务所需的连接设置。
虽然获取ServiceClientFactory
通常很快,但首次使用工厂时会涉及一些开销。 此对象经过优化以便重复使用,因此,在创建多个Java客户端对象时,尽可能使用相同的ServiceClientFactory
对象。 也就是说,不要为您创建的每个客户端库对象创建单独的ServiceClientFactory
对象。
“用户管理器”设置用于控制影响ServiceClientFactory
对象的com.adobe.idp.Context
对象内的SAML断言的存留期。 此设置控制整个AEM Forms中的所有身份验证上下文生命周期,包括使用Java API执行的所有调用。 默认情况下,可使用ServiceCleintFactory
对象的时间段为两小时。
要说明如何使用Java API调用服务,将调用存储库服务的writeResource
操作。 此操作会将新资源放入存储库中。
您可以通过使用Java客户端库并执行以下步骤来调用存储库服务:
在Java项目的类路径中包含客户端JAR文件,如adobe-repository-client.jar。 有关这些文件位置的信息,请参阅包括AEM Forms Java库文件。
设置调用服务所需的连接属性。
通过调用ServiceClientFactory
对象的静态createInstance
方法并传递包含连接属性的java.util.Properties
对象,创建ServiceClientFactory
对象。
使用ResourceRepositoryClient
对象的构造函数并传递ServiceClientFactory
对象,创建对象。 使用ResourceRepositoryClient
对象调用存储库服务操作。
使用其构造函数创建RepositoryInfomodelFactoryBean
对象,并传递null
。 通过此对象,可创建一个Resource
对象,它表示已添加到存储库的内容。
通过调用RepositoryInfomodelFactoryBean
对象的newImage
方法并传递以下值,创建Resource
对象:
new Id()
的唯一ID值。new Lid()
的唯一UUID值。将返回值转换为Resource
。
通过调用RepositoryInfomodelFactoryBean
对象的newImage
方法并将返回值转换为ResourceContent
,创建ResourceContent
对象。 此对象表示添加到存储库的内容。
通过传递存储要添加到存储库的XDP文件的java.io.FileInputStream
对象,创建com.adobe.idp.Document
对象。 (请参阅创建基于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
操作。 在名为outDoc
的进程变量中返回密码加密的PDF文档。使用Java调用API调用MyApplication/EncryptDocument
短时进程:
在Java项目的类路径中包含客户端JAR文件,如adobe-livecycle-client.jar。 (请参阅包括AEM Forms Java库文件。)
创建包含连接属性的ServiceClientFactory
对象。 (请参阅设置连接属性。)
使用ServiceClient
对象的构造函数并传递ServiceClientFactory
对象,创建对象。 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
对象。
另请参阅