預先填入的表單會向呈現表單中的使用者顯示資料。 例如,假設使用者以使用者名稱和密碼登入網站。 如果驗證成功,則客戶端應用程式查詢資料庫以獲取用戶資訊。 資料會合併到表單中,然後將表單轉譯給使用者。 因此,使用者能夠檢視表單中的個人化資料。
預填表單具有以下優點:
以下兩個XML資料來源可以預先填入表單:
您要預先填入的每個表單欄位都必須有XML元素。 XML元素名稱必須與欄位名稱相符。 如果XML元素與表單欄位不對應,或XML元素名稱與欄位名稱不匹配,則會忽略該元素。 只要指定了所有XML元素,就不需要匹配XML元素的顯示順序。
預先填入已包含資料的表單時,必須指定已顯示在XML資料來源中的資料。 假設一個包含10個欄位的表單有4個欄位中的資料。 接下來,假設您要預填其餘六個欄位。 在此情況下,您必須在用於預填表單的XML資料來源中指定10個XML元素。 如果僅指定六個元素,則原始的四個欄位為空。
例如,您可以預先填入表單,例如範例確認表單。 (請參閱呈現互動式PDF forms中的「確認表單」。)
要預填示例確認表單,必須建立一個XML資料源,該資料源包含三個與表單中的三個欄位匹配的XML元素。 此表單包含下列三個欄位:FirstName
、LastName
和Amount
。 第一步是建立XML資料源,該資料源包含與表單設計中的欄位匹配的XML元素。 下一步是將資料值分配給XML元素,如以下XML代碼所示。
<Untitled>
<FirstName>Jerry</FirstName>
<LastName>Johnson</LastName>
<Amount>250000</Amount>
</Untitled>
使用此XML資料源預填確認表單,然後呈現表單後,將顯示分配給XML元素的資料值,如下圖所示。
具有可流動配置的Forms對於向使用者顯示數量不定的資料非常有用。 由於表單的版面會自動調整為合併的資料量,因此您不需要預先決定表單的固定版面或頁面數,因為您需要處理具有固定版面的表單。
表單通常會填入在執行階段取得的資料。 因此,您可以建立記憶體內XML資料源,並將資料直接放入記憶體內XML資料源中,以預填表單。
考慮基於Web的應用程式,例如線上商店。 線上購物者完成購買項目後,所有購買項目都會放入記憶體內XML資料來源中,以用於預先填入表單。 下圖顯示了此過程,詳見圖後的表格。
下表說明此圖中的步驟。
步驟 |
說明 |
---|---|
1 |
使用者從網頁型線上商店購買項目。 |
2 |
當使用者完成購買項目並按一下「提交」按鈕後,就會建立記憶體內的XML資料來源。 購買的項目和用戶資訊將放入記憶體中的XML資料源中。 |
3 |
XML資料源用於預填採購訂單表單(下表顯示了此表單的示例)。 |
4 |
採購訂單表單將呈現給客戶端Web瀏覽器。 |
下圖顯示採購訂單表單的示例。 表中的資訊可以根據XML資料中的記錄數進行調整。
表單可以預先填入來自其他來源的資料,例如企業資料庫或外部應用程式。
具有可流動版面的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
子表單包含下列欄位:
如果嘗試用包含重複XML元素的資料源預填表單,並將RenderAtClient
選項設定為No
,則只有第一個資料記錄會合併到表單中。 為確保所有資料記錄都合併到表單中,請將RenderAtClient
設定為Yes
。 如需RenderAtClient
選項的相關資訊,請參閱在用戶端上呈現Forms🔗 。
如需Forms服務的詳細資訊,請參閱AEM Forms的服務參考。
要使用可流式佈局預填表單,請執行以下任務:
包含項目檔案
在您的開發專案中加入必要的檔案。 如果要使用Java建立客戶端應用程式,請包括必要的JAR檔案。 如果您使用Web服務,請確定您包含Proxy檔案。
包含項目檔案
在您的開發專案中加入必要的檔案。 如果要使用Java建立客戶端應用程式,請包括必要的JAR檔案。 如果您使用Web服務,請確定您包含Proxy檔案。
建立記憶體內XML資料源
您可以使用org.w3c.dom
類建立記憶體內XML資料源,以預填具有可流式佈局的表單。 必須將資料放入符合窗體的XML資料源中。 有關具有可流式佈局的表單與XML資料源之間關係的資訊,請參閱了解資料子組。
轉換XML資料源
使用org.w3c.dom
類建立的記憶體內XML資料源可以先轉換為com.adobe.idp.Document
對象,然後才能用它預填表單。 記憶體中的XML資料源可以使用Java XML轉換類進行轉換。
如果您使用Forms服務的WSDL來預填表單,必須將org.w3c.dom.Document
物件轉換為BLOB
物件。
呈現預先填入的表單
您會呈現預先填入的表單,就像其他表單一樣。 唯一的差別是您使用com.adobe.idp.Document
物件(其中包含XML資料來源)來預先填入表單。
另請參閱
若要使用Forms API(Java)以可流式版面預先填入表單,請執行下列步驟:
包含項目檔案
在Java專案的類別路徑中加入用戶端JAR檔案,例如adobe-forms-client.jar。 有關這些檔案的位置資訊,請參閱包含AEM Forms Java庫檔案。
建立記憶體內XML資料源
通過調用DocumentBuilderFactory
類newInstance
方法建立Java DocumentBuilderFactory
對象。
通過調用DocumentBuilderFactory
對象的newDocumentBuilder
方法建立Java DocumentBuilder
對象。
呼叫DocumentBuilder
物件的newDocument
方法以實例化org.w3c.dom.Document
物件。
調用org.w3c.dom.Document
對象的createElement
方法,建立XML資料源的根元素。 這會建立代表根元素的Element
物件。 將代表元素名稱的字串值傳遞至createElement
方法。 將傳回值轉換為Element
。 接下來,通過調用Document
對象的appendChild
方法將根元素附加到文檔,並將根元素對象作為參數傳遞。 以下幾行代碼顯示此應用程式邏輯:
Element root = (Element)document.createElement("transaction"); document.appendChild(root);
呼叫Document
物件的createElement
方法,以建立XML資料來源的標題元素。 將代表元素名稱的字串值傳遞至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
方法,以建立XML資料來源的詳細資料元素。 將代表元素名稱的字串值傳遞至createElement
方法。 將傳回值轉換為Element
。 接下來,呼叫root
物件的appendChild
方法,將詳細資料元素附加至根元素,並將詳細資料元素物件傳入為引數。 附加到詳細元素的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
、numQty
和numUnitPrice
。
對用於預先填入表單的所有資料項目,重複最後兩個子步驟。
轉換XML資料源
javax.xml.transform.Transformer
對象的靜態newInstance
方法,建立javax.xml.transform.Transformer
對象。TransformerFactory
對象的newTransformer
方法,建立Transformer
對象。ByteArrayOutputStream
物件。org.w3c.dom.Document
物件,以建立javax.xml.transform.dom.DOMSource
物件。ByteArrayOutputStream
物件,以建立javax.xml.transform.dom.DOMSource
物件。javax.xml.transform.Transformer
對象的transform
方法並傳遞javax.xml.transform.dom.DOMSource
和javax.xml.transform.stream.StreamResult
對象,以填充Java ByteArrayOutputStream
對象。ByteArrayOutputStream
對象的大小分配給位元組陣列。ByteArrayOutputStream
物件的toByteArray
方法,填入位元組陣列。com.adobe.idp.Document
物件。呈現預先填入的表單
調用FormsServiceClient
對象的renderPDFForm
方法並傳遞以下值:
com.adobe.idp.Document
物件,包含要與表單合併的資料。 請確定您使用步驟一和步驟二中建立的com.adobe.idp.Document
物件。PDFFormRenderSpec
對象。URLSpec
物件,包含Forms服務所需的URI值。java.util.HashMap
對象。 這是可選參數,如果不想將檔案附加到表單,可以指定null
。renderPDFForm
方法返回一個FormsResult
對象,該對象包含必須寫入客戶端Web瀏覽器的表單資料流。
javax.servlet.ServletOutputStream
物件,用於將表單資料流傳送至用戶端網頁瀏覽器。FormsResult
對象s getOutputContent
方法,建立com.adobe.idp.Document
對象。com.adobe.idp.Document
對象的getInputStream
方法,建立java.io.InputStream
對象。InputStream
物件的read
方法並將位元組陣列傳遞為引數,以填入表單資料流的位元組陣列。javax.servlet.ServletOutputStream
對象的write
方法,將表單資料流發送到客戶端Web瀏覽器。 將位元組陣列傳遞至write
方法。另請參閱
快速入門(SOAP模式):使用Java API以可流式配置預填Forms
若要使用Forms API(網站服務),以可流動的版面預先填入表單,請執行下列步驟:
包含項目檔案
建立記憶體內XML資料源
通過調用DocumentBuilderFactory
類newInstance
方法建立Java DocumentBuilderFactory
對象。
通過調用DocumentBuilderFactory
對象的newDocumentBuilder
方法建立Java DocumentBuilder
對象。
呼叫DocumentBuilder
物件的newDocument
方法以實例化org.w3c.dom.Document
物件。
調用org.w3c.dom.Document
對象的createElement
方法,建立XML資料源的根元素。 這會建立代表根元素的Element
物件。 將代表元素名稱的字串值傳遞至createElement
方法。 將傳回值轉換為Element
。 接下來,通過調用Document
對象的appendChild
方法將根元素附加到文檔,並將根元素對象作為參數傳遞。 下列幾行程式碼會顯示此應用程式邏輯:
Element root = (Element)document.createElement("transaction"); document.appendChild(root);
呼叫Document
物件的createElement
方法,以建立XML資料來源的標題元素。 將代表元素名稱的字串值傳遞至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
方法,以建立XML資料來源的詳細資料元素。 將代表元素名稱的字串值傳遞至createElement
方法。 將傳回值轉換為Element
。 接下來,呼叫root
物件的appendChild
方法,將詳細資料元素附加至根元素,並將詳細資料元素物件傳入為引數。 附加到詳細元素的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
、numQty
和numUnitPrice
。
對用於預先填入表單的所有資料項目,重複最後兩個子步驟。
轉換XML資料源
javax.xml.transform.Transformer
對象的靜態newInstance
方法,建立javax.xml.transform.Transformer
對象。TransformerFactory
對象的newTransformer
方法,建立Transformer
對象。ByteArrayOutputStream
物件。org.w3c.dom.Document
物件,以建立javax.xml.transform.dom.DOMSource
物件。ByteArrayOutputStream
物件,以建立javax.xml.transform.dom.DOMSource
物件。javax.xml.transform.Transformer
對象的transform
方法並傳遞javax.xml.transform.dom.DOMSource
和javax.xml.transform.stream.StreamResult
對象,以填充Java ByteArrayOutputStream
對象。ByteArrayOutputStream
對象的大小分配給位元組陣列。ByteArrayOutputStream
物件的toByteArray
方法,填入位元組陣列。BLOB
物件,並叫用其setBinaryData
方法並傳遞位元組陣列。呈現預先填入的表單
調用FormsService
對象的renderPDFForm
方法並傳遞以下值:
BLOB
物件,包含要與表單合併的資料。 請確定您使用步驟一和步驟二建立的BLOB
物件。PDFFormRenderSpecc
對象。 如需詳細資訊,請參閱AEM Forms API參考。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
方法會以必須寫入用戶端網頁瀏覽器的表單資料流填入作為最後一個引數值傳遞的com.adobe.idp.services.holders.FormsResultHolder
物件。
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
方法。renderPDFForm
方法會以必須寫入用戶端網頁瀏覽器的表單資料流填入作為最後一個引數值傳遞的com.adobe.idp.services.holders.FormsResultHolder
物件。
另請參閱