将Forms渲染为HTML rendering-forms-as-html
本文档中的示例和示例仅适用于JEE环境上的AEM Forms。
Forms服务将表单渲染为HTML,以响应来自Web浏览器的HTTP请求。 将表单渲染为HTML的好处是,客户端Web浏览器所在的计算机不需要Adobe Reader、Acrobat或Flash Player(适用于表单指南(已弃用))。
要将表单渲染为HTML,必须将表单设计另存为XDP文件。 保存为PDF文件的表单设计无法呈现为HTML。 在Designer中开发将作为HTML呈现的表单设计时,请考虑以下条件:
- 请勿使用对象的边框属性在表单上绘制线条、框或网格。 某些浏览器可能不会将边框与预览中显示的边框完全对齐。 对象可能显示为分层,也可能将其他对象推离其预期位置。
- 可以使用直线、矩形和圆定义背景。
- Draw文本略大于容纳该文本所需的内容。 某些Web浏览器无法清楚地显示文本。
FormServiceClient
对象的(Deprecated) renderHTMLForm
和renderHTMLForm2
方法渲染包含TIFF图像的表单时,TIFF图像在Internet Explorer或Mozilla Firefox浏览器中显示的渲染HTML表单中不可见。 这些浏览器不提供对TIFF图像的本机支持。HTML页面 html-pages
当窗体设计呈现为HTML窗体时,每个第二级子窗体呈现为HTML页(面板)。 您可以在Designer中查看子表单的层次结构。 属于根子表单的子表单(根子表单的默认名称为form1)是面板子表单。 以下示例显示了窗体设计的子窗体。
form1
Master Pages
PanelSubform1
NestedDynamicSubform
TextEdit1
PanelSubform2
TextEdit1
PanelSubform3
TextEdit1
PanelSubform4
TextEdit1
当窗体设计呈现为HTML窗体时,面板不受任何特定页面大小的限制。 如果您有动态子表单,则应将它们嵌套在面板子表单中。 动态子表单能够扩展到无限数量的HTML页。
当表单呈现为HTML表单时,页面大小(对呈现为PDF的表单进行分页所必需的)没有任何意义。 由于具有流式布局的表单可以扩展到无限数量的HTML页,因此请务必避免在母版页上使用页脚。 母版页上HTML区域下面的页脚可能会覆盖流过页面边界的内容内容。
您必须使用xfa.host.pageUp
和xfa.host.pageDown
方法明确地在面板之间移动。 您可以通过向Forms服务发送表单并让Forms服务将表单渲染回客户端设备(通常是Web浏览器)来更改页面。
.fsc-ds-ssb
:此样式表适用于符号字段为空的字段。
.fsc-ds-ssv
:此样式表适用于存在有效符号字段的情况。
.fsc-ds-ssc
:此样式表适用于存在有效符号字段但数据已更改的情况。
.fsc-ds-ssi
:此样式表适用于存在无效签名字段的情况。
.fsc-ds-popup-bg
:未使用此样式表属性。
。fsc-ds-popup-btn
:未使用此样式表属性。
正在运行脚本 running-scripts
表单作者指定脚本是在服务器上还是客户端上执行。 Forms服务创建用于执行表单智能的分布式事件处理环境,该环境可通过使用runAt
属性在客户端和服务器之间分发。 有关此特性或在表单设计中创建脚本的信息,请参阅Forms Designer
Forms服务可以在渲染表单时执行脚本。 因此,您可以通过连接到数据库或客户端上可能没有的Web服务来预填充包含数据的表单。 您还可以将按钮的Click
事件设置为在服务器上运行,以便客户端将数据往返到服务器。 这允许客户端在用户与表单交互时运行可能需要服务器资源的脚本,例如企业数据库。 对于HTML表单,formcalc脚本只能在服务器上执行。 因此,您必须将这些脚本标记为在server
或both
运行。
您可以通过调用xfa.host.pageUp
和xfa.host.pageDown
方法设计在页面(面板)之间移动的表单。 此脚本放置在按钮的Click
事件中,runAt
属性设置为Both
。 您选择Both
的原因是,Adobe Reader或Acrobat(对于呈现为PDF的表单)无需转至服务器即可更改页面,而HTML表单则可通过将数据舍入到服务器来更改页面。 即,将表单发送到Forms服务,并将表单呈现为HTML,同时显示新页面。
建议不要为脚本变量和表单字段指定相同的名称,例如项目。 某些Web浏览器(如Internet Explorer)可能无法初始化与表单字段同名的变量,从而导致出现脚本错误。 为表单字段和脚本变量指定不同的名称是一种好的做法。
在呈现包含页面导航功能和表单脚本的HTML表单时(例如,假设脚本在每次呈现表单时都从数据库中检索字段数据),请确保表单脚本采用form:calculate事件,而不是form:readyevent。
form:ready事件形式的表单脚本在表单的初始渲染期间只执行一次,而不会在后续页面检索中执行。 相反,对于渲染表单的每个页面导航执行form:calculate事件。
您可以在提交表单之前调用自定义脚本。 此功能在所有可用的浏览器上运行。 但是,它只能在用户渲染其Output Type
属性设置为Form Body
的HTML表单时使用。 当Output Type
为Full HTML
时,它将不起作用。 有关配置此功能的步骤,请参阅管理帮助中的配置表单。
首先定义在提交表单之前调用的回调函数,该函数的名称为_user_onsubmit
。 假定函数不会引发任何异常,或者如果引发异常,将忽略该异常。 建议将JavaScript函数放置在html的head部分中;但是,您可以在包含xfasubset.js
的脚本标记结尾之前的任意位置声明该函数。
当表单服务器呈现包含下拉列表的XDP时,除了创建下拉列表之外,还会创建两个隐藏的文本字段。 这些文本字段存储下拉列表的数据(一个字段存储选项的显示名称,另一个字段存储选项的值)。 因此,每次用户提交表单时,都会提交下拉列表的整个数据。 假设您不希望每次都提交那么多的数据,则可以编写自定义脚本来禁用它。 例如:下拉列表的名称为drpOrderedByStateProv
,它封装在子表单标题下。 HTML输入元素的名称将为header[0].drpOrderedByStateProv[0]
。 存储和提交下拉列表数据的隐藏字段的名称具有以下名称: header[0].drpOrderedByStateProv_DISPLAYITEMS_[0] header[0].drpOrderedByStateProv_VALUEITEMS_[0]
如果不想发布数据,可以通过以下方式禁用这些输入元素。var __CUSTOM_SCRIPTS_VERSION = 1; //enabling the feature function _user_onsubmit() { var elems = document.getElementsByName("header[0].drpOrderedByStateProv_DISPLAYITEMS_[0]"); elems[0].disabled = true; elems = document.getElementsByName("header[0].drpOrderedByStateProv_VALUEITEMS_[0]"); elems[0].disabled = true; }
header[0].drpOrderedByStateProv_DISPLAYITEMS_[0] header[0].drpOrderedByStateProv_VALUEITEMS_[0]
var __CUSTOM_SCRIPTS_VERSION = 1; //enabling the feature
function _user_onsubmit() {
var elems = document.getElementsByName("header[0].drpOrderedByStateProv_DISPLAYITEMS_[0]");
elems[0].disabled = true;
elems = document.getElementsByName("header[0].drpOrderedByStateProv_VALUEITEMS_[0]");
elems[0].disabled = true;
}
XFA子集 xfa-subsets
在创建要呈现为HTML的表单设计时,必须将脚本限制为JavaScript语言脚本的XFA子集。
在客户端上运行或在客户端和服务器上运行的脚本必须写入到XFA子集中。 在服务器上运行的脚本可以使用完整的XFA脚本模型,也可以使用FormCalc。 有关使用JavaScript的信息,请参阅Forms Designer。
在客户端上运行脚本时,只有正在显示的当前面板可以使用脚本;例如,当显示面板B时,您无法针对面板A中的字段编写脚本。 在服务器上运行脚本时,可以访问所有面板。
在客户端上运行的脚本中使用脚本对象模型(SOM)表达式时要小心。 在客户端上运行的脚本仅支持SOM表达式的简化子集。
事件计时 event-timing
XFA子集定义映射到HTML事件的XFA事件。 计算事件和验证事件的时间在行为上略有差异。 在Web浏览器中,退出字段时会执行完全计算事件。 当您对字段值做出更改时,计算事件不会自动执行。 您可以通过调用xfa.form.execCalculate
方法强制计算事件。
在Web浏览器中,验证事件仅在退出字段或提交表单时执行。 您可以使用xfa.form.execValidate
方法强制验证事件。
在Web浏览器中显示的Forms(与Adobe Reader或Acrobat不同)符合必填字段的XFA null测试(错误或警告)。
- 如果空测试产生错误,并且您退出字段时未指定值,则会显示一个消息框,您将在单击“确定”后重新定位到该字段。
- 如果空测试生成警告,并且您退出字段时未指定值,则系统将提示您单击“确定”或“取消”,从而使您可以选择继续操作而不指定值,或者返回字段输入值。
有关null测试的更多信息,请参阅Forms Designer。
表单按钮 form-buttons
单击提交按钮会将表单数据发送到Forms服务,并显示表单处理过程的结束。 可以将preSubmit
事件设置为在客户端或服务器上运行。 如果将preSubmit
事件配置为在客户端上运行,则它会在提交表单之前运行。 否则,在提交表单期间,preSubmit
事件将在服务器上运行。 有关preSubmit
事件的详细信息,请参阅Forms Designer。
如果按钮没有与其关联的客户端脚本,则会将数据提交到服务器,在服务器上执行计算,并重新生成HTML表单。 如果按钮包含客户端脚本,则不会将数据发送到服务器,并且客户端脚本将在Web浏览器中执行。
HTML4.0 Web浏览器 html-4-0-web-browser
仅支持HTML4.0的Web浏览器无法支持XFA子集客户端脚本模型。 在创建可在HTML4.0和MSDHTML或CSS2HTML中运行的表单设计时,标记为在客户端运行的脚本实际上将在服务器上运行。 例如,假设用户单击了位于HTML4.0 Web浏览器中显示的表单上的按钮。 在这种情况下,表单数据将发送到执行客户端脚本的服务器。
建议您将表单逻辑放置在计算事件中,这些计算事件在HTML为4.0的服务器以及用于MSDHTML或CSS2HTML的客户端上运行。
维护演示文稿更改 maintaining-presentation-changes
在HTML页面(面板)之间移动时,只会保留数据的状态。 不会维护诸如背景颜色或必填字段设置之类的设置(如果与初始设置不同)。 要保持表示状态,您必须创建表示字段表示状态的字段(通常为隐藏字段)。 如果向字段的Calculate
事件添加脚本,该脚本根据隐藏字段值更改演示文稿,则在HTML页面(面板)之间来回移动时,可以保留演示状态。
以下脚本根据hiddenField
的值维护字段的fillColor
。 假定此脚本位于字段的Calculate
事件中。
If (hiddenField.rawValue == 1)
this.fillColor = "255,0,0"
else
this.fillColor = "0,255,0"
对HTML表单进行数字签名 digitally-signing-html-forms
如果包含数字签名字段的HTML表单呈现为以下HTML转换之一,则无法对该表单进行签名:
- AHTML
- HTML4
- 静态HTML
- NoScriptXHTML
有关对文档进行数字签名的信息,请参阅数字签名和认证文档
呈现符合辅助功能准则的XHTML表单 rendering-an-accessibility-guidelines-compliant-xhtml-form
您可以渲染符合辅助功能准则的完整HTML表单。 也就是说,表单在完整HTML标签中呈现,而不是在body标签中呈现HTML表单(不是完整的HTML页面)。
验证表单数据 validating-form-data
在将表单渲染为HTML表单时,建议您限制对表单字段使用验证规则。 HTML表单可能不支持某些验证规则。 例如,当将MM-DD-YYYY验证模式应用于窗体设计中以HTML窗体呈现的Date/Time
字段时,即使正确键入了日期,该模式也无法正常工作。 但是,此验证模式可正确用于呈现为PDF的表单。
步骤摘要 summary-of-steps
要呈现HTML表单,请执行以下步骤:
- 包括项目文件。
- 创建Forms客户端API对象。
- 设置HTML运行时选项。
- 呈现HTML表单。
- 将表单数据流写入客户端Web浏览器。
包含项目文件
在开发项目中包含必要的文件。 如果要使用Java创建客户端应用程序,请包含必要的JAR文件。 如果使用Web服务,请确保包含代理文件。
创建Forms客户端API对象
您必须先创建表单数据集成服务客户端,然后才能以编程方式将数据导入PDF表单客户端API。 创建服务客户端时,您可以定义调用服务所需的连接设置。
设置HTML运行时选项
在渲染HTML表单时,您可以设置HTML运行时选项。 例如,您可以将工具栏添加到HTML表单,以使用户能够选择位于客户端计算机上的文件附件,或检索使用HTML表单呈现的文件附件。 默认情况下,HTML工具栏处于禁用状态。 要将工具栏添加到HTML表单,必须以编程方式设置运行时选项。 默认情况下,HTML工具栏由以下按钮组成:
Home
:提供指向应用程序Web根目录的链接。Upload
:提供用户界面,以选择要附加到当前表单的文件。Download
:提供用于显示附加文件的用户界面。
当HTML表单上出现HTML工具栏时,用户可以选择最多十个文件与表单数据一起提交。 提交文件后,Forms服务即可检索文件。
将表单渲染为HTML时,您可以指定用户代理值。 用户代理值提供浏览器和系统信息。 这是一个可选值,您可以传递空字符串值。 使用Java API快速入门呈现HTML表单展示了如何获取用户代理值并将其用于HTML呈现表单。
要发布表单数据的HTTP URL,可以通过使用Forms服务客户端API设置目标URL来指定,也可以在XDP表单设计中包含的提交按钮中指定。 如果在表单设计中指定了目标URL,请不要使用Forms服务客户端API设置值。
呈现HTML表单
要呈现HTML表单,请指定在Designer中创建并另存为XDP文件的表单设计。 选择HTML转换类型。 例如,您可以指定用于呈现Internet Explorer 5.0或更高版本的动态HTML的HTML转换类型。
呈现HTML表单还需要值,例如呈现其他表单类型所需的URI值。
将表单数据流写入客户端Web浏览器
当Forms服务渲染HTML表单时,它会返回一个您必须写入客户端Web浏览器的表单数据流。 在写入客户端Web浏览器时,HTML表单对用户可见。
另请参阅
使用Java API将表单渲染为HTML render-a-form-as-html-using-the-java-api
使用Forms API (Java)渲染HTML表单:
-
包含项目文件
在Java项目的类路径中包含客户端JAR文件,例如adobe-forms-client.jar。
-
创建Forms客户端API对象
- 创建包含连接属性的
ServiceClientFactory
对象。 - 使用构造函数创建
FormsServiceClient
对象并传递ServiceClientFactory
对象。
- 创建包含连接属性的
-
设置HTML运行时选项
- 使用构造函数创建
HTMLRenderSpec
对象。 - 若要使用工具栏呈现HTML表单,请调用
HTMLRenderSpec
对象的setHTMLToolbar
方法并传递HTMLToolbar
枚举值。 例如,要显示垂直HTML工具栏,请传递HTMLToolbar.Vertical
。 - 要设置HTML表单的区域设置值,请调用
HTMLRenderSpec
对象的setLocale
方法,并传递一个指定区域设置值的字符串值。 (这是可选设置。) - 若要在完整HTML标记中呈现HTML表单,请调用
HTMLRenderSpec
对象的setOutputType
方法并传递OutputType.FullHTMLTags
。 (这是可选设置。)
note note NOTE 当 StandAlone
选项为true
且ApplicationWebRoot
引用的Forms服务器不是承载AEM Forms的J2EE应用程序服务器时,在HTML中无法成功呈现(ApplicationWebRoot
值是使用传递给FormsServiceClient
对象的(Deprecated) renderHTMLForm
方法的URLSpec
对象指定的)。 如果ApplicationWebRoot
是来自托管AEM Forms的服务器,则管理控制台中的Web根URI值需要设置为表单的Web应用程序URI值。 可以通过登录到管理控制台,单击服务> Forms,并将Web根URI设置为https://server-name:port/FormServer来完成此操作。 然后,保存您的设置。 - 使用构造函数创建
-
呈现HTML表单
调用
FormsServiceClient
对象的(Deprecated) renderHTMLForm
方法并传递以下值:- 一个字符串值,它指定窗体设计名称,包括文件扩展名。 如果您引用的表单设计是Forms应用程序的一部分,请确保指定完整路径,如
Applications/FormsApplication/1.0/FormsFolder/Loan.xdp
。 - 指定HTML首选项类型的
TransformTo
枚举值。 例如,要渲染与Internet Explorer 5.0或更高版本的动态HTML兼容的HTML表单,请指定TransformTo.MSDHTML
。 - 包含要与表单合并的数据的
com.adobe.idp.Document
对象。 如果不想合并数据,请传递一个空的com.adobe.idp.Document
对象。 - 存储HTML运行时选项的
HTMLRenderSpec
对象。 - 指定
HTTP_USER_AGENT
标头值的字符串值;例如,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
。 - 一个
URLSpec
对象,用于存储呈现HTML表单所需的URI值。 - 存储文件附件的
java.util.HashMap
对象。 这是一个可选参数,如果您不想将文件附加到表单,则可以指定null
。
(Deprecated) renderHTMLForm
方法返回的FormsResult
对象包含可以写入客户端Web浏览器的表单数据流。 - 一个字符串值,它指定窗体设计名称,包括文件扩展名。 如果您引用的表单设计是Forms应用程序的一部分,请确保指定完整路径,如
-
将表单数据流写入客户端Web浏览器
- 通过调用
FormsResult
对象的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将表单渲染为HTML render-a-form-as-html-using-the-web-service-api
使用Forms API(Web服务)渲染HTML表单:
-
包含项目文件
- 创建使用Forms服务WSDL的Java代理类。
- 将Java代理类包含在类路径中。
-
创建Forms客户端API对象
创建
FormsService
对象并设置身份验证值。 -
设置HTML运行时选项
- 使用构造函数创建
HTMLRenderSpec
对象。 - 若要使用工具栏呈现HTML表单,请调用
HTMLRenderSpec
对象的setHTMLToolbar
方法并传递HTMLToolbar
枚举值。 例如,要显示垂直HTML工具栏,请传递HTMLToolbar.Vertical
。 - 要设置HTML表单的区域设置值,请调用
HTMLRenderSpec
对象的setLocale
方法,并传递一个指定区域设置值的字符串值。 有关详细信息,请参阅AEM Forms API引用。 - 若要在完整HTML标记中呈现HTML表单,请调用
HTMLRenderSpec
对象的setOutputType
方法并传递OutputType.FullHTMLTags
。
note note NOTE 当 StandAlone
选项为true
且ApplicationWebRoot
引用的Forms服务器不是承载AEM Forms的J2EE应用程序服务器时,在HTML中无法成功呈现(ApplicationWebRoot
值是使用传递给FormsServiceClient
对象的(Deprecated) renderHTMLForm
方法的URLSpec
对象指定的)。 如果ApplicationWebRoot
是来自托管AEM Forms的服务器,则管理控制台中的Web根URI值需要设置为表单的Web应用程序URI值。 可以通过登录到管理控制台,单击服务> Forms,并将Web根URI设置为https://server-name:port/FormServer来完成此操作。 然后,保存您的设置。 - 使用构造函数创建
-
呈现HTML表单
调用
FormsService
对象的(Deprecated) renderHTMLForm
方法并传递以下值:- 一个字符串值,它指定窗体设计名称,包括文件扩展名。 如果您引用的表单设计是Forms应用程序的一部分,请确保指定完整路径,如
Applications/FormsApplication/1.0/FormsFolder/Loan.xdp
。 - 指定HTML首选项类型的
TransformTo
枚举值。 例如,要渲染与Internet Explorer 5.0或更高版本的动态HTML兼容的HTML表单,请指定TransformTo.MSDHTML
。 - 包含要与表单合并的数据的
BLOB
对象。 如果不想合并数据,请传递null
。 (请参阅使用可流动布局预填充Forms。) - 存储HTML运行时选项的
HTMLRenderSpec
对象。 - 指定
HTTP_USER_AGENT
标头值的字符串值;例如,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
。 如果您不想设置此值,则可以传递空字符串。 - 一个
URLSpec
对象,用于存储呈现HTML表单所需的URI值。 (请参阅指定URI值。) - 存储文件附件的
java.util.HashMap
对象。 这是一个可选参数,如果您不想将文件附加到表单,则可以指定null
。 (请参阅将文件附加到表单。) - 方法填充的空
com.adobe.idp.services.holders.BLOBHolder
对象。 此参数值存储渲染的表单。 - 方法填充的空
com.adobe.idp.services.holders.BLOBHolder
对象。 此参数将存储输出XML数据。 - 方法填充的空
javax.xml.rpc.holders.LongHolder
对象。 此参数将存储表单中的页数。 - 方法填充的空
javax.xml.rpc.holders.StringHolder
对象。 此参数将存储区域设置值。 - 方法填充的空
javax.xml.rpc.holders.StringHolder
对象。 此参数将存储使用的HTML渲染值。 - 将包含此操作结果的空
com.adobe.idp.services.holders.FormsResultHolder
对象。
(Deprecated) renderHTMLForm
方法使用必须写入客户端Web浏览器的表单数据流填充作为最后一个参数值传递的com.adobe.idp.services.holders.FormsResultHolder
对象。 - 一个字符串值,它指定窗体设计名称,包括文件扩展名。 如果您引用的表单设计是Forms应用程序的一部分,请确保指定完整路径,如
-
将表单数据流写入客户端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
方法。
- 通过获取
另请参阅