AEM Forms可以通过使用AEM FormsJava API来调用。 使用AEM FormsJava 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开发人员网站
Adobe开发人员网站包含以下讨论使用Java API调用AEM Forms服务的文章:
另请参阅
要通过使用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 |
调用条形码表单服务时需要。 |
<>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扩展服务 签名服务 |
EJB |
JBoss |
|
Forms服务 |
SOAP |
WebLogic |
|
Forms服务 Acrobat Reader DC扩展服务 签名服务 |
SOAP |
WebLogic |
|
如果从LiveCycle升级到AEM Forms,建议将AEM FormsJAR文件包含在Java项目的类路径中。 例如,如果您使用Rights Management服务等服务,则在类路径中不包含AEM FormsJAR文件时,将会遇到兼容性问题。
假设你升级到AEM Forms。 要使用调用Rights Management服务的Java应用程序,请包括以下JAR文件的AEM Forms版本:
另请参阅
使用Java API时,可设置连接属性以调用AEM Forms。 设置连接属性时,指定是远程调用还是本地调用服务,还指定连接模式和身份验证值。 启用服务安全性时,需要验证值。 但是,如果禁用了服务安全性,则无需指定身份验证值。
连接模式可以是SOAP模式或EJB模式。 EJB模式使用RMI/IIOP协议,EJB模式的性能优于SOAP模式的性能。 SOAP模式用于消除J2EE应用程序服务器依赖性,或当防火墙位于AEM Forms和客户端应用程序之间时。 SOAP模式使用https协议作为基础传输,并可以跨防火墙边界进行通信。 如果J2EE应用程序服务器依赖关系或防火墙都不是问题,则建议使用EJB模式。
要成功调用AEM Forms服务,请设置以下连接属性:
DSC_DEFAULT_EJB_ENDPOINT:如 果使用EJB连接模式,此值表示部署了AEM Forms的J2EE应用程序服务器的URL。要远程调用AEM Forms,请指定部署了AEM Forms的J2EE应用程序服务器名称。 如果您的客户端应用程序位于同一J2EE应用程序服务器上,则可以指定localhost
。 根据部署的J2EE应用程序服务器AEM Forms,指定以下值之一:
https://<ServerName>:8080 (default port)
iiop://<ServerName>:2809 (default port)
t3://<ServerName>:7001 (default port)
DSC_DEFAULT_SOAP_ENDPOINT:如果您使用SOAP连接模式,此值表示向其发送调用请求的端点。要远程调用AEM Forms,请指定部署了AEM Forms的J2EE应用程序服务器名称。 如果您的客户端应用程序位于同一J2EE应用程序服务器上,则可以指定localhost
(例如http://localhost:8080
)。
8080
适用。 如果J2EE应用程序服务器是IBM® WebSphere®,请使用端口9080
。 同样,如果J2EE应用程序服务器是WebLogic,则使用端口7001
。 (这些值是默认端口值。 如果更改端口值,请使用适用的端口号。)DSC_TRANSPORT_PROTOCOL:如果使用EJB连接模式,请为 ServiceClientFactoryProperties.DSC_EJB_PROTOCOL
此值指定。如果使用SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL
。
DSC_SERVER_TYPE:指定部署了AEM Forms的J2EE应用程序服务器。有效值为JBoss
、WebSphere
和WebLogic
。
WebSphere
,则java.naming.factory.initial
值将设置为com.ibm.ws.naming.util.WsnInitCtxFactory
。WebLogic
,则java.naming.factory.initial
值将设置为weblogic.jndi.WLInitialContextFactory
。JBoss
,则java.naming.factory.initial
值将设置为org.jnp.interfaces.NamingContextFactory
。java.naming.factory.initial
属性设置为符合您要求的值。可以使用ServiceClientFactoryProperties
类的静态成员,而不是使用字符串设置DSC_SERVER_TYPE
连接属性。 可以使用以下值:ServiceClientFactoryProperties.DSC_WEBSPHERE_SERVER_TYPE
、ServiceClientFactoryProperties.DSC_WEBLOGIC_SERVER_TYPE
或ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE
。
DSC_CREDENTIAL_USERNAME:指 定AEM表单用户名。要使用户成功调用AEM Forms服务,他们需要服务用户角色。 用户还可以具有包含服务调用权限的其他角色。 否则,当他们尝试调用服务时会引发异常。 如果禁用了服务安全性,则无需指定此连接属性。
DSC_CREDENTIAL_PASSWORD:指 定相应的口令值。如果禁用了服务安全性,则无需指定此连接属性。
DSC_REQUEST_TIMEOUT:SOAP请 求的默认请求超时限制为1200000毫秒(20分钟)。有时,请求可能需要更长的时间才能完成操作。 例如,检索大量记录的SOAP请求可能需要较长的超时限制。 您可以使用ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT
来增加SOAP请求的请求调用超时限制。
只有基于SOAP的调用支持DSC_REQUEST_TIMEOUT属性。
要设置连接属性,请执行以下任务:
使用java.util.Properties
对象的构造函数创建<a0/>对象。
要设置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应用程序服务器上部署的AEM Forms以及禁用服务安全时所需的连接属性。
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://localhost:1099");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
与“使用AEM Forms进行编程”相关的所有Java快速开始都显示EJB和SOAP连接设置。
使用自定义请求超时限制设置SOAP连接模式
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT, "1800000"); // Request timeout limit 30 Minutes
使用Context对象调用AEM Forms
可以使用com.adobe.idp.Context
对象调用经过身份验证的用户的AEM Forms服务(com.adobe.idp.Context
对象表示经过身份验证的用户)。 使用com.adobe.idp.Context
对象时,无需设置DSC_CREDENTIAL_USERNAME
或DSC_CREDENTIAL_PASSWORD
属性。 使用AuthenticationManagerServiceClient
对象的authenticate
方法进行用户身份验证时,可以获得com.adobe.idp.Context
对象。
authenticate
方法返回一个AuthResult
对象,其中包含身份验证结果。 可以通过调用其构造函数创建com.adobe.idp.Context
对象。 然后调用com.adobe.idp.Context
对象的initPrincipal
方法并传递AuthResult
对象,如以下代码所示:
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
您可以调用ServiceClientFactory
对象的setContext
方法并传递com.adobe.idp.Context
对象,而不是设置DSC_CREDENTIAL_USERNAME
或DSC_CREDENTIAL_PASSWORD
属性。 使用AEM表单用户调用服务时,请确保他们具有调用AEM Forms服务所需的名为Services User
的角色。
下面的代码示例说明如何在用于创建EncryptionServiceClient
对象的连接设置中使用com.adobe.idp.Context
对象。
//Authenticate a user and use the Context object within connection settings
// Authenticate the user
String username = "wblue";
String password = "password";
AuthResult authResult = authClient.authenticate(username, password.getBytes());
//Set a Content object that represents the authenticated user
//Use the Context object to invoke the Encryption service
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
//Set connection settings
Properties connectionProps = new Properties();
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://<server>:1099");
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL, ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"jnp://<server>:1099");
//Create a ServiceClientFactory object
ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
myFactory.setContext(myCtx);
//Create an EncryptionServiceClient object
EncryptionServiceClient encryptClient = new EncryptionServiceClient(myFactory);
有关对用户进行身份验证的完整详细信息,请参阅对用户进行身份验证。
本节将讨论以下调用情形:
下图显示了在其自身的JVM中运行并调用独立的AEM Forms实例的客户端应用程序。
在这种情况下,客户端应用程序在其自己的JVM中运行并调用AEM Forms服务。
此方案是所有快速开始都基于的调用方案。
下图显示了在其自身的JVM中运行并调用群集中的AEM Forms实例的客户端应用程序。
此方案类似于调用独立的AEM Forms实例的客户端应用程序。 但是,提供者URL不同。 如果客户端应用程序要连接到特定的J2EE应用程序服务器,则应用程序必须更改URL以引用特定的J2EE应用程序服务器。
不建议引用特定的J2EE应用程序服务器,因为如果应用程序服务器停止,客户端应用程序与AEM Forms之间的连接将终止。 建议提供者URL引用单元格级JNDI管理器,而不是特定的J2EE应用程序服务器。
使用SOAP连接模式的客户端应用程序可以使用群集的HTTP负载平衡器端口。 使用EJB连接模式的客户端应用程序可以连接到特定J2EE应用程序服务器的EJB端口。 此操作处理群集节点之间的负载平衡。
WebSphere
以下示例显示用于连接到部署在WebSphere上的AEM Forms的jndi.properties文件的内容。
java.naming.factory.initial=com.ibm.websphere.naming.
WsnInitialContextFactory
java.naming.provider.url=corbaloc::appserver1:9810,:appserver2:9810
WebLogic
以下示例显示用于连接到部署在WebLogic上的AEM Forms的jndi.properties文件的内容。
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://appserver1:8001, appserver2:8001
JBoss
以下示例显示用于连接到部署在JBoss上的AEM Forms的jndi.properties文件的内容。
java.naming.factory.initial= org.jnp.interfaces.NamingContextFactory
java.naming.provider.url= jnp://appserver1:1099, appserver2:1099,
appserver3:1099
请咨询管理员以确定J2EE应用程序服务器名称和端口号。
另请参阅
AEM Forms服务操作通常使用或生成PDF文档。 调用服务时,有时需要将PDF文档(或其他文档类型,如XML数据)传递给服务。 同样,有时也需要处理从服务返回的PDF文档。 使您能够向AEM Forms服务传递数据的Java类为com.adobe.idp.Document
。
AEM Forms服务不接受PDF文档作为其他数据类型,如java.io.InputStream
对象或字节数组。 com.adobe.idp.Document
对象还可用于将其他类型的数据(如XML数据)传递给服务。
com.adobe.idp.Document
对象是Java可序列化类型,因此可通过RMI调用传递它。 接收方可以配置(同一主机、同一类加载器)、本地(同一主机、不同类加载器)或远程(不同主机)。 文档内容的传递针对每种情况进行了优化。 例如,如果发送方和接收方位于同一主机上,则内容将通过本地文件系统传递。 (在某些情况下,文档可以在内存中传递。)
根据com.adobe.idp.Document
对象大小,数据将在com.adobe.idp.Document
对象中传输或存储在服务器的文件系统中。 com.adobe.idp.Document
对象占用的任何临时存储资源在com.adobe.idp.Document
处理后自动删除。 (请参阅处置文档对象。)
有时,在将com.adobe.idp.Document
对象传递给服务之前,必须了解该对象的内容类型。 例如,如果某个操作需要特定内容类型(如application/pdf
),建议您确定该内容类型。 (请参阅确定文档的内容类型。)
com.adobe.idp.Document
对象尝试使用提供的数据确定内容类型。 如果无法从提供的数据检索内容类型(例如,当数据作为字节数组提供时),请设置内容类型。 要设置内容类型,请调用com.adobe.idp.Document
对象的setContentType
方法。 (请参阅确定文档的内容类型)
如果附属文件位于同一文件系统中,则创建com.adobe.idp.Document
对象会更快。 如果附属文件驻留在远程文件系统上,则必须执行复制操作,这会影响性能。
应用程序可以同时包含com.adobe.idp.Document
和org.w3c.dom.Document
数据类型。 但是,请确保完全限定org.w3c.dom.Document
数据类型。 有关将org.w3c.dom.Document
对象转换为com.adobe.idp.Document
对象的信息,请参阅快速开始(EJB模式):使用Java API使用可流式布局预填充Forms。
为了在使用com.adobe.idp.Document
对象时防止WebLogic中的内存泄漏,请以2048字节或更少的块读取文档信息。 例如,以下代码以2048字节的块为单位读取文档信息:
// Set up the chunk size to prevent a potential memory leak
int buffSize = 2048;
// Determine the total number of bytes to read
int docLength = (int) inDoc.length();
byte [] byteDoc = new byte[docLength];
// Set up the reading position
int pos = 0;
// Loop through the document information, 2048 bytes at a time
while (docLength > 0) {
// Read the next chunk of information
int toRead = Math.min(buffSize, docLength);
int bytesRead = inDoc.read(pos, byteDoc, pos, toRead);
// Handle the exception in case data retrieval failed
if (bytesRead == -1) {
inDoc.doneReading();
inDoc.dispose();
throw new RuntimeException("Data retrieval failed!");
}
// Update the reading position and number of bytes remaining
pos += bytesRead;
docLength -= bytesRead;
}
// The document information has been successfully read
inDoc.doneReading();
inDoc.dispose();
另请参阅
在调用需要PDF文档(或其他文档类型)作为输入值的服务操作之前,创建com.adobe.idp.Document
对象。 com.adobe.idp.Document
类提供了使您能够从以下内容类型创建文档的构造函数:
com.adobe.idp.Document
对象java.io.File
对象java.io.InputStream
对象java.net.URL
对象下面的代码示例创建基于字节数组的com.adobe.idp.Document
对象。
创建基于字节数组的文档对象
Document 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);
下面的代码示例创建一个com.adobe.idp.Document
对象,该对象基于名为map.pdf的PDF文件。 此文件位于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),用于导出的XMLForms体系架构(XFA)表单 |
|
书签、附件或其他XML文档 |
|
Forms数据格式(FDF),用于导出Acrobat表单 |
|
XMLForms数据格式(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客户端库的服务都有一个对应的客户端对象。 例如,要调用存储库服务,请使用ResourceRepositoryClient
对象的构造函数创建一个<a0/>对象,并传递ServiceClientFactory
对象。 ServiceClientFactory
对象负责维护调用AEM Forms服务所需的连接设置。
虽然获取ServiceClientFactory
通常速度较快,但首次使用工厂时会涉及一些开销。 此对象经过优化以便重用,因此,在创建多个Java客户端对象时,尽可能使用相同的ServiceClientFactory
对象。 即,不要为您创建的每个客户端库对象单独创建ServiceClientFactory
对象。
有一个“用户管理器”设置,它控制com.adobe.idp.Context
对象内影响ServiceClientFactory
对象的SAML断言的生命周期。 此设置控制整个AEM Forms的所有身份验证上下文使用期,包括使用Java API执行的所有调用。 默认情况下,可使用ServiceCleintFactory
对象的时间段为两小时。
要说明如何使用Java API调用服务,将调用存储库服务的writeResource
操作。 此操作会将新资源放入存储库中。
您可以通过使用Java客户端库并通过执行以下步骤调用存储库服务:
在Java项目的类路径中包含客户端JAR文件,如adobe-repository-client.jar。 有关这些文件的位置的信息,请参见包括AEM FormsJava库文件。
设置调用服务所需的连接属性。
通过调用ServiceClientFactory
对象的静态createInstance
方法并传递包含连接属性的java.util.Properties
对象,创建ServiceClientFactory
对象。
使用ResourceRepositoryClient
对象的构造函数并传递ServiceClientFactory
对象,创建<a0/>对象。 使用ResourceRepositoryClient
对象调用存储库服务操作。
使用RepositoryInfomodelFactoryBean
对象的构造函数创建<a0/>对象,并传递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 FormsJava库文件。)
创建包含连接属性的ServiceClientFactory
对象。 (请参阅设置连接属性。)
使用ServiceClient
对象的构造函数并传递ServiceClientFactory
对象,创建<a0/>对象。 ServiceClient
对象允许您调用服务操作。 它处理任务,如查找、调度和路由调用请求。
使用java.util.HashMap
对象的构造函数创建<a0/>对象。
调用每个输入参数的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
对象。
另请参阅