使用可流程配置預先填入Forms prepopulating-forms-with-flowable-layouts1

使用可流程配置預先填入Forms prepopulating-forms-with-flowable-layouts2

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

預先填入表單具有以下優點:

  • 讓使用者能在表單中檢視自訂資料。
  • 減少使用者在表單中輸入的次數。
  • 控制資料放置的位置,確保資料完整性。

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

  • XDP資料來源是符合XFA語法的XML (或是預先填入使用Acrobat建立的表單的XFDF資料)。
  • 任意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

使用可流動版面配置預先填入表單 prepopulating_forms_with_flowable_layouts-1

具有可流動版面的Forms對於向使用者顯示未確定的資料量很有用。 由於表單的版面配置會自動調整為符合合併的資料量,因此您不需要像處理具有固定版面的表單那樣預先決定表單的固定版面配置或頁數。

表單通常會填入執行階段取得的資料。 因此,您可以建立記憶體內XML資料來源,並將資料直接放入記憶體內XML資料來源,預先填入表單。

考慮使用網路型應用程式,例如線上商店。 線上購物者完成購買專案後,所有購買的專案都會放入記憶體中XML資料來源,用於預先填入表單。 下圖顯示此程式,圖後的表格對此程式進行了說明。

pf_pf_finsrv_webapp_v1

下表說明此圖表中的步驟。

步驟
說明
1
使用者從網路型線上商店購買專案。
2
使用者完成採購料號並按一下「提交」按鈕後,即會建立記憶體中的XML資料來源。 購買的專案和使用者資訊會放入記憶體中的XML資料來源中。
3
XML資料來源可用來預先填入採購單表單(此表單的範例顯示於此表格下方)。
4
採購單表單會呈現給使用者端網頁瀏覽器。

下圖顯示採購單表單的範例。 表格中的資訊可以調整為XML資料中的記錄數。

pf_pf_poform

NOTE
表單可以預先填入來自其他來源(例如企業資料庫或外部應用程式)的資料。

表單設計考量事項 form-design-considerations

具有可流動版面的Forms是根據在Designer中建立的表單設計。 表單設計會指定一組配置、顯示和資料擷取規則,包括根據使用者輸入計算值。 將資料輸入表單時會套用規則。 新增至表單的欄位是表單設計內的子表單。 例如,在上圖所示的採購單表單中,每一行都是子表單。 如需建立包含子表單的表單設計相關資訊,請參閱建立具有流程配置之採購單表單

瞭解資料子群組 understanding-data-subgroups

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
NOTE
如果您嘗試使用包含重複XML元素的資料來源預先填入表單,並且將RenderAtClient選項設定為No,則只有第一個資料記錄會合併到表單中。 為確保所有資料記錄都合併到表單中,請將RenderAtClient設定為Yes。 如需RenderAtClient選項的詳細資訊,請參閱在使用者端轉譯Forms
NOTE
如需Forms服務的詳細資訊,請參閱AEM Forms服務參考

步驟摘要 summary-of-steps

若要以可流動版面配置預先填入表單,請執行下列工作:

  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物件,然後才可用來預先填入表單。 您可以使用Java XML轉換類別來轉換記憶體中的XML資料來源。

NOTE
如果您使用Forms服務的WSDL預先填入表單,您必須將org.w3c.dom.Document物件轉換為BLOB物件。

呈現預先填入的表單

呈現預先填入的表單的方式與其他表單類似。 唯一的差異是您使用包含XML資料來源的com.adobe.idp.Document物件來預先填入表單。

另請參閱

包含AEM Forms Java程式庫檔案

設定連線屬性

Forms服務API快速入門

呈現互動式PDF forms

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

使用Java API預先填入表單 prepopulating-forms-using-the-java-api

若要使用Forms API (Java)預先填入具有流程配置的表單,請執行以下步驟:

  1. 包含專案檔案

    在您的Java專案的類別路徑中包含使用者端JAR檔案,例如adobe-forms-client.jar。 如需這些檔案位置的相關資訊,請參閱包含AEM Forms Java程式庫檔案

  2. 建立記憶體中的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元素附加至詳細資料元素: 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物件。
    • 包含Forms服務所需URI值的URLSpec物件。
    • 儲存檔案附件的java.util.HashMap物件。 這是選用引數,如果您不想將檔案附加至表單,可以指定null

    renderPDFForm方法傳回FormsResult物件,其中包含必須寫入使用者端網頁瀏覽器的表單資料流。

    • 建立用來傳送表單資料流至使用者端網頁瀏覽器的javax.servlet.ServletOutputStream物件。
    • 呼叫FormsResult物件的getOutputContent方法,以建立com.adobe.idp.Document物件。
    • 呼叫com.adobe.idp.Document物件的getInputStream方法,以建立java.io.InputStream物件。
    • 呼叫InputStream物件的read方法,並將位元組陣列作為引數傳遞,以表單資料流填入位元組陣列。
    • 叫用javax.servlet.ServletOutputStream物件的write方法,將表單資料流傳送至使用者端網頁瀏覽器。 將位元組陣列傳遞至write方法。

另請參閱

快速入門(SOAP模式):使用Java API以可流動的版面配置預先填入Forms

包含AEM Forms Java程式庫檔案

設定連線屬性

使用網站服務API預先填入表單 prepopulating-forms-using-the-web-service-api

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

  1. 包含專案檔案

    • 建立使用Forms服務WSDL的Java Proxy類別。 (請參閱使用Apache Axis建立Java Proxy類別。)
    • 將Java Proxy類別納入您的類別路徑中。
  2. 建立記憶體中的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元素附加至詳細資料元素: 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參考
    • 包含Forms服務所需URI值的URLSpec物件。
    • 儲存檔案附件的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方法,建立用來將表單資料流寫入使用者端網頁瀏覽器的javax.servlet.ServletOutputStream物件。
    • 建立位元組陣列,並透過叫用BLOB物件的getBinaryData方法來填入該陣列。 此工作會將FormsResult物件的內容指派給位元組陣列。
    • 叫用javax.servlet.http.HttpServletResponse物件的write方法,將表單資料流傳送至使用者端網頁瀏覽器。 將位元組陣列傳遞至write方法。
    note note
    NOTE
    renderPDFForm方法會將必須寫入使用者端網頁瀏覽器的表單資料流,填入作為最後一個引數值傳遞的com.adobe.idp.services.holders.FormsResultHolder物件。

另請參閱

使用Base64編碼叫用AEM Forms

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2