渲染交互式PDF forms

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

Forms服务将交互式PDF forms呈现到客户端设备(通常是Web浏览器),以从用户收集信息。 呈现交互式表单后,用户可以将数据输入到表单字段中,然后单击表单上的提交按钮以将信息发送回Forms服务。 Adobe Reader或Acrobat必须安装在承载客户端Web浏览器的计算机上,才能显示交互式PDF表单。

注意

在使用Forms服务渲染表单之前,请先创建表单设计。 通常,表单设计在Designer中创建并保存为XDP文件。 有关创建表单设计的信息,请参阅Forms Designer

贷款申请示例

引入了一个贷款应用程序示例,用于演示Forms服务如何使用交互式表单从用户处收集信息。 此应用程序允许用户用确保贷款安全所需的数据填写表单,然后向Forms服务提交数据。 下图显示了贷款应用程序的逻辑流。

ri_ri_finsrv_loanapp_v1

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

步骤

描述

1

从HTML页调用GetLoanForm Java Servlet。

2

GetLoanForm Java Servlet使用Forms服务客户端API向客户端Web浏览器呈现贷款表。 (请参阅使用Java API渲染交互式PDF表单。)

3

用户填写贷款表单并单击提交按钮后,数据将提交到HandleData Java Servlet。 (请参阅"贷款表"。)

4

HandleData Java Servlet使用Forms服务客户端API处理表单提交和检索表单数据。 然后,数据存储在企业数据库中。 (请参阅处理已提交的Forms。)

5

确认表单将呈现回Web浏览器。 呈现表单之前,会将用户的名和姓等数据与表单合并。 (请参阅使用可流式布局预填充Forms。)

贷款表

此交互式贷款表由示例贷款应用程序的GetLoanForm Java Servlet呈现。

ri_ri_loanform

确认表单

此表单由示例贷款应用程序的HandleData Java Servlet呈现。

ri_ri_confirm

HandleData Java Servlet使用用户的名和姓以及amount预填充此表单。 预填充表单后,表单将发送到客户端Web浏览器。 (请参阅使用可流式布局预填充Forms)

Java Servlet

示例贷款应用程序是作为Java Servlet存在的Forms服务应用程序的示例。 Java Servlet是在J2EE项目服务器(如WebSphere)上运行的Java应用程序,包含Forms服务客户端API代码。

以下代码显示名为GetLoanForm的Java Servlet的语法:

     public class GetLoanForm extends HttpServlet implements Servlet {
         public void doGet(HttpServletRequest req, HttpServletResponse resp
         throws ServletException, IOException {

         }
         public void doPost(HttpServletRequest req, HttpServletResponse resp
         throws ServletException, IOException {

             }

通常,您不会将Forms服务客户端API代码放在Java Servlet的doGetdoPost方法中。 最好将此代码放在单独的类中,从doPost方法(或doGet方法)实例化该类,并调用相应的方法。 但是,对于代码简单性,本节中的代码示例将保持为最小值,并且代码示例将放在doPost方法中。

注意

有关Forms服务的详细信息,请参阅AEM Forms的服务参考。

步骤摘要

要渲染交互式PDF表单,请执行以下任务:

  1. 包括项目文件。
  2. 创建Forms Client API对象。
  3. 指定URI值。
  4. 将文件附加到表单(可选)。
  5. 渲染交互式PDF表单。
  6. 将表单数据流写入客户端Web浏览器。

包括项目文件

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

创建Forms Client API对象

在以编程方式执行Forms服务客户端API操作之前,必须创建Forms客户端API对象。 如果您使用Java API,请创建FormsServiceClient对象。 如果您使用Forms Web服务API,请创建FormsService对象。

指定URI值

您可以指定Forms服务渲染表单所需的URI值。 使用内容根URI值repository:///可以引用作为Forms应用程序一部分保存的表单设计。 例如,请考虑以下名为​Loan.xdp​的表单设计,该表单设计位于名为​FormsApplication​的Forms应用程序中:

ri_ri_formrepository

要访问此表单设计,请指定Applications/FormsApplication/1.0/FormsFolder/Loan.xdp作为表单名称(传递给renderPDFForm方法的第一个参数),指定repository:///作为内容根URI值。

注意

有关使用Workbench创建Forms应用程序的信息,请参阅Workbench帮助

位于Forms应用程序中的资源的路径为:

Applications/Application-name/Application-version/Folder.../Filename

以下值显示一些URI值的示例:

  • Applications/AppraisalReport/1.0/Forms/FullForm.xdp
  • Applications/AnotherApp/1.1/Assets/picture.jpg
  • Applications/SomeApp/2.0/Resources/Data/XSDs/MyData.xsd

在渲染交互式表单时,您可以定义URI值,如发布表单数据的目标URL。 目标URL可通过以下方式之一进行定义:

  • 在设计器中设计表单设计时的“提交”按钮
  • 通过使用Forms服务客户端API

如果表单设计中定义了目标URL,请勿使用Forms服务客户端API覆盖它。 即,使用Forms API设置目标URL会将表单设计中指定的URL重置为使用API指定的URL。 如果您希望将PDF表单提交到在表单设计中指定的目标URL,请以编程方式将目标URL设置为空字符串。

如果您的表单包含提交按钮和计算按钮(带有在服务器上运行的相应脚本),则可以通过编程方式定义将表单发送到的URL以执行脚本。 使用表单设计上的提交按钮指定将表单数据发布到的URL。 (请参阅计算表单数据。)

注意

您还可以将com.adobe.idp.Document实例传递给Forms服务,而不是指定URL值以引用XDP文件。 com.adobe.idp.Document实例包含表单设计。 (请参阅将文档传递到Forms服务。)

将文件附加到表单

您可以将文件附加到表单。 当您渲染带有文件附件的PDF表单时,用户可以使用文件附件窗格在Acrobat中检索文件附件。 可以将不同文件类型附加到表单(如文本文件)或二进制文件(如JPG文件)。

注意

将文件附件附加到表单是可选的。

渲染交互式PDF表单

要渲染表单,请使用在Designer中创建并另存为XDP或PDF文件的表单设计。 此外,您还可以渲染使用Acrobat创建并另存为PDF文件的表单。 要渲染交互式PDF表单,请调用FormsServiceClient对象的renderPDFForm方法或renderPDFForm2方法。

renderPDFForm使用URLSpec对象。 XDP文件的内容根将使用URLSpec对象的setContentRootURI方法传递到Forms服务。 表单设计名称(formQuery)将作为单独的参数值传递。 将这两个值连接起来,以获得对表单设计的绝对引用。

renderPDFForm2方法接受一个com.adobe.idp.Document实例,该实例包含要渲染的XDP或PDF文档。

注意

如果输入文档是PDF文档,则无法设置加标签的PDF运行时选项。 如果输入文件是XDP文件,则可以设置加标签的PDF选项。

使用Java API渲染交互式PDF表单

使用Forms API(Java)渲染交互式PDF表单:

  1. 包括项目文件

    在Java项目的类路径中包含客户端JAR文件,如adobe-forms-client.jar。

  2. 创建Forms Client API对象

    • 创建包含连接属性的ServiceClientFactory对象。
    • 使用FormsServiceClient对象的构造函数并传递ServiceClientFactory对象,创建对象。
  3. 指定URI值

    • 创建一个URLSpec对象,该对象使用其构造函数存储URI值。
    • 调用URLSpec对象的setApplicationWebRoot方法并传递一个字符串值,该值表示应用程序的Web根目录。
    • 调用URLSpec对象的setContentRootURI方法并传递一个指定内容根URI值的字符串值。 确保表单设计位于内容根URI中。 否则,Forms服务将引发异常。 要引用存储库,请指定repository:///
    • 调用URLSpec对象的setTargetURL方法并传递一个字符串值,该字符串值指定将表单目标发布到的位置。 如果在表单设计中定义目标URL,则可以传递空字符串。 您还可以指定将表单发送到的URL以执行计算。
  4. 将文件附加到表单

    • 使用java.util.HashMap的构造函数创建一个用于存储文件附件的对象。

    • 为要附加到渲染的表单的每个文件调用java.util.HashMap对象的put方法。 将以下值传递给此方法:

      • 一个字符串值,它指定文件附件的名称,包括文件扩展名。
    • 包含文件附件的com.adobe.idp.Document对象。

    注意

    对要附加到表单的每个文件重复此步骤。 此步骤是可选的,如果您不想发送文件附件,可以传递null

  5. 渲染交互式PDF表单

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

    • 一个字符串值,它指定表单设计名称,包括文件扩展名。 如果引用的表单设计是Forms应用程序的一部分,请确保指定完整路径,如Applications/FormsApplication/1.0/FormsFolder/Loan.xdp
    • com.adobe.idp.Document对象,其中包含要与表单合并的数据。 如果不想合并数据,请传递空com.adobe.idp.Document对象。
    • 存储运行时选项的PDFFormRenderSpec对象。 这是可选参数,如果不想指定运行时选项,可以指定null
    • URLSpec对象,其中包含Forms服务所需的URI值。
    • 存储文件附件的java.util.HashMap对象。 这是可选参数,如果不想将文件附加到表单,可以指定null

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

  6. 将表单数据流写入客户端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方法,创建一个用于将表单数据流写入客户端Web浏览器的javax.servlet.ServletOutputStream对象。
    • 通过调用com.adobe.idp.Document对象的getInputStream方法创建java.io.InputStream对象。
    • 通过调用InputStream对象的read方法并将字节数组作为参数传递,创建一个字节数组并将其填充为表单数据流。
    • 调用javax.servlet.ServletOutputStream对象的write方法,将表单数据流发送到客户端Web浏览器。 将字节数组传递给write方法。

使用Web服务API渲染交互式PDF表单

使用Forms API(Web服务)渲染交互式PDF表单:

  1. 包括项目文件

    • 创建使用Forms服务WSDL的Java代理类。
    • 将Java代理类包含到类路径中。
  2. 创建Forms Client API对象

    创建FormsService对象并设置身份验证值。

  3. 指定URI值

    • 创建一个URLSpec对象,该对象使用其构造函数存储URI值。
    • 调用URLSpec对象的setApplicationWebRoot方法并传递一个字符串值,该值表示应用程序的Web根目录。
    • 调用URLSpec对象的setContentRootURI方法并传递一个指定内容根URI值的字符串值。 确保表单设计位于内容根URI中。 否则,Forms服务将引发异常。 要引用存储库,请指定repository:///
    • 调用URLSpec对象的setTargetURL方法并传递一个字符串值,该字符串值指定将表单目标发布到的位置。 如果在表单设计中定义目标URL,则可以传递空字符串。 您还可以指定将表单发送到的URL以执行计算。
  4. 将文件附加到表单

    • 使用java.util.HashMap的构造函数创建一个用于存储文件附件的对象。

    • 为要附加到渲染的表单的每个文件调用java.util.HashMap对象的put方法。 将以下值传递给此方法:

      • 一个字符串值,它指定文件附件的名称,包括文件扩展名
    • 包含文件附件的BLOB对象

    注意

    对要附加到表单的每个文件重复此步骤。

  5. 渲染交互式PDF表单

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

    • 一个字符串值,它指定表单设计名称,包括文件扩展名。 如果引用的表单设计是Forms应用程序的一部分,请确保指定完整路径,如Applications/FormsApplication/1.0/FormsFolder/Loan.xdp
    • BLOB对象,其中包含要与表单合并的数据。 如果不想合并数据,请传递null
    • 存储运行时选项的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对象。

  6. 将表单数据流写入客户端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方法,创建一个用于将表单数据流写入客户端Web浏览器的javax.servlet.ServletOutputStream对象。
    • 创建一个字节数组,并通过调用BLOB对象的getBinaryData方法填充它。 此任务将FormsResult对象的内容分配给字节数组。
    • 调用javax.servlet.http.HttpServletResponse对象的write方法,将表单数据流发送到客户端Web浏览器。 将字节数组传递给write方法。

将表单数据流写入客户端Web浏览器

当Forms服务呈现表单时,它返回一个必须写入客户端Web浏览器的表单数据流。 写入到客户端Web浏览器时,用户可以看到表单。

On this page

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now