使用Java API调用AEM Forms invoking-aem-forms-using-the-javaapi
本文档中的示例和示例仅适用于JEE环境上的AEM Forms。
可以使用AEM Forms Java API调用AEM Forms。 使用AEM Forms Java API时,您可以使用调用API或Java客户端库。 Java客户端库可用于Rights Management服务等服务。 这些强类型的API允许您开发调用AEM Forms的Java应用程序。
调用API是com.adobe.idp.dsc
包中的类。 使用这些类,您可以直接向服务发送调用请求,并处理返回的调用响应。 使用调用API可调用使用Workbench创建的短期或长期进程。
以编程方式调用服务的推荐方法是使用与服务相对应的Java客户端库,而不是调用API。 例如,要调用加密服务,请使用加密服务客户端库。 要执行Encryption服务操作,请调用属于Encryption服务客户端对象的方法。 您可以通过调用EncryptionServiceClient
对象的encryptPDFUsingPassword
方法,使用密码加密PDF文档。
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
启动AEM Forms服务器以指定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
下表列出了与连接模式以及部署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-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应用程序服务器上,请包含此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文件。
-
(Web服务调用需要com.ibm.ws.webservices.thinclient_6.1.0.jar)。
特定于WebSphere的lib目录([WAS_HOME]/runtime)
如果将客户端应用程序部署在同一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
。)- 如果J2EE应用程序是JBoss,则端口值
8080
适用。 如果J2EE应用程序服务器是IBM® WebSphere®,请使用端口9080
。 同样,如果J2EE应用程序服务器是WebLogic,请使用端口7001
。 (这些值是默认端口值。 如果更改端口值,请使用适用的端口号。)
- 如果J2EE应用程序是JBoss,则端口值
-
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 您可以使用 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
枚举值- 一个字符串值,它指定承载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应用程序服务器上的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
属性。 在使用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);
调用方案 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
以下示例显示了jndi.properties文件的内容,该文件用于连接到WebSphere上部署的AEM Forms。
java.naming.factory.initial=com.ibm.websphere.naming.
WsnInitialContextFactory
java.naming.provider.url=corbaloc::appserver1:9810,:appserver2:9810
WebLogic
以下示例显示用于连接到部署在 WebLogic 上的 AEM 表单的 jndi.properties 文件的内容。
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://appserver1:8001, appserver2:8001
JBoss
以下示例显示了用于连接到部署在 JBoss 上的 AEM 表单的 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
对象或字节数组。 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();
另请参阅
创建文档 creating-documents
在调用需要PDF文档(或其他文档类型)作为输入值的服务操作之前创建com.adobe.idp.Document
对象。 com.adobe.idp.Document
类提供了构造函数,使您能够从以下内容类型创建文档:
- 字节数组
- 现有
com.adobe.idp.Document
对象 java.io.File
对象java.io.InputStream
对象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
以下代码示例创建了一个基于名为 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);
基于InputStream对象创建文档 creating-a-document-based-on-an-inputstream-object
以下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);
根据可从URL访问的内容创建文档 creating-a-document-based-on-content-accessible-from-an-url
以下Java代码示例创建了一个基于名为 map.pdf 的PDF文件的com.adobe.idp.Document
对象。 此文件位于在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);
另请参阅
处理返回的文档 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
通过调用com.adobe.idp.Document
对象的getContentType
方法确定com.adobe.idp.Document
对象的MIME类型。 此方法返回指定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车库收集进程会将其释放。 但是,通过使用dispose
方法更快地处理它,您可以释放Document
对象占用的内存。
另请参阅
使用Java客户端库调用服务 invoking-a-service-using-a-java-client-library
AEM Forms服务操作可以通过使用服务的强类型API(称为Java客户端库)调用。 Java客户端库 是一组具体类,它们提供对服务容器中部署的服务进行访问的权限。 您实例化表示要调用的服务的Java对象,而不是使用调用API创建InvocationRequest
对象。 调用API用于调用进程,例如在Workbench中创建的长期进程。 (请参阅调用以人为中心的长期进程。)
要执行服务操作,请调用属于Java对象的方法。 Java客户端库包含的方法通常使用服务操作进行一对一映射。 使用Java客户端库时,设置所需的连接属性。 (请参阅设置连接属性。)
设置连接属性后,创建一个ServiceClientFactory
对象,该对象用于实例化允许您调用服务的Java对象。 每个具有Java客户端库的服务都有一个相应的客户端对象。 例如,要调用存储库服务,请使用它的构造函数创建一个ResourceRepositoryClient
对象,然后传递ServiceClientFactory
对象。 ServiceClientFactory
对象负责维护调用AEM Forms服务所需的连接设置。
尽管获取ServiceClientFactory
通常很快,但在首次使用工厂时会产生一些额外开销。 此对象已针对重用进行了优化,因此,在可能的情况下,在创建多个Java客户端对象时使用相同的ServiceClientFactory
对象。 即,不要为您创建的每个客户端库对象创建单独的ServiceClientFactory
对象。
有一个用户管理器设置可控制影响ServiceClientFactory
对象的com.adobe.idp.Context
对象内的SAML断言的生命周期。 此设置控制整个AEM Forms中的所有身份验证上下文生命周期,包括使用Java API执行的所有调用。 默认情况下,可以使用ServiceCleintFactory
对象的时间段为两个小时。
writeResource
操作。 此操作会将新资源放入存储库中。通过使用 Java 客户机库并执行以下步骤,可以调用存储库服务:
-
在 Java 项目的类路径中包含客户机 JAR 文件,如adobe-repository-client.jar。 有关这些文件的位置的信息,请参阅 包括AEM Forms Java库文件。
-
设置调用服务所需的连接属性。
-
通过调用
ServiceClientFactory
对象的静态createInstance
方法并传递包含连接属性的java.util.Properties
对象来创建ServiceClientFactory
对象。 -
使用对象的构造函数创建
ResourceRepositoryClient
对象并传递ServiceClientFactory
对象。ResourceRepositoryClient
使用该对象调用存储库服务操作。 -
RepositoryInfomodelFactoryBean
使用对象的构造函数创建对象并传递null
.此对象允许您创建一个Resource
对象,该对象表示添加到存储库的内容。 -
Resource
通过调用RepositoryInfomodelFactoryBean
对象的方法newImage
并传递以下值来创建对象:- 通过指定
new Id()
的唯一 ID 值。 - 通过指定
new Lid()
获得唯一的UUID值。 - 资源的名称。 您可以指定XDP文件的文件名。
将返回值强制转换为
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
对象的setContent
方法并传递ResourceContent
对象,将ResourceContent
对象的内容添加到Resource
对象。 -
通过调用
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来调用以下名为MyApplication/EncryptDocument
的AEM Forms短期进程。
MyApplication/EncryptDocument
的进程。 (请参阅使用Workbench。)调用此进程时,将执行以下操作:
- 获取传递到进程的不安全PDF文档。 此操作基于
SetValue
操作。 此进程的输入参数是名为inDoc
的document
进程变量。 - 使用密码加密PDF文档。 此操作基于
PasswordEncryptPDF
操作。 密码加密的PDF文档在名为outDoc
的进程变量中返回。
使用Java调用API调用MyApplication/EncryptDocument短暂进程 invoke-the-myapplication-encryptdocument-short-lived-process-using-the-java-invocation-api
使用Java调用API调用MyApplication/EncryptDocument
短期进程:
-
将客户端JAR文件(如adobe-livecycle-client.jar)包含在Java项目的类路径中。 (请参阅包括AEM Forms Java库文件。)
-
创建包含连接属性的
ServiceClientFactory
对象。 (请参阅设置连接属性。) -
使用对象的构造函数创建
ServiceClient
对象并传递ServiceClientFactory
对象。ServiceClient
对象允许您调用服务操作。 它处理诸如定位、分派和路由调用请求等任务。 -
使用构造函数创建
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);
-
通过调用
ServiceClientFactory
对象的createInvocationRequest
方法并传递以下值来创建InvocationRequest
对象:- 一个字符串值,它指定要调用的长生命周期进程的名称。 要调用
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-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
对象的内容复制到文件中。 确保使用getOutputParameter
方法返回的com.adobe.idp.Document
对象。
另请参阅