使用可流动布局预填充Forms

使用可流动布局预填充Forms

预填充表单会向呈现表单中的用户显示数据。 例如,假设用户使用用户名和密码登录到网站。 如果验证成功,客户端应用程序将查询数据库以获取用户信息。 数据将合并到表单中,然后向用户呈现表单。 因此,用户能够查看表单中的个性化数据。

预填充表单具有以下优势:

  • 允许用户在表单中查看自定义数据。
  • 减少用户为填写表单而键入的内容量。
  • 通过控制数据的放置位置来确保数据完整性。

以下两个XML数据源可以预填充表单:

  • XDP数据源,即符合XFA语法的XML(或用于预填充使用Acrobat创建的表单的XFDF数据)。
  • 任意XML数据源,其中包含与表单字段名称匹配的名称/值对(本节中的示例使用任意XML数据源)。

要预填充的每个表单字段都必须存在XML元素。 XML元素名称必须与字段名称匹配。 如果XML元素与表单字段不对应,或XML元素名称与字段名称不匹配,则忽略该元素。 只要指定了所有XML元素,就不必匹配XML元素的显示顺序。

预填充已包含数据的表单时,必须指定XML数据源中已显示的数据。 假设一个包含10个字段的表单在四个字段中包含数据。 接下来,假定您要预填充其余六个字段。 在这种情况下,必须在XML数据源中指定10个用于预填充表单的XML元素。 如果仅指定六个元素,则原始的四个字段为空。

例如,您可以预填充表单,如示例确认表单。 (请参阅 呈现交互式PDF forms.)

要预填充示例确认表单,您必须创建一个XML数据源,该数据源包含三个与表单中三个字段匹配的XML元素。 此表单包含以下三个字段: FirstName, LastNameAmount. 第一步是创建一个XML数据源,其中包含与表单设计中的字段匹配的XML元素。 下一步是向XML元素分配数据值,如以下XML代码中所示。

     <Untitled>
         <FirstName>Jerry</FirstName>
         <LastName>Johnson</LastName>
         <Amount>250000</Amount>
     </Untitled>

使用此XML数据源预填充确认表单,然后渲染表单后,将显示您分配给XML元素的数据值,如下图所示。

pf_pf_confirmxml3

使用可流动布局预填充表单

具有可流动布局的Forms对于向用户显示数量不确定的数据非常有用。 由于表单的布局会根据合并的数据量自动调整,因此您无需像处理具有固定布局的表单那样为表单预定固定布局或页面数量。

表单通常填充在运行时获取的数据。 因此,您可以通过创建内存中的XML数据源并将数据直接放入内存中的XML数据源来预填充表单。

考虑使用基于Web的应用程序,例如在线商店。 在线购物者完成购买项目后,所有购买项目都会放入内存中用于预填充表单的XML数据源中。 下图显示了此过程,该过程在图后的表中说明。

pf_pf_finsrv_webapp_v1

下表介绍了此图中的步骤。

步骤

描述

1

用户从基于Web的在线商店购买项目。

2

用户完成购买项目并单击“提交”按钮后,将创建内存中的XML数据源。 购买的物品和用户信息将放入内存中的XML数据源中。

3

XML数据源用于预填充采购订单表单(此表格下方显示了此表单的示例)。

4

采购订单表单会呈现给客户端Web浏览器。

下图显示了采购订单表单的示例。 表中的信息可以根据XML数据中的记录数进行调整。

pf_pf_poform

注意

表单可以预填充来自其他源(如企业数据库或外部应用程序)的数据。

表单设计注意事项

具有可流动布局的Forms基于在Designer中创建的表单设计。 表单设计指定一组布局、呈现和数据捕获规则,包括基于用户输入计算值。 在表单中输入数据时,将应用规则。 添加到表单的字段是表单设计中的子表单。 例如,在上图中显示的采购订单表单中,每行都是一个子表单。 有关创建包含子表单的表单设计的信息,请参阅 创建具有可流动布局的采购订单表单.

了解数据子组

XML数据源用于预填充具有固定布局和可流动布局的表单。 但是,区别在于,使用可流式布局预填充表单的XML数据源包含用于预填充表单中重复的子表单的重复XML元素。 这些重复XML元素称为数据子组。

用于预填充上图中显示的采购订单表单的XML数据源包含四个重复数据子组。 每个数据子群组都对应于购买的项目。 购买的物品包括显示器、台灯、电话和通讯簿。

以下XML数据源用于预填充采购订单表单。

     <header>
         <!-- XML elements used to prepopulate non-repeating fields such as address
         <!and city
         <txtPONum>8745236985</txtPONum>
         <dtmDate>2004-02-08</dtmDate>
         <txtOrderedByCompanyName>Any Company Name</txtOrderedByCompanyName>
         <txtOrderedByAddress>555, Any Blvd.</txtOrderedByAddress>
         <txtOrderedByCity>Any City</txtOrderedByCity>
         <txtOrderedByStateProv>ST</txtOrderedByStateProv>
         <txtOrderedByZipCode>12345</txtOrderedByZipCode>
         <txtOrderedByCountry>Any Country</txtOrderedByCountry>
         <txtOrderedByPhone>(123) 456-7890</txtOrderedByPhone>
         <txtOrderedByFax>(123) 456-7899</txtOrderedByFax>
         <txtOrderedByContactName>Contact Name</txtOrderedByContactName>
         <txtDeliverToCompanyName>Any Company Name</txtDeliverToCompanyName>
         <txtDeliverToAddress>7895, Any Street</txtDeliverToAddress>
         <txtDeliverToCity>Any City</txtDeliverToCity>
         <txtDeliverToStateProv>ST</txtDeliverToStateProv>
         <txtDeliverToZipCode>12346</txtDeliverToZipCode>
         <txtDeliverToCountry>Any Country</txtDeliverToCountry>
         <txtDeliverToPhone>(123) 456-7891</txtDeliverToPhone>
         <txtDeliverToFax>(123) 456-7899</txtDeliverToFax>
         <txtDeliverToContactName>Contact Name</txtDeliverToContactName>
     </header>
     <detail>
         <!-- A data subgroup that contains information about the monitor>
         <txtPartNum>00010-100</txtPartNum>
         <txtDescription>Monitor</txtDescription>
         <numQty>1</numQty>
         <numUnitPrice>350.00</numUnitPrice>
     </detail>
     <detail>
         <!-- A data subgroup that contains information about the desk lamp>
         <txtPartNum>00010-200</txtPartNum>
         <txtDescription>Desk lamps</txtDescription>
         <numQty>3</numQty>
         <numUnitPrice>55.00</numUnitPrice>
     </detail>
     <detail>
         <!-- A data subgroup that contains information about the Phone>
             <txtPartNum>00025-275</txtPartNum>
             <txtDescription>Phone</txtDescription>
             <numQty>5</numQty>
             <numUnitPrice>85.00</numUnitPrice>
     </detail>
     <detail>
         <!-- A data subgroup that contains information about the address book>
         <txtPartNum>00300-896</txtPartNum>
         <txtDescription>Address book</txtDescription>
         <numQty>2</numQty>
         <numUnitPrice>15.00</numUnitPrice>
     </detail>

请注意,每个数据子组都包含与此信息对应的四个XML元素:

  • 物料部件号
  • 项目描述
  • 项目数量
  • 单价

数据子组的父XML元素的名称必须与位于表单设计中的子表单的名称匹配。 例如,在上图中,请注意数据子组的父XML元素的名称是 detail. 此名称对应于位于采购订单表单所依据的表单设计中的子表单的名称。 如果数据子组的父XML元素名称与子表单名称不匹配,则不会预填充服务器端表单。

每个数据子组必须包含与子表单中的字段名称匹配的XML元素。 的 detail 位于表单设计中的子表单包含以下字段:

  • txtPartNum
  • txtDescription
  • numQty
  • numUnitPrice
注意

如果尝试使用包含重复XML元素的数据源预填充表单,并设置 RenderAtClient 选项 No,则只会将第一个数据记录合并到表单中。 要确保将所有数据记录合并到表单中,请将 RenderAtClient to Yes. 有关 RenderAtClient 选项,请参阅 在客户端渲染Forms.

注意

有关Forms服务的更多信息,请参阅 AEM Forms服务参考.

步骤摘要

要使用可流动布局预填充表单,请执行以下任务:

  1. 包括项目文件。
  2. 创建内存中的XML数据源。
  3. 转换XML数据源。
  4. 呈现预填充的表单。

包含项目文件

在开发项目中包含必需的文件。 如果您使用Java创建客户端应用程序,请包含必需的JAR文件。 如果您使用的是Web服务,请确保包含代理文件。

包含项目文件

在开发项目中包含必需的文件。 如果您使用Java创建客户端应用程序,请包含必需的JAR文件。 如果您使用的是Web服务,请确保包含代理文件。

创建内存中的XML数据源

您可以使用 org.w3c.dom 类创建内存中的XML数据源,以使用可流式布局预填充表单。 必须将数据放入符合表单的XML数据源中。 有关具有可流式布局的表单与XML数据源之间关系的信息,请参阅 了解数据子组.

转换XML数据源

使用 org.w3c.dom 类可以转换为 com.adobe.idp.Document 对象,以便用于预填充表单。 内存中的XML数据源可以使用Java XML转换类进行转换。

注意

如果使用Forms服务的WSDL来预填充表单,则必须将 org.w3c.dom.Document 对象 BLOB 对象。

呈现预填充的表单

与其他表单一样,您渲染预填充的表单。 唯一的区别是您使用 com.adobe.idp.Document 包含用于预填充表单的XML数据源的对象。

另请参阅

包括AEM Forms Java库文件

设置连接属性

Forms Service API快速入门

呈现交互式PDF forms

创建可渲染Forms的Web应用程序

使用Java API预填充表单

要使用Forms API(Java)预填充具有可流动布局的表单,请执行以下步骤:

  1. 包含项目文件

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

  2. 创建内存中的XML数据源

    • 创建Java DocumentBuilderFactory 对象 DocumentBuilderFactory class' newInstance 方法。

    • 创建Java DocumentBuilder 对象 DocumentBuilderFactory 对象 newDocumentBuilder 方法。

    • 调用 DocumentBuilder 对象 newDocument 实例化方法 org.w3c.dom.Document 对象。

    • 通过调用 org.w3c.dom.Document 对象 createElement 方法。 这会创建 Element 表示根元素的对象。 将表示元素名称的字符串值传递到 createElement 方法。 将返回值转换为 Element. 接下来,通过调用 Document 对象 appendChild 方法,并将根元素对象作为参数传递。 下面几行代码显示此应用程序逻辑:

       Element root = (Element)document.createElement("transaction");  document.appendChild(root);

    • 通过调用 Document 对象 createElement 方法。 将表示元素名称的字符串值传递到 createElement 方法。 将返回值转换为 Element. 接下来,通过调用 root 对象 appendChild 方法,并将标头元素对象作为参数进行传递。 附加到标题元素的XML元素对应于表单的静态部分。 以下几行代码显示此应用程序逻辑:

       Element header = (Element)document.createElement("header");  root.appendChild(header);

    • 通过调用 Document 对象 createElement 方法,并传递表示元素名称的字符串值。 将返回值转换为 Element. 接下来,通过调用子元素的 appendChild 方法,并通过 Document 对象 createTextNode 方法作为参数。 指定显示为子元素值的字符串值。 最后,通过调用标头元素的 appendChild 方法,并将子元素对象作为参数传递。 以下几行代码显示此应用程序逻辑:

       Element poNum= (Element)document.createElement("txtPONum");  poNum.appendChild(document.createTextNode("8745236985"));  header.appendChild(LastName);

    • 通过重复出现在表单静态部分的每个字段的最后一个子步骤,将所有剩余的元素添加到标题元素(在XML数据源图中,这些字段显示在A节中)。(请参阅 了解数据子组.)

    • 通过调用 Document 对象 createElement 方法。 将表示元素名称的字符串值传递到 createElement 方法。 将返回值转换为 Element. 接下来,通过调用 root 对象 appendChild 方法中,并将detail元素对象作为参数进行传递。 附加到详细元素的XML元素对应于表单的动态部分。 以下几行代码显示此应用程序逻辑:

       Element detail = (Element)document.createElement("detail");  root.appendChild(detail);

    • 通过调用 Document 对象 createElement 方法,并传递表示元素名称的字符串值。 将返回值转换为 Element. 接下来,通过调用子元素的 appendChild 方法,并通过 Document 对象 createTextNode 方法作为参数。 指定显示为子元素值的字符串值。 最后,通过调用详细信息元素的 appendChild 方法,并将子元素对象作为参数传递。 以下几行代码显示此应用程序逻辑:

       Element txtPartNum = (Element)document.createElement("txtPartNum");  txtPartNum.appendChild(document.createTextNode("00010-100"));  detail.appendChild(txtPartNum);

    • 对所有XML元素重复最后一个子步骤以附加到详细信息元素。 要正确创建用于填充采购订单表单的XML数据源,您必须将以下XML元素附加到详细信息元素: txtDescription, numQtynumUnitPrice.

    • 对用于预填充表单的所有数据项重复最后两个子步骤。

  3. 转换XML数据源

    • 创建 javax.xml.transform.Transformer 对象 javax.xml.transform.Transformer 对象的静态 newInstance 方法。
    • 创建 Transformer 对象 TransformerFactory 对象 newTransformer 方法。
    • 创建 ByteArrayOutputStream 对象。
    • 创建 javax.xml.transform.dom.DOMSource 对象,并使用其构造函数进行传递 org.w3c.dom.Document 在步骤1中创建的对象。
    • 创建 javax.xml.transform.dom.DOMSource 对象,并使用其构造函数进行传递 ByteArrayOutputStream 对象。
    • 填充Java ByteArrayOutputStream 对象 javax.xml.transform.Transformer 对象 transform 方法和通过 javax.xml.transform.dom.DOMSourcejavax.xml.transform.stream.StreamResult 对象。
    • 创建字节数组并分配 ByteArrayOutputStream 对象。
    • 通过调用 ByteArrayOutputStream 对象 toByteArray 方法。
    • 创建 com.adobe.idp.Document 对象。
  4. 呈现预填充的表单

    调用 FormsServiceClient 对象 renderPDFForm 方法并传递以下值:

    • 指定表单设计名称(包括文件扩展名)的字符串值。
    • A com.adobe.idp.Document 包含要与表单合并的数据的对象。 确保使用 com.adobe.idp.Document 在步骤1和步骤2中创建的对象。
    • A PDFFormRenderSpec 用于存储运行时选项的对象。
    • A URLSpec 包含Forms服务所需URI值的对象。
    • A java.util.HashMap 用于存储文件附件的对象。 这是一个可选参数,您可以指定 null 如果您不想将文件附加到表单。

    renderPDFForm 方法返回 FormsResult 包含必须写入客户端web浏览器的表单数据流的对象。

    • 创建 javax.servlet.ServletOutputStream 用于将表单数据流发送到客户端web浏览器的对象。
    • 创建 com.adobe.idp.Document 对象 FormsResult 对象s getOutputContent 方法。
    • 创建 java.io.InputStream 对象 com.adobe.idp.Document 对象 getInputStream 方法。
    • 通过调用 InputStream 对象 read 方法并将字节数组作为参数进行传递。
    • 调用 javax.servlet.ServletOutputStream 对象 write 将表单数据流发送到客户端web浏览器的方法。 将字节数组传递到 write 方法。

另请参阅

快速入门(SOAP模式):使用Java API使用可流动布局预填充Forms

包括AEM Forms Java库文件

设置连接属性

使用Web服务API预填充表单

要使用Forms API(Web服务)预填充具有可流动布局的表单,请执行以下步骤:

  1. 包含项目文件

  2. 创建内存中的XML数据源

    • 创建Java DocumentBuilderFactory 对象 DocumentBuilderFactory class' newInstance 方法。

    • 创建Java DocumentBuilder 对象 DocumentBuilderFactory 对象 newDocumentBuilder 方法。

    • 调用 DocumentBuilder 对象 newDocument 实例化方法 org.w3c.dom.Document 对象。

    • 通过调用 org.w3c.dom.Document 对象 createElement 方法。 这会创建 Element 表示根元素的对象。 将表示元素名称的字符串值传递到 createElement 方法。 将返回值转换为 Element. 接下来,通过调用 Document 对象 appendChild 方法,并将根元素对象作为参数传递。 以下几行代码显示此应用程序逻辑:

       Element root = (Element)document.createElement("transaction");  document.appendChild(root);

    • 通过调用 Document 对象 createElement 方法。 将表示元素名称的字符串值传递到 createElement 方法。 将返回值转换为 Element. 接下来,通过调用 root 对象 appendChild 方法,并将标头元素对象作为参数进行传递。 附加到标题元素的XML元素对应于表单的静态部分。 以下几行代码显示此应用程序逻辑:

       Element header = (Element)document.createElement("header");  root.appendChild(header);

    • 通过调用 Document 对象 createElement 方法,并传递表示元素名称的字符串值。 将返回值转换为 Element. 接下来,通过调用子元素的 appendChild 方法,并通过 Document 对象 createTextNode 方法作为参数。 指定显示为子元素值的字符串值。 最后,通过调用标头元素的 appendChild 方法,并将子元素对象作为参数传递。 下面几行代码显示此应用程序逻辑:

       Element poNum= (Element)document.createElement("txtPONum");  poNum.appendChild(document.createTextNode("8745236985"));  header.appendChild(LastName);

    • 通过重复出现在表单静态部分的每个字段的最后一个子步骤,将所有剩余的元素添加到标题元素(在XML数据源图中,这些字段显示在A节中)。(请参阅 了解数据子组.)

    • 通过调用 Document 对象 createElement 方法。 将表示元素名称的字符串值传递到 createElement 方法。 将返回值转换为 Element. 接下来,通过调用 root 对象 appendChild 方法中,并将detail元素对象作为参数进行传递。 附加到详细元素的XML元素对应于表单的动态部分。 下面几行代码显示此应用程序逻辑:

       Element detail = (Element)document.createElement("detail");  root.appendChild(detail);

    • 通过调用 Document 对象 createElement 方法,并传递表示元素名称的字符串值。 将返回值转换为 Element. 接下来,通过调用子元素的 appendChild 方法,并通过 Document 对象 createTextNode 方法作为参数。 指定显示为子元素值的字符串值。 最后,通过调用详细信息元素的 appendChild 方法,并将子元素对象作为参数传递。 下面几行代码显示此应用程序逻辑:

       Element txtPartNum = (Element)document.createElement("txtPartNum");  txtPartNum.appendChild(document.createTextNode("00010-100"));  detail.appendChild(txtPartNum);

    • 对所有XML元素重复最后一个子步骤以附加到详细信息元素。 要正确创建用于填充采购订单表单的XML数据源,您必须将以下XML元素附加到详细信息元素: txtDescription, numQtynumUnitPrice.

    • 对用于预填充表单的所有数据项重复最后两个子步骤。

  3. 转换XML数据源

    • 创建 javax.xml.transform.Transformer 对象 javax.xml.transform.Transformer 对象的静态 newInstance 方法。
    • 创建 Transformer 对象 TransformerFactory 对象 newTransformer 方法。
    • 创建 ByteArrayOutputStream 对象。
    • 创建 javax.xml.transform.dom.DOMSource 对象,并使用其构造函数进行传递 org.w3c.dom.Document 在步骤1中创建的对象。
    • 创建 javax.xml.transform.dom.DOMSource 对象,并使用其构造函数进行传递 ByteArrayOutputStream 对象。
    • 填充Java ByteArrayOutputStream 对象 javax.xml.transform.Transformer 对象 transform 方法和通过 javax.xml.transform.dom.DOMSourcejavax.xml.transform.stream.StreamResult 对象。
    • 创建字节数组并分配 ByteArrayOutputStream 对象。
    • 通过调用 ByteArrayOutputStream 对象 toByteArray 方法。
    • 创建 BLOB 对象,使用其构造函数调用其 setBinaryData 方法和传递字节数组。
  4. 呈现预填充的表单

    调用 FormsService 对象 renderPDFForm 方法并传递以下值:

    • 指定表单设计名称(包括文件扩展名)的字符串值。
    • A BLOB 包含要与表单合并的数据的对象。 确保使用 BLOB 在步骤1和步骤2中创建的对象。
    • A PDFFormRenderSpecc 用于存储运行时选项的对象。 有关更多信息,请参阅 AEM Forms API参考.
    • A URLSpec 包含Forms服务所需URI值的对象。
    • A 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 方法填充 com.adobe.idp.services.holders.FormsResultHolder 作为最后一个参数值传递的对象,表单数据流必须写入客户端web浏览器。

    • 创建 FormResult 对象,方法是获取 com.adobe.idp.services.holders.FormsResultHolder 对象 value 数据成员。
    • 创建 BLOB 通过调用包含表单数据的对象 FormsResult 对象 getOutputContent 方法。
    • 获取的内容类型 BLOB 通过调用对象 getContentType 方法。
    • 设置 javax.servlet.http.HttpServletResponse 对象的内容类型(通过调用 setContentType 方法和传递 BLOB 对象。
    • 创建 javax.servlet.ServletOutputStream 用于通过调用将表单数据流写入客户端web浏览器的对象 javax.servlet.http.HttpServletResponse 对象 getOutputStream 方法。
    • 创建一个字节数组,并通过调用 BLOB 对象 getBinaryData 方法。 此任务分配 FormsResult 对象。
    • 调用 javax.servlet.http.HttpServletResponse 对象 write 将表单数据流发送到客户端web浏览器的方法。 将字节数组传递到 write 方法。
    注意

    renderPDFForm 方法填充 com.adobe.idp.services.holders.FormsResultHolder 作为最后一个参数值传递的对象,表单数据流必须写入客户端web浏览器。

另请参阅

使用Base64编码调用AEM Forms

在此页面上