將Forms轉譯為HTML
- 適用對象:
- Experience Manager 6.5
建立對象:
- 開發人員
本檔案中的範例和範例僅適用於JEE環境上的AEM Forms。
Forms服務會根據網頁瀏覽器的HTTP要求,將表單轉譯為HTML。 將表單轉譯為HTML的好處是,使用者端網頁瀏覽器所在的電腦不需要Adobe Reader、Acrobat或Flash Player (適用於表單指南(已棄用))。
若要將表單轉譯為HTML,表單設計必須儲存為XDP檔案。 儲存為PDF檔案的表單設計無法呈現為HTML。 在Designer中開發將轉譯為HTML的表單設計時,請考慮下列條件:
- 請勿使用物件的邊框屬性在表單上繪製線條、方框或格點。 有些瀏覽器可能不會將邊框依照在預覽中顯示的樣式完全對齊。 物件可能會呈現圖層狀,或可能將其他物件推離其預期位置。
- 您可以使用直線、矩形和圓來定義背景。
- Draw文字稍微大於容納文字所需的大小。 有些網頁瀏覽器無法清楚顯示文字。
FormServiceClient
物件的(Deprecated) renderHTMLForm
和renderHTMLForm2
方法呈現包含TIFF影像的表單時,TIFF影像不會顯示在Internet Explorer或Mozilla Firefox瀏覽器中顯示的已呈現HTML表單中。 這些瀏覽器不提供TIFF影像的原生支援。HTML頁面
當表單設計呈現為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服務將表單轉譯回使用者端裝置(通常為網頁瀏覽器)。
.fsc-ds-ssb
:此樣式表適用於有空白符號欄位的情況。
.fsc-ds-ssv
:此樣式表適用於有有效符號欄位的情況。
.fsc-ds-ssc
:此樣式表適用於有有效符號欄位但資料已變更的情況。
.fsc-ds-ssi
:此樣式表適用於有無效符號欄位的情況。
.fsc-ds-popup-bg
:未使用此樣式表屬性。
。fsc-ds-popup-btn
:未使用此樣式表屬性。
執行指令碼
表單作者會指定指令碼是在伺服器上還是在使用者端上執行。 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並顯示新頁面。
建議您不要將指令碼變數和表單欄位命名為相同的名稱,例如專案。 有些網頁瀏覽器(例如Internet Explorer)可能無法初始化與表單欄位同名的變數,進而造成指令碼錯誤。 建議您將表單欄位和指令碼變數命名為不同名稱。
在轉譯同時包含頁面導覽功能和表單指令碼的HTML表單時(例如,假設指令碼在每次轉譯表單時都會從資料庫擷取欄位資料),請確保表單指令碼採用form:calculate event格式,而不是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子集
建立要呈現為HTML的表單設計時,您必須將指令碼限製為JavaScript語言中指令碼的XFA子集。
在使用者端上執行或在使用者端和伺服器上執行的指令碼必須寫入XFA子集中。 在伺服器上執行的指令碼可以使用完整的XFA指令碼模型,也可以使用FormCalc。 如需使用JavaScript的相關資訊,請參閱Forms Designer。
在使用者端上執行指令碼時,只有目前顯示的面板可以使用指令碼;例如,當面板B顯示時,您無法對面板A中的欄位執行指令碼。 在伺服器上執行指令碼時,可以存取所有面板。
在使用者端執行的指令碼中使用指令碼物件模型(SOM)運算式時,請務必小心。 在使用者端執行的指令碼僅支援SOM運算式的簡化子集。
事件計時
XFA子集會定義對應至HTML事件的XFA事件。 計算及驗證事件的時間在行為上稍有不同。 在網頁瀏覽器中,當您退出欄位時會執行完整計算事件。 當您變更欄位值時,計算事件不會自動執行。 您可以呼叫xfa.form.execCalculate
方法來強制計算事件。
在網頁瀏覽器中,驗證事件僅在退出欄位或提交表單時執行。 您可以使用xfa.form.execValidate
方法強制驗證事件。
在網頁瀏覽器中顯示的Forms (與Adobe Reader或Acrobat不同)符合XFA null測試(錯誤或警告)的強制欄位。
- 如果Null測試產生錯誤,而您結束欄位卻未指定值,則會顯示訊息方塊,而且您會在按一下「確定」後重新定位至欄位。
- 如果Null測試產生警告,而您結束欄位時未指定值,系統會提示您按一下「確定」或「取消」,讓您選擇繼續但不指定值或返回欄位以輸入值。
如需Null測試的詳細資訊,請參閱Forms Designer。
表單按鈕
按一下提交按鈕會將表單資料傳送至Forms服務,並代表表單處理的結尾。 可以將preSubmit
事件設定為在使用者端或伺服器上執行。 如果preSubmit
事件設定為在使用者端上執行,則會在表單提交之前執行。 否則,在提交表單期間,preSubmit
事件會在伺服器上執行。 如需preSubmit
事件的詳細資訊,請參閱Forms Designer。
如果按鈕沒有關聯的使用者端指令碼,則會將資料提交至伺服器,在伺服器上執行計算,並重新產生HTML表單。 如果按鈕包含使用者端指令碼,資料不會傳送至伺服器,而使用者端指令碼會在網頁瀏覽器中執行。
HTML4.0網頁瀏覽器
僅支援HTML4.0的網頁瀏覽器無法支援XFA子集使用者端指令碼模型。 建立可在HTML4.0和MSDHTML或CSS2HTML中運作的表單設計時,標籤為在使用者端執行的指令碼實際上將會在伺服器上執行。 例如,假設使用者按一下位於HTML4.0網頁瀏覽器中所顯示表單上的按鈕。 在此情況下,表單資料會傳送至執行使用者端指令碼的伺服器。
建議您將表單邏輯放置在計算事件中,這些計算事件會在HTML為4.0的伺服器上執行,以及在MSDHTML或CSS2HTML的使用者端上執行。
維護簡報變更
當您在HTML頁面(面板)之間移動時,只會維持資料的狀態。 不會維護背景顏色或強制欄位設定等設定(如果與初始設定不同)。 若要維持呈現狀態,您必須建立代表欄位呈現狀態的欄位(通常是隱藏的)。 如果您將指令碼新增到欄位的Calculate
事件,該事件會根據隱藏欄位值變更簡報,則當您在HTML頁面(面板)之間來回移動時,可以保留簡報狀態。
下列指令碼會根據hiddenField
的值維護欄位的fillColor
。 假設此指令碼位於欄位的Calculate
事件中。
If (hiddenField.rawValue == 1)
this.fillColor = "255,0,0"
else
this.fillColor = "0,255,0"
數位簽署HTML表單
如果表單呈現為下列HTML轉換之一,則您無法簽署包含數位簽名欄位的HTML表單:
- AHTML
- HTML4
- 靜態HTML
- NoScriptXHTML
如需以數位方式簽署檔案的詳細資訊,請參閱以數位方式簽署和認證檔案
呈現符合協助工具指南的XHTML表單
您可以呈現符合協助工具准則的完整HTML表單。 也就是說,表單會在完整HTML標籤中呈現,而不是在body標籤中呈現HTML表單(不是完整的HTML頁面)。
驗證表單資料
將表單轉譯為HTML表單時,建議您限制在表單欄位中使用驗證規則。 HTML表單可能不支援某些驗證規則。 例如,當將MM-DD-YYYY的驗證模式套用至表單設計中呈現為HTML表單的Date/Time
欄位時,即使正確輸入日期,該模式也無法正常運作。 不過,此驗證模式適用於轉譯為PDF的表單。
步驟摘要
若要呈現HTML表單,請執行下列步驟:
- 包含專案檔案。
- 建立Forms使用者端API物件。
- 設定HTML執行階段選項。
- 呈現HTML表單。
- 將表單資料流寫入使用者端網頁瀏覽器。
包含專案檔
將必要的檔案納入您的開發專案中。 如果您使用Java建立使用者端應用程式,請包含必要的JAR檔案。 如果您使用Web服務,請確定您包含Proxy檔案。
建立Forms使用者端API物件
您必須先建立表單資料整合服務使用者端,才能以程式設計方式將資料匯入PDFformClient API。 建立服務使用者端時,您可以定義呼叫服務所需的連線設定。
設定HTML執行階段選項
呈現HTML表單時,您可以設定HTML執行階段選項。 例如,您可以將工具列新增至HTML表單,讓使用者能夠選取位於使用者端電腦上的檔案附件,或擷取以HTML表單呈現的檔案附件。 HTML工具列預設為停用。 若要將工具列新增至HTML表單,您必須以程式設計方式設定執行階段選項。 依預設,HTML工具列包含下列按鈕:
Home
:提供應用程式Web根目錄的連結。Upload
:提供使用者介面以選取要附加至目前表單的檔案。Download
:提供顯示附加檔案的使用者介面。
當HTML表單上出現HTML工具列時,使用者可以選擇最多10個要與表單資料一起提交的檔案。 提交檔案後,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值。
將表單資料流寫入使用者端網頁瀏覽器
Forms服務轉譯HTML表單時,會傳回您必須寫入使用者端網頁瀏覽器的表單資料流。 寫入使用者端網頁瀏覽器時,使用者可看到HTML表單。
另請參閱
使用Java API將表單轉譯為HTML
使用Forms API (Java)轉譯HTML表單:
-
包含專案檔案
在您的Java專案的類別路徑中包含使用者端JAR檔案,例如adobe-forms-client.jar。
-
建立Forms使用者端API物件
- 建立包含連線屬性的
ServiceClientFactory
物件。 - 使用它的建構函式並傳遞
ServiceClientFactory
物件來建立FormsServiceClient
物件。
- 建立包含連線屬性的
-
設定HTML執行階段選項
- 使用物件的建構函式建立
HTMLRenderSpec
物件。 - 若要使用工具列轉譯HTML表單,請叫用
HTMLRenderSpec
物件的setHTMLToolbar
方法,並傳遞HTMLToolbar
列舉值。 例如,若要顯示垂直HTML工具列,請傳遞HTMLToolbar.Vertical
。 - 若要設定HTML表單的地區設定值,請叫用
HTMLRenderSpec
物件的setLocale
方法,並傳遞指定地區設定值的字串值。 (此為選用設定。) - 若要在完整HTML標籤中轉譯HTML表單,請叫用
HTMLRenderSpec
物件的setOutputType
方法並傳遞OutputType.FullHTMLTags
。 (此為選用設定。)
NOTE
當StandAlone
選項為true
且ApplicationWebRoot
參考到裝載Forms的J2EE應用程式伺服器以外的伺服器時,AEM Forms無法成功在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)
。 - 儲存轉譯HTML表單所需URI值的
URLSpec
物件。 - 儲存檔案附件的
java.util.HashMap
物件。 這是選用引數,如果您不想將檔案附加至表單,可以指定null
。
(Deprecated) renderHTMLForm
方法傳回FormsResult
物件,其中包含可寫入使用者端網頁瀏覽器的表單資料流。 - 字串值,指定表單設計名稱,包括副檔名。 如果您參照的表單設計屬於Forms應用程式的一部分,請確定您指定完整路徑,例如
-
將表單資料流寫入使用者端網頁瀏覽器
- 呼叫
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
方法,建立用來將表單資料流寫入使用者端網頁瀏覽器的javax.servlet.ServletOutputStream
物件。 - 呼叫
com.adobe.idp.Document
物件的getInputStream
方法,以建立java.io.InputStream
物件。 - 呼叫
InputStream
物件的read
方法,並將位元組陣列作為引數傳遞,以建立位元組陣列並以表單資料串流填入。 - 叫用
javax.servlet.ServletOutputStream
物件的write
方法,將表單資料流傳送至使用者端網頁瀏覽器。 將位元組陣列傳遞至write
方法。
- 呼叫
使用網站服務API將表單轉譯為HTML
使用Forms API (Web服務)轉譯HTML表單:
-
包含專案檔案
- 建立使用Forms服務WSDL的Java Proxy類別。
- 將Java Proxy類別納入您的類別路徑中。
-
建立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
當StandAlone
選項為true
且ApplicationWebRoot
參考到裝載Forms的J2EE應用程式伺服器以外的伺服器時,AEM Forms無法成功在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)
。 如果您不想設定此值,可以傳遞空字串。 - 儲存轉譯HTML表單所需URI值的
URLSpec
物件。 (請參閱指定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
方法會將必須寫入使用者端網頁瀏覽器的表單資料流,填入作為最後一個引數值傳遞的com.adobe.idp.services.holders.FormsResultHolder
物件。 - 字串值,指定表單設計名稱,包括副檔名。 如果您參照的表單設計屬於Forms應用程式的一部分,請確定您指定完整路徑,例如
-
將表單資料流寫入使用者端網頁瀏覽器
- 取得
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
物件。 - 建立位元組陣列,並透過叫用
BLOB
物件的getBinaryData
方法來填入該陣列。 此工作會將FormsResult
物件的內容指派給位元組陣列。 - 叫用
javax.servlet.http.HttpServletResponse
物件的write
方法,將表單資料流傳送至使用者端網頁瀏覽器。 將位元組陣列傳遞至write
方法。
- 取得