使用Java API调用AEM Forms

本文档中的示例和示例仅适用于JEE环境中的AEM Forms。

AEM Forms可以使用AEM Forms Java API进行调用。 使用AEM Forms Java API时,可以使用调用API或Java客户端库。 Java客户端库可用于服务,如Rights Management服务。 通过这些强键入API,您可以开发调用AEM Forms的Java应用程序。

调用API是位于com.adobe.idp.dsc包中的类。 使用这些类,您可以直接将调用请求发送到服务并处理返回的调用响应。 使用调用API来调用使用Workbench创建的短期或长期进程。

以编程方式调用服务的建议方法是使用与服务相对应的Java客户端库,而不是调用API。 例如,要调用加密服务,请使用加密服务客户端库。 要执行加密服务操作,请调用属于加密服务客户端对象的方法。 您可以通过调用EncryptionServiceClient对象的encryptPDFUsingPassword方法,使用密码加密PDF文档。

Java API支持以下功能:

  • 用于远程调用的RMI传输协议
  • 用于本地调用的VM传输
  • 用于远程调用的SOAP
  • 不同的身份验证,如用户名和密码
  • 同步和异步调用请求

Adobe开发人员网站

Adobe开发人员网站包含以下文章,讨论如何使用Java API调用AEM Forms服务:

使用Java Servlet调用AEM Forms进程

从Java调用AEM Forms Distiller API

另请参阅

包括AEM Forms Java库文件

调用以人为中心的长寿过程

使用Web服务调用AEM Forms

设置连接属性

使用Java API将数据传递到AEM Forms服务

使用Java客户端库调用服务

使用调用API调用短暂的进程

创建一个Java Web应用程序,该应用程序会调用以人为中心的长寿过程

包含AEM Forms Java库文件

要通过使用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文件

下表列出了调用AEM Forms服务所需的JAR文件。

文件

描述

位置

adobe-livecycle-client.jar

必须始终包含在Java客户端应用程序的类路径中。

<>安装目录>/sdk/client-libs/common

adobe-usermanager-client.jar

必须始终包含在Java客户端应用程序的类路径中。

<>安装目录>/sdk/client-libs/common

adobe-utilities.jar

必须始终包含在Java客户端应用程序的类路径中。

<>安装目录>/sdk//client-libs/<app server="">

adobe-applicationmanager-client-sdk.jar

需要调用应用程序管理器服务。

<>安装目录>/sdk/client-libs/common

adobe-assembler-client.jar

调用汇编程序服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-backup-restore-client-sdk.jar

调用备份和还原服务API时需要。

<>安装目录>/sdk/client-libs/common

adobe-barcodedforms-client.jar

调用条形码表单服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-convertpdf-client.jar

调用转换PDF服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-distiller-client.jar

调用Distiller服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-docconverter-client.jar

调用DocConverter服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-contentservices-client.jar

调用文档管理服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-encryption-client.jar

调用加密服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-forms-client.jar

调用Forms服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-formdataintegration-client.jar

需要调用表单数据集成服务。

<>安装目录>/sdk/client-libs/common

adobe-generatepdf-client.jar

调用生成PDF服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-generate3dpdf-client.jar

调用生成3D PDF服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-jobmanager-client-sdk.jar

调用作业管理器服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-output-client.jar

调用输出服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-pdfutility-client.jar

调用PDF实用程序或XMP实用程序服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-reader-extensions-client.jar

调用Acrobat Reader DC扩展服务时需要。

<>安装目录>/sdk/client-libs/common

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特定库目录

adobe-signatures-client.jar

调用签名服务时需要。

<>安装目录>/sdk/client-libs/common

adobe-taskmanager-client-sdk.jar

需要调用任务管理器服务。

<>安装目录>/sdk/client-libs/common

adobe-truststore-client.jar

调用信任存储服务时需要。

<>安装目录>/sdk/client-libs/common

连接模式和J2EE应用程序JAR文件

下表列出了依赖于连接模式和部署了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

如果使用SOAP模式调用AEM Forms,请包括这些JAR文件。

<>安装目录>/sdk/client-libs/thirdparty

jboss-client.jar

如果AEM Forms已部署在JBoss应用程序服务器上,请包含此JAR文件。

如果jboss-client.jar和引用的jar未共同找到,则类加载器将找不到所需的类。

JBoss客户端库目录

如果在同一J2EE应用程序服务器上部署客户端应用程序,则无需包含此文件。

wlclient.jar

如果AEM Forms是在BEA WebLogic Server®上部署的,请包含此JAR文件。

特定于WebLogic的lib目录

如果在同一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]/runtimes)

如果您在同一J2EE应用程序服务器上部署客户端应用程序,则不必包含这些文件。

正在调用方案

下表指定调用方案,并列出成功调用AEM Forms所需的JAR文件。

</thead align="left"> xmp-uti

服务

调用模式

J2EE应用程序服务器

所需的JAR文件

Forms服务

EJB

JBoss

  • adobe-livecycle-client.jar

  • adobe-usermanager-client.jar

  • jboss-client.jar
  • adobe-forms-client.jar
  • commons-httpclient-3.1.jar

Forms服务

Acrobat Reader DC扩展服务

签名服务

EJB

JBoss

  • 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

Forms服务

SOAP

WebLogic

  • 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扩展服务

签名服务

SOAP

WebLogic

  • 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文件

如果您从LiveCycle升级到AEM Forms,建议将AEM Forms JAR文件包含在Java项目的类路径中。 例如,如果您使用的是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

另请参阅

使用Java API调用AEM Forms

设置连接属性

使用Java API将数据传递到AEM Forms服务

使用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的,指定以下值之一:

    • JBoss:https://<ServerName>:8080 (default port)
    • WebSphere:iiop://<ServerName>:2809 (default port)
    • WebLogic:t3://<ServerName>:7001 (default port)
  • 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。 (这些值是默认端口值。 如果更改端口值,请使用适用的端口号。)
  • DSC_TRANSPORT_PROTOCOL:如果使用EJB连接模式,请为 ServiceClientFactoryProperties.DSC_EJB_PROTOCOL 此值指定。如果您使用的是SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL

  • DSC_SERVER_TYPE:指定部署AEM Forms的J2EE应用程序服务器。有效值为JBossWebSphereWebLogic

    • 如果将此连接属性设置为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_TYPEServiceClientFactoryProperties.DSC_WEBLOGIC_SERVER_TYPEServiceClientFactoryProperties.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属性。

要设置连接属性,请执行以下任务:

  1. 使用java.util.Properties对象的构造函数创建对象。

  2. 要设置DSC_DEFAULT_EJB_ENDPOINT连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:

    • ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT枚举值
    • 一个字符串值,用于指定托管AEM Forms的J2EE应用程序服务器的URL
    注意

    如果使用SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT枚举值,而不是ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT枚举值。

  3. 要设置DSC_TRANSPORT_PROTOCOL连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:

    • ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL枚举值
    • ServiceClientFactoryProperties.DSC_EJB_PROTOCOL枚举值
    注意

    如果使用SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL枚举值,而不是ServiceClientFactoryProperties.DSC_EJB_PROTOCOL枚举值。

  4. 要设置DSC_SERVER_TYPE连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:

    • ServiceClientFactoryProperties.DSC_SERVER_TYPE枚举值

    • 一个字符串值,用于指定承载AEM Forms的J2EE应用程序服务器(例如,如果AEM Forms部署在JBoss上,请指定JBoss)。

      1. 要设置DSC_CREDENTIAL_USERNAME连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:
    • ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME枚举值

    • 一个字符串值,用于指定调用AEM Forms所需的用户名

      1. 要设置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应用程序服务器上部署的调用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

使用上下文对象调用AEM Forms

您可以使用com.adobe.idp.Context对象通过经过身份验证的用户调用AEM Forms服务(com.adobe.idp.Context对象表示经过身份验证的用户)。 使用com.adobe.idp.Context对象时,无需设置DSC_CREDENTIAL_USERNAMEDSC_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_USERNAMEDSC_CREDENTIAL_PASSWORD属性。 使用AEM Forms用户调用服务时,请确保他们具有调用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);
注意

有关对用户进行身份验证的完整详细信息,请参阅身份验证用户

正在调用方案

本节将讨论以下调用方案:

  • 在其自身的Java虚拟机(JVM)中运行的客户端应用程序会调用独立的AEM Forms实例。
  • 在其自身JVM中运行的客户端应用程序会调用群集AEM Forms实例。

调用独立AEM Forms实例的客户端应用程序

下图显示了在其自身的JVM中运行并调用独立的AEM Forms实例的客户端应用程序。

在此方案中,客户端应用程序在其自身的JVM中运行并调用AEM Forms服务。

注意

此方案是所有快速入门都基于的调用方案。

调用群集AEM Forms实例的客户端应用程序

下图显示了在其自身的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

以下示例显示了jndi.properties文件的内容,该文件用于连接到部署在WebLogic上的AEM Forms。

 java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
 java.naming.provider.url=t3://appserver1:8001, appserver2:8001

JBoss

以下示例显示了jndi.properties文件的内容,该文件用于连接到部署在JBoss上的AEM Forms。

 java.naming.factory.initial= org.jnp.interfaces.NamingContextFactory
 java.naming.provider.url= jnp://appserver1:1099, appserver2:1099,
 appserver3:1099
注意

请咨询管理员以确定J2EE应用程序服务器名称和端口号。

另请参阅

包括AEM Forms Java库文件

使用Java API将数据传递到AEM Forms服务

使用Java客户端库调用服务

使用Java API将数据传递到AEM Forms服务

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.Documentorg.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();

另请参阅

使用Java API调用AEM Forms

设置连接属性

创建文档

在调用需要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);

基于InputStream对象创建文档

以下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访问的内容创建文档

以下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);

另请参阅

使用Java API调用AEM Forms

设置连接属性

处理返回的文档

将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的内容复制到本地文件:

  1. 创建java.io.File对象。
  2. 调用com.adobe.idp.Document对象的copyToFile方法并传递java.io.File对象。

以下代码示例将com.adobe.idp.Document对象的内容复制到名为​AnotherMap.pdf​的文件中。

将文档对象的内容复制到文件

 File outFile = new File("C:\\AnotherMap.pdf");
 myDocument.copyToFile (outFile);

另请参阅

使用Java API调用AEM Forms

设置连接属性

确定文档的内容类型

通过调用com.adobe.idp.Document对象的getContentType方法,确定com.adobe.idp.Document对象的MIME类型。 此方法会返回一个字符串值,用于指定com.adobe.idp.Document对象的内容类型。 下表介绍了AEM Forms返回的不同内容类型。

MIME类型

描述

application/pdf

PDF文档

application/vnd.adobe.xdp+xml

XML数据包(XDP),用于导出的XML Forms架构(XFA)表单

text/xml

书签、附件或其他XML文档

application/vnd.fdf

Forms数据格式(FDF),用于导出的Acrobat表单

application/vnd.adobe.xfdf

XML Forms数据格式(XFDF),用于导出的Acrobat表单

application/rdf+xml

富数据格式和XML

application/octet-stream

通用数据格式

NULL

未指定的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);

另请参阅

使用Java API调用AEM Forms

设置连接属性

处理文档对象

当不再需要Document对象时,建议通过调用其dispose方法来处理该对象。 每个Document对象都会使用文件描述符,并在应用程序的主机平台上使用多达75 MB的RAM空间。 如果未处理Document对象,则Java Garage收集过程会处理该对象。 但是,通过使用dispose方法更快地处理它,可以释放由Document对象占用的内存。

另请参阅

使用Java API调用AEM Forms

包括AEM Forms Java库文件

使用Java客户端库调用服务

使用Java客户端库调用服务

AEM Forms服务操作可使用服务的强类型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对象的时间段为两小时。

注意

为了说明如何使用Java API调用服务,将调用存储库服务的writeResource操作。 此操作会将新资源放入存储库中。

您可以通过使用Java客户端库并执行以下步骤来调用存储库服务:

  1. 在Java项目的类路径中包含客户端JAR文件,如adobe-repository-client.jar。 有关这些文件位置的信息,请参阅包括AEM Forms Java库文件

  2. 设置调用服务所需的连接属性。

  3. 通过调用ServiceClientFactory对象的静态createInstance方法并传递包含连接属性的java.util.Properties对象来创建ServiceClientFactory对象。

  4. 使用其构造函数创建ResourceRepositoryClient对象,并传递ServiceClientFactory对象。 使用ResourceRepositoryClient对象调用存储库服务操作。

  5. 使用其构造函数创建RepositoryInfomodelFactoryBean对象,并传递null。 此对象允许您创建一个Resource对象,以表示添加到存储库的内容。

  6. 通过调用RepositoryInfomodelFactoryBean对象的newImage方法并传递以下值,创建Resource对象:

    • 通过指定new Id()的唯一ID值。
    • 通过指定new Lid()的唯一UUID值。
    • 资源的名称。 您可以指定XDP文件的文件名。

    将返回值转换为Resource

  7. 通过调用RepositoryInfomodelFactoryBean对象的newImage方法并将返回值转换为ResourceContent,可创建ResourceContent对象。 此对象表示添加到存储库的内容。

  8. 通过传递一个java.io.FileInputStream对象来创建com.adobe.idp.Document对象,该对象存储要添加到存储库的XDP文件。 (请参阅基于InputStream对象创建文档。)

  9. 通过调用ResourceContent对象的setDataDocument方法,将com.adobe.idp.Document对象的内容添加到ResourceContent对象。 传递com.adobe.idp.Document对象。

  10. 通过调用ResourceContent对象的setMimeType方法并传递application/vnd.adobe.xdp+xml,设置要添加到存储库的XDP文件的MIME类型。

  11. 通过调用Resource对象的setContent方法并传递ResourceContent对象,将ResourceContent对象的内容添加到Resource对象。

  12. 通过调用Resource对象“s setDescription”方法并传递表示资源描述的字符串值来添加资源描述。

  13. 通过调用ResourceRepositoryClient对象的writeResource方法并传递以下值,将表单设计添加到存储库:

    • 一个字符串值,用于指定包含新资源的资源集合的路径
    • 创建的Resource对象

另请参阅

快速启动(EJB模式):使用Java API编写资源

使用Java API调用AEM Forms

包括AEM Forms Java库文件

使用调用API调用短暂的进程

您可以使用Java调用API调用生命周期较短的进程。 使用调用API调用生命周期较短的进程时,使用java.util.HashMap对象传递所需的参数值。 对于要传递到服务的每个参数,请调用java.util.HashMap对象的put方法,并指定服务所需的名称值对,以执行指定的操作。 指定属于短期流程的参数的确切名称。

注意

有关调用长寿命进程的信息,请参阅调用以人为中心的长寿命进程

此处讨论的内容是使用调用API调用以下名为MyApplication/EncryptDocument的AEM Forms短期进程。

注意

此过程不基于现有的AEM Forms进程。 要遵循代码示例,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此过程时,会执行以下操作:

  1. 获取传递到流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

使用Java调用API调用MyApplication/EncryptDocument短期进程

使用Java调用API调用MyApplication/EncryptDocument短时进程:

  1. 在您Java项目的类路径中包含客户端JAR文件,如adobe-livecycle-client.jar。 (请参阅包含AEM Forms Java库文件。)

  2. 创建包含连接属性的ServiceClientFactory对象。 (请参阅设置连接属性。)

  3. 使用其构造函数创建ServiceClient对象,并传递ServiceClientFactory对象。 ServiceClient对象允许您调用服务操作。 它处理诸如查找、调度和路由调用请求等任务。

  4. 使用java.util.HashMap对象的构造函数创建对象。

  5. 为每个输入参数调用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);
    
  6. 通过调用ServiceClientFactory对象的createInvocationRequest方法并传递以下值,创建InvocationRequest对象:

    • 一个字符串值,用于指定要调用的长生命周期进程的名称。 要调用MyApplication/EncryptDocument进程,请指定MyApplication/EncryptDocument
    • 表示流程操作名称的字符串值。 通常,短暂的进程操作的名称为invoke
    • java.util.HashMap对象,其中包含服务操作所需的参数值。
    • 一个布尔值,指定true,用于创建同步请求(此值适用于调用短生命周期进程)。
  7. 通过调用ServiceClient对象的invoke方法并传递InvocationRequest对象,将调用请求发送到该服务。 invoke方法返回一个InvocationReponse对象。

    注意

    通过将值false作为createInvocationRequest方法的第四个参数传递,可以调用一个长时间的进程。 传递值​false会创建异步请求。

  8. 通过调用InvocationReponse对象的getOutputParameter方法并传递指定输出参数名称的字符串值,检索进程的返回值。 在这种情况下,请指定outDocoutDocMyApplication/EncryptDocument进程的输出参数的名称)。 将返回值转换为Document,如以下示例所示。

     InvocationResponse response = myServiceClient.invoke(request);
     Document encryptDoc = (Document) response.getOutputParameter("outDoc");
    
  9. 创建java.io.File对象,并确保文件扩展名为.pdf。

  10. 调用com.adobe.idp.Document对象的copyToFile方法,将com.adobe.idp.Document对象的内容复制到文件。 确保使用getOutputParameter方法返回的com.adobe.idp.Document对象。

另请参阅

快速入门:使用调用API调用短暂的进程

调用以人为中心的长寿过程

包括AEM Forms Java库文件

在此页面上