通常,在Designer中创建的表单设计会通过引用Forms服务来传递。 表单设计可能较大,因此,通过引用传递它们更为有效,从而避免必须按值封送表单设计字节。 Forms服务还可以缓存表单设计,以便在缓存时,不必持续读取表单设计。
如果表单设计包含UUID属性,则会缓存该属性。 对于所有表单设计,UUID值都是唯一的,可用于唯一标识表单。 按值呈现表单时,只有在表单重复使用时才应缓存该表单。 但是,如果表单没有重复使用且必须是唯一的,则可以避免使用使用使用AEM Forms API设置的缓存选项来缓存表单。
Forms服务还可以解析表单设计中链接内容的位置。 例如,从表单设计中引用的链接图像是相对URL。 链接的内容始终被假定为相对于表单设计位置。 因此,解析链接内容是通过将相对路径应用到绝对表单设计位置来确定其位置的问题。
您可以按值传递表单设计,而不是按引用传递表单设计。 在动态创建表单设计时,按值传递表单设计非常有效;也就是说,当客户端应用程序在运行时生成创建表单设计的XML时。 在这种情况下,表单设计不会存储在物理存储库中,因为它存储在内存中。 在运行时动态创建表单设计并按值传递该设计时,您可以缓存该表单并提高Forms服务的性能。
按值传递表单的限制
按值传递表单设计时,将受到以下限制:
尽管您可以按值呈现不同类型的表单(例如,包含使用权限的HTML表单或表单),但本节将讨论渲染交互式PDF forms。
有关Forms服务的更多信息,请参阅AEM Forms的服务参考。
要按值渲染表单,请执行以下步骤:
包含项目文件
在开发项目中包含必需的文件。 如果您使用Java创建客户端应用程序,请包含必要的JAR文件。 如果您使用的是Web服务,请确保包含代理文件。
创建Forms客户端API对象
在以编程方式将数据导入PDF表单客户端API之前,您必须创建数据集成服务客户端。 在创建服务客户端时,您可以定义调用服务所需的连接设置。
引用表单设计
按值呈现表单时,必须创建一个com.adobe.idp.Document
对象,其中包含要渲染的表单设计。 您可以引用现有的XDP文件,也可以在运行时动态创建表单设计,并使用该数据填充com.adobe.idp.Document
。
此部分和相应的快速启动会引用现有的XDP文件。
按值呈现表单
要按值渲染表单,请将包含表单设计的com.adobe.idp.Document
实例传递到渲染方法的inDataDoc
参数(可以是FormsServiceClient
对象的任何渲染方法,如renderPDFForm
、(Deprecated) renderHTMLForm
等)。 此参数值通常为与表单合并的数据保留。 同样,将空字符串值传递到formQuery
参数。 通常,此参数需要一个字符串值来指定表单设计的名称。
如果要在表单中显示数据,必须在xfa:datasets
元素中指定数据。 有关XFA架构的信息,请转到https://www.pdfa.org/norm-refs/XFA-3_3.pdf。
将表单数据流写入客户端Web浏览器
当Forms服务按值呈现表单时,它会返回一个必须写入客户端Web浏览器的表单数据流。 写入客户端Web浏览器时,用户可以看到该表单。
另请参阅
使用Forms API(Java)按值呈现表单:
包含项目文件
在Java项目的类路径中包含客户端JAR文件,如adobe-forms-client.jar。
创建Forms客户端API对象
ServiceClientFactory
对象。FormsServiceClient
对象,并传递ServiceClientFactory
对象。引用表单设计
java.io.FileInputStream
对象,该对象通过使用其构造函数并传递指定XDP文件位置的字符串值来表示要呈现的表单设计。com.adobe.idp.Document
对象,并传递java.io.FileInputStream
对象。按值呈现表单
调用FormsServiceClient
对象的renderPDFForm
方法并传递以下值:
com.adobe.idp.Document
对象。 通常,此参数值是为与表单合并的数据保留的。PDFFormRenderSpec
对象。 这是一个可选参数,如果不想指定运行时选项,可以指定null
。URLSpec
对象,其中包含Forms服务所需的URI值。java.util.HashMap
对象。 这是一个可选参数,如果您不想将文件附加到表单,可以指定null
。renderPDFForm
方法返回一个FormsResult
对象,该对象包含可写入客户端Web浏览器的表单数据流。
将表单数据流写入客户端Web浏览器
FormsResult
对象“s getOutputContent
”方法创建com.adobe.idp.Document
对象。getContentType
方法获取com.adobe.idp.Document
对象的内容类型。setContentType
方法并传递com.adobe.idp.Document
对象的内容类型来设置javax.servlet.http.HttpServletResponse
对象的内容类型。javax.servlet.http.HttpServletResponse
对象的getOutputStream
方法,创建一个javax.servlet.ServletOutputStream
对象,用于将表单数据流写入客户端Web浏览器。com.adobe.idp.Document
对象的getInputStream
方法创建java.io.InputStream
对象。InputStream
对象的大小。 调用InputStream
对象的available
方法以获取InputStream
对象的大小。InputStream
对象的read
方法并将字节数组作为参数进行传递,使用表单数据流填充字节数组。javax.servlet.ServletOutputStream
对象的write
方法,将表单数据流发送到客户端Web浏览器。 将字节数组传递到write
方法。另请参阅
使用Forms API(Web服务)按值呈现表单:
包含项目文件
创建Forms客户端API对象
创建FormsService
对象并设置身份验证值。
引用表单设计
java.io.FileInputStream
对象的构造函数创建对象。 传递指定XDP文件位置的字符串值。BLOB
对象的构造函数创建对象。 BLOB
对象用于存储使用密码加密的PDF文档。java.io.FileInputStream
对象内容的字节数组。 您可以通过使用available
方法获取java.io.FileInputStream
对象的大小来确定字节数组的大小。java.io.FileInputStream
对象的read
方法并传递字节数组,用流数据填充字节数组。setBinaryData
方法并传递字节数组来填充BLOB
对象。按值呈现表单
调用FormsService
对象的renderPDFForm
方法并传递以下值:
BLOB
对象。 通常,此参数值是为与表单合并的数据保留的。PDFFormRenderSpec
对象。 这是一个可选参数,如果不想指定运行时选项,可以指定null
。URLSpec
对象,其中包含Forms服务所需的URI值。java.util.HashMap
对象。 这是一个可选参数,如果您不想将文件附加到表单,可以指定null
。com.adobe.idp.services.holders.BLOBHolder
对象。 用于存储渲染的PDF表单。javax.xml.rpc.holders.LongHolder
对象。 (此参数以表单形式存储页数。)javax.xml.rpc.holders.StringHolder
对象。 (此参数存储区域设置值。)com.adobe.idp.services.holders.FormsResultHolder
对象。renderPDFForm
方法使用必须写入客户端Web浏览器的表单数据流填充作为最后一个参数值传递的com.adobe.idp.services.holders.FormsResultHolder
对象。
将表单数据流写入客户端Web浏览器
com.adobe.idp.services.holders.FormsResultHolder
对象value
数据成员的值,创建FormResult
对象。FormsResult
对象的getOutputContent
方法,创建包含表单数据的BLOB
对象。getContentType
方法获取BLOB
对象的内容类型。setContentType
方法并传递BLOB
对象的内容类型来设置javax.servlet.http.HttpServletResponse
对象的内容类型。javax.servlet.http.HttpServletResponse
对象的getOutputStream
方法,创建一个javax.servlet.ServletOutputStream
对象,用于将表单数据流写入客户端Web浏览器。BLOB
对象的getBinaryData
方法来填充该数组。 此任务将FormsResult
对象的内容分配给字节数组。javax.servlet.http.HttpServletResponse
对象的write
方法,将表单数据流发送到客户端Web浏览器。 将字节数组传递到write
方法。另请参阅