使用可流式配置預填Forms

使用可流式配置預填Forms

預先填入的表單會向呈現表單中的使用者顯示資料。 例如,假設使用者以使用者名稱和密碼登入網站。 如果驗證成功,則客戶端應用程式查詢資料庫以獲取用戶資訊。 資料會合併到表單中,然後將表單轉譯給使用者。 因此,使用者能夠檢視表單中的個人化資料。

預填表單具有以下優點:

  • 讓使用者可在表單中檢視自訂資料。
  • 減少輸入使用者以填入表單的量。
  • 通過控制資料的放置位置,確保資料完整性。

以下兩個XML資料來源可以預先填入表單:

  • XDP資料來源,是符合XFA語法的XML(或XFDF資料,以預先填入使用Acrobat建立的表單)。
  • 任意XML資料源,包含與表單欄位名稱匹配的名稱/值對(本節中的示例使用任意XML資料源)。

您要預先填入的每個表單欄位都必須有XML元素。 XML元素名稱必須與欄位名稱相符。 如果XML元素與表單欄位不對應,或XML元素名稱與欄位名稱不匹配,則會忽略該元素。 只要指定了所有XML元素,就不需要匹配XML元素的顯示順序。

預先填入已包含資料的表單時,必須指定已顯示在XML資料來源中的資料。 假設一個包含10個欄位的表單有4個欄位中的資料。 接下來,假設您要預填其餘六個欄位。 在此情況下,您必須在用於預填表單的XML資料來源中指定10個XML元素。 如果僅指定六個元素,則原始的四個欄位為空。

例如,您可以預先填入表單,例如範例確認表單。 (請參閱呈現互動式PDF forms中的「確認表單」。)

要預填示例確認表單,必須建立一個XML資料源,該資料源包含三個與表單中的三個欄位匹配的XML元素。 此表單包含下列三個欄位:FirstNameLastNameAmount。 第一步是建立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

使用者從網頁型線上商店購買項目。

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設定為Yes。 如需RenderAtClient選項的相關資訊,請參閱在用戶端上呈現Forms🔗

注意

如需Forms服務的詳細資訊,請參閱AEM Forms的服務參考

步驟的摘要

要使用可流式佈局預填表單,請執行以下任務:

  1. 包含專案檔案。
  2. 建立記憶體內XML資料源。
  3. 轉換XML資料源。
  4. 呈現預先填入的表單。

包含項目檔案

在您的開發專案中加入必要的檔案。 如果要使用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資料來源)來預先填入表單。

另請參閱

包含AEM Forms Java程式庫檔案

設定連接屬性

Forms服務API快速入門

轉譯互動式PDF forms

建立可轉譯Forms的網頁應用程式

使用Java API預填表單

若要使用Forms API(Java)以可流式版面預先填入表單,請執行下列步驟:

  1. 包含項目檔案

    在Java專案的類別路徑中加入用戶端JAR檔案,例如adobe-forms-client.jar。 有關這些檔案的位置資訊,請參閱包含AEM Forms Java庫檔案

  2. 建立記憶體內XML資料源

    • 通過調用DocumentBuilderFactorynewInstance方法建立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元素附加到詳細資訊元素:txtDescriptionnumQtynumUnitPrice

    • 對用於預先填入表單的所有資料項目,重複最後兩個子步驟。

  3. 轉換XML資料源

    • 調用javax.xml.transform.Transformer對象的靜態newInstance方法,建立javax.xml.transform.Transformer對象。
    • 調用TransformerFactory對象的newTransformer方法,建立Transformer對象。
    • 使用其建構子建立ByteArrayOutputStream物件。
    • 使用其建構子並傳遞在步驟1中建立的org.w3c.dom.Document物件,以建立javax.xml.transform.dom.DOMSource物件。
    • 使用其建構子並傳遞ByteArrayOutputStream物件,以建立javax.xml.transform.dom.DOMSource物件。
    • 調用javax.xml.transform.Transformer對象的transform方法並傳遞javax.xml.transform.dom.DOMSourcejavax.xml.transform.stream.StreamResult對象,以填充Java ByteArrayOutputStream對象。
    • 建立位元組陣列,並將ByteArrayOutputStream對象的大小分配給位元組陣列。
    • 叫用ByteArrayOutputStream物件的toByteArray方法,填入位元組陣列。
    • 使用其建構子並傳遞位元組陣列,建立com.adobe.idp.Document物件。
  4. 呈現預先填入的表單

    調用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

包含AEM Forms Java程式庫檔案

設定連接屬性

使用網站服務API預填表單

若要使用Forms API(網站服務),以可流動的版面預先填入表單,請執行下列步驟:

  1. 包含項目檔案

    • 建立使用Forms服務WSDL的Java代理類。 (請參閱使用Apache Axis建立Java代理類。)
    • 將Java代理類包含到類路徑中。
  2. 建立記憶體內XML資料源

    • 通過調用DocumentBuilderFactorynewInstance方法建立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元素附加到詳細資訊元素:txtDescriptionnumQtynumUnitPrice

    • 對用於預先填入表單的所有資料項目,重複最後兩個子步驟。

  3. 轉換XML資料源

    • 調用javax.xml.transform.Transformer對象的靜態newInstance方法,建立javax.xml.transform.Transformer對象。
    • 調用TransformerFactory對象的newTransformer方法,建立Transformer對象。
    • 使用其建構子建立ByteArrayOutputStream物件。
    • 使用其建構子並傳遞在步驟1中建立的org.w3c.dom.Document物件,以建立javax.xml.transform.dom.DOMSource物件。
    • 使用其建構子並傳遞ByteArrayOutputStream物件,以建立javax.xml.transform.dom.DOMSource物件。
    • 調用javax.xml.transform.Transformer對象的transform方法並傳遞javax.xml.transform.dom.DOMSourcejavax.xml.transform.stream.StreamResult對象,以填充Java ByteArrayOutputStream對象。
    • 建立位元組陣列,並將ByteArrayOutputStream對象的大小分配給位元組陣列。
    • 叫用ByteArrayOutputStream物件的toByteArray方法,填入位元組陣列。
    • 使用其建構子建立BLOB物件,並叫用其setBinaryData方法並傳遞位元組陣列。
  4. 呈現預先填入的表單

    調用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物件。

另請參閱

使用Base64編碼叫用AEM Forms

本頁內容