使用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服务客户端对象的方法。 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
下表列出了与连接模式以及部署AEM Forms的J2EE应用程序服务器相关的JAR文件。
</thead align="left">
-
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的库目录([WAS_HOME]/runtimes)
如果将客户端应用程序部署在同一J2EE应用程序服务器上,则不必包含这些文件。
调用方案 invoking-scenarios
下表指定了调用方案,并列出了成功调用AEM Forms所需的JAR文件。
</thead align="left"> xmp-uti
-
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_SERVER_TYPE:指定部署AEM Forms的J2EE应用程序服务器。 有效值为
JBoss
,WebSphere
,WebLogic
.- 如果将此连接属性设置为
WebSphere
,java.naming.factory.initial
值设置为com.ibm.ws.naming.util.WsnInitCtxFactory
. - 如果将此连接属性设置为
WebLogic
,java.naming.factory.initial
值设置为weblogic.jndi.WLInitialContextFactory
. - 同样,如果将此连接属性设置为
JBoss
,java.naming.factory.initial
值设置为org.jnp.interfaces.NamingContextFactory
. - 您可以设置
java.naming.factory.initial
属性到的值,如果您不想使用默认值,则该值会符合您的要求。
note note NOTE 不要使用字符串来设置 DSC_SERVER_TYPE
connection属性中,可以使用静态成员ServiceClientFactoryProperties
类。 可以使用以下值:ServiceClientFactoryProperties.DSC_WEBSPHERE_SERVER_TYPE
,ServiceClientFactoryProperties.DSC_WEBLOGIC_SERVER_TYPE
,或ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE
. - 如果将此连接属性设置为
-
DSC_CREDENTIAL_USERNAME: 指定AEM表单用户名。 用户要成功调用AEM Forms服务,需要服务用户角色。 用户还可以具有另一个包含“服务调用”权限的角色。 否则,当他们尝试调用服务时会引发异常。 如果禁用了服务安全性,则不必指定此连接属性。
-
DSC_CREDENTIAL_PASSWORD: 指定相应的密码值。 如果禁用了服务安全性,则不必指定此连接属性。
-
DSC_REQUEST_TIMEOUT: soap请求的默认请求超时限制为1200000毫秒(20分钟)。 有时,请求可能需要较长时间才能完成操作。 例如,检索大量记录的SOAP请求可能需要较长的超时限制。 您可以使用
ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT
增加SOAP请求的请求调用超时限制。注意:只有基于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
属性。 您可以获取 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
以下示例显示了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 服务
使用 Java API 将数据传递到 AEM Forms 服务 passing-data-to-aem-forms-services-using-the-java-api
AEM Forms服务操作通常使用或生成PDF文档。 调用服务时,有时需要将PDF文档(或其他文档类型,如XML数据)传递给服务。 同样,有时也必需处理从服务返回的PDF文档。 允许您向/从AEM Forms服务传递数据的Java类是 com.adobe.idp.Document
.
AEM Forms服务不接受PDF文档作为其他数据类型,例如 java.io.InputStream
对象或字节数组。 A com.adobe.idp.Document
对象还可用于向服务传递其他类型的数据,如XML数据。
A com.adobe.idp.Document
对象是Java可序列化的类型,因此可以通过RMI调用传递它。 接收端可以并置(同一主机、同一类加载器)、本地(同一主机、不同类加载器)或远程(不同主机)。 针对每种情况都优化了文档内容的传递。 例如,如果发送者和接收者位于同一台主机上,则内容将通过本地文件系统传递。 (在某些情况下,可以在内存中传递文档。)
根据 com.adobe.idp.Document
对象大小,数据将传送在 com.adobe.idp.Document
对象或存储在服务器的文件系统中。 占用的任何临时存储资源 com.adobe.idp.Document
对象将在 com.adobe.idp.Document
处置。 (请参阅 处置文档对象.)
有时,必须了解的内容类型 com.adobe.idp.Document
对象,然后才能将其传递到服务。 例如,如果操作需要特定的内容类型,例如 application/pdf
,建议您确定内容类型。 (请参阅 确定文档的内容类型.)
此 com.adobe.idp.Document
对象尝试使用提供的数据确定内容类型。 如果无法从提供的数据中检索内容类型(例如,当提供数据作为字节数组时),请设置内容类型。 要设置内容类型,请调用 com.adobe.idp.Document
对象的 setContentType
方法。 (请参阅 确定文档的内容类型)
如果辅助文件驻留在同一文件系统上,则创建 com.adobe.idp.Document
对象更快。 如果辅助文件驻留在远程文件系统上,则必须执行拷贝操作,这会影响性能。
应用程序可以包含两者 com.adobe.idp.Document
和 org.w3c.dom.Document
数据类型。 但是,请确保您完全符合 org.w3c.dom.Document
数据类型。 有关转换的信息 org.w3c.dom.Document
对象到 com.adobe.idp.Document
对象,请参见 快速入门(EJB模式):使用Java API在可流式布局中预填充Forms.
com.adobe.idp.Document
对象中,读取文档信息(以2048字节或更少的块为单位)。 例如,以下代码以2048字节的块读取文档信息: // Set up the chunk size to prevent a potential memory leak
int buffSize = 2048;
// Determine the total number of bytes to read
int docLength = (int) inDoc.length();
byte [] byteDoc = new byte[docLength];
// Set up the reading position
int pos = 0;
// Loop through the document information, 2048 bytes at a time
while (docLength > 0) {
// Read the next chunk of information
int toRead = Math.min(buffSize, docLength);
int bytesRead = inDoc.read(pos, byteDoc, pos, toRead);
// Handle the exception in case data retrieval failed
if (bytesRead == -1) {
inDoc.doneReading();
inDoc.dispose();
throw new RuntimeException("Data retrieval failed!");
}
// Update the reading position and number of bytes remaining
pos += bytesRead;
docLength -= bytesRead;
}
// The document information has been successfully read
inDoc.doneReading();
inDoc.dispose();
另请参阅
创建文档 creating-documents
创建 com.adobe.idp.Document
调用需要PDF文档(或其他文档类型)作为输入值的服务操作之前的对象。 此 com.adobe.idp.Document
类提供了构造函数,使您能够从以下内容类型创建文档:
- 字节数组
- 现有
com.adobe.idp.Document
对象 - A
java.io.File
对象 - A
java.io.InputStream
对象 - A
java.net.URL
对象
基于字节数组创建文档 creating-a-document-based-on-a-byte-array
以下代码示例创建 com.adobe.idp.Document
基于字节数组的对象。
创建基于字节数组的文档对象
Document myPDFDocument = new Document(myByteArray);
基于另一文档创建文档 creating-a-document-based-on-another-document
以下代码示例创建 com.adobe.idp.Document
基于其他对象的对象 com.adobe.idp.Document
对象。
创建基于另一文档的文档对象
//Create a Document object based on a byte array
InputStream is = new FileInputStream("C:\\Map.pdf");
int len = is.available();
byte [] myByteArray = new byte[len];
int i = 0;
while (i < len) {
i += is.read(myByteArray, i, len);
}
Document myPDFDocument = new Document(myByteArray);
//Create another Document object
Document anotherDocument = new Document(myPDFDocument);
基于文件创建文档 creating-a-document-based-on-a-file
以下代码示例创建 com.adobe.idp.Document
基于名为PDF文件的对象 map.pdf. 该文件位于C硬盘的根目录下。 此构造函数尝试将 com.adobe.idp.Document
对象名。
此 com.adobe.idp.Document
接受一个构造函数 java.io.File
对象还接受一个布尔参数。 将此参数设置为 true
, com.adobe.idp.Document
对象删除文件。 此操作意味着在将文件传递到 com.adobe.idp.Document
构造函数。
将此参数设置为 false
表示您保留此文件的所有权。 将此参数设置为 true
效率更高。 原因在于 com.adobe.idp.Document
对象可以将文件直接移动到本地受管区域,而不是复制文件(速度较慢)。
创建基于PDF文件的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代码示例创建 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
对象。
确定文档对象的内容类型
//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客户端库)调用。 A Java客户端库 是一组具体类,用于提供对服务容器中部署的服务的访问权限。 实例化表示要调用的服务的Java对象,而不是创建 InvocationRequest
对象。 调用API用于调用进程,例如在Workbench中创建的长期进程。 (请参阅 调用以人为中心的长期进程.)
要执行服务操作,请调用属于Java对象的方法。 Java客户端库包含的方法通常使用服务操作进行一对一映射。 使用Java客户端库时,设置所需的连接属性。 (请参阅 设置连接属性.)
设置连接属性后,创建 ServiceClientFactory
用于实例化允许调用服务的Java对象的对象。 每个具有Java客户端库的服务都有一个相应的客户端对象。 例如,要调用Repository服务,请创建 ResourceRepositoryClient
对象,使用它的构造函数传递 ServiceClientFactory
对象。 此 ServiceClientFactory
对象负责维护调用AEM Forms服务所需的连接设置。
尽管获得 ServiceClientFactory
通常速度快,在首次使用工厂时会产生一些开销。 此对象针对重用进行了优化,因此,如果可能,请使用它 ServiceClientFactory
对象。 即,不要创建单独的 ServiceClientFactory
您创建的每个客户端库对象的对象。
有一个用户管理器设置可控制位于以下位置中的SAML断言的生命周期: com.adobe.idp.Context
影响 ServiceClientFactory
对象。 此设置控制整个AEM Forms中的所有身份验证上下文生命周期,包括使用Java API执行的所有调用。 默认情况下, ServiceCleintFactory
对象可使用两个小时。
writeResource
操作被调用。 此操作会将新资源放入存储库中。通过使用 Java 客户机库并执行以下步骤,可以调用存储库服务:
-
在 Java 项目的类路径中包含客户机 JAR 文件,如adobe-repository-client.jar。 有关这些文件的位置的信息,请参阅 包括AEM Forms Java库文件。
-
设置调用服务所需的连接属性。
-
创建
ServiceClientFactory
对象,方法是调用ServiceClientFactory
对象的静态createInstance
方法和传递java.util.Properties
包含连接属性的对象。 -
创建
ResourceRepositoryClient
对象,使用它的构造函数传递ServiceClientFactory
对象。ResourceRepositoryClient
使用该对象调用存储库服务操作。 -
RepositoryInfomodelFactoryBean
使用对象的构造函数创建对象并传递null
.此对象允许您创建一个Resource
对象,该对象表示添加到存储库的内容。 -
Resource
通过调用RepositoryInfomodelFactoryBean
对象的方法newImage
并传递以下值来创建对象:- 通过指定
new Id()
的唯一 ID 值。 - 通过指定唯一的UUID值
new Lid()
. - 资源的名称。 您可以指定XDP文件的文件名。
将返回值强制转换为
Resource
. - 通过指定
-
创建
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的短暂进程:
-
将客户端JAR文件(如adobe-livecycle-client.jar)包含在Java项目的类路径中。 (请参阅 包括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
流程)。 将返回值强制转换为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
方法。
另请参阅