處理已提交的Forms

本檔案中的範例和範例僅適用於JEE環境上的AEM Forms。

讓使用者能夠填寫互動式表單的網頁型應用程式,需要將資料提交回伺服器。 使用Forms服務,您可以擷取使用者在互動式表單中輸入的資料。 擷取資料後,您就可以處理資料以符合您的業務需求。 例如,您可以將資料儲存在資料庫中、將資料發送到其他應用程式、將資料發送到其他服務、將資料合併到表單設計中、在Web瀏覽器中顯示資料等。

表單資料會以XML或PDF資料的形式提交至Forms服務,此選項可在Designer中設定。 以XML提交的表單可讓您擷取個別欄位資料值。 也就是說,您可以擷取使用者在表單中輸入之每個表單欄位的值。 以PDF資料提交的表單是二進位資料,而非XML資料。 您可以將表單儲存為PDF檔案,或將表單傳送至其他服務。 如果要從以XML提交的表單中擷取資料,然後使用表單資料建立PDF檔案,請叫用其他AEM Forms操作。 (請參閱使用已提交的XML資料建立PDF文檔

下圖顯示從Web瀏覽器中顯示的互動式表單提交到名為HandleData的Java Servlet的資料。

hs_hs_handlesubmit

下表說明圖表中的步驟。

步驟

說明

1

使用者填入互動式表單,並按一下表單的「提交」按鈕。

2

資料以XML資料的形式提交到HandleData Java Servlet。

3

HandleData Java Servlet包含用於檢索資料的應用程式邏輯。

處理已提交的XML資料

表單資料以XML形式提交時,您可以擷取代表已提交資料的XML資料。 所有表單欄位在XML架構中都顯示為節點。 節點值與使用者填入的值對應。 請考慮使用貸款表單,表單中的每個欄位在XML資料中都顯示為節點。 每個節點的值都與使用者填入的值對應。 假設使用者填入貸款表單,其中顯示以下表單的資料。

hs_hs_loanformdata

下圖顯示使用Forms服務用戶端API擷取的對應XML資料。

hs_hs_loanddata

貸款表單中的欄位。 可擷取這些值
使用Java XML類。

注意

表單設計必須在設計工具中正確設定,才能以XML資料提交資料。 要正確配置表單設計以提交XML資料,請確保將表單設計上的「提交」按鈕設定為提交XML資料。 有關設定「提交」按鈕以提交XML資料的資訊,請參閱AEM Forms Designer

處理已提交的PDF資料

請考慮叫用Forms服務的Web應用程式。 Forms服務將互動式PDF表單轉譯給用戶端網頁瀏覽器後,使用者會填入表單,並以PDF資料形式提交回。 Forms服務收到PDF資料時,可將PDF資料傳送至其他服務或儲存為PDF檔案。 下圖顯示應用程式的邏輯流程。

hs_hs_savingforms

下表說明此圖中的步驟。

步驟

說明

3

網頁包含存取叫用Forms服務的Java Servlet的連結。

2

Forms服務會為用戶端網頁瀏覽器轉譯互動式PDF表單。

3

使用者填入互動式表單,然後按一下提交按鈕。 表單會以PDF資料形式提交回Forms服務。 此選項在Designer中設定。

4

Forms服務會將PDF資料儲存為PDF檔案。

處理已提交的URL UTF-16資料

如果表單資料以URL UTF-16資料提交,用戶端電腦需要Adobe Reader或Acrobat 8.1或更新版本。 此外,如果表單設計包含具有URL編碼資料(HTTP Post)的提交按鈕,且資料編碼選項為UTF-16,則必須在文字編輯器(如記事本)中修改表單設計。 您可以為提交按鈕將編碼選項設定為UTF-16LEUTF-16BE。 Designer不提供此功能。

注意

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

步驟的摘要

要處理已提交的表單,請執行以下任務:

  1. 包含專案檔案。
  2. 建立Forms用戶端API物件。
  3. 擷取表單資料。
  4. 確定表單提交是否包含檔案附件。
  5. 處理提交的資料。

包含項目檔案

在您的開發專案中加入必要的檔案。 如果要使用Java建立客戶端應用程式,請包括必要的JAR檔案。 如果您使用Web服務,請確定您包含Proxy檔案。

建立Forms用戶端API物件

您必須先建立Forms服務用戶端,才能以程式設計方式執行Forms服務用戶端API作業。 如果您使用Java API,請建立FormsServiceClient物件。 如果您使用Forms Web服務API,請建立FormsService物件。

擷取表單資料

若要擷取已提交的表單資料,請叫用FormsServiceClient物件的processFormSubmission方法。 叫用此方法時,您必須指定已提交表單的內容類型。 從用戶端網頁瀏覽器提交資料至Forms服務時,可以以XML或PDF資料的形式提交資料。 若要擷取輸入表單欄位中的資料,可以以XML資料提交資料。

您也可以設定下列執行階段選項,從以PDF資料提交的表單中擷取表單欄位:

  • 將下列值作為內容類型參數傳遞至processFormSubmission方法:CONTENT_TYPE=application/pdf
  • RenderOptionsSpec物件的PDFToXDP值設為true
  • RenderOptionsSpec物件的ExportDataFormat值設為XMLData

調用processFormSubmission方法時,可指定已提交表單的內容類型。 以下清單指定了適用的內容類型值:

  • text/xml:表示PDF表單以XML提交表單資料時要使用的內容類型。
  • application/x-www-form-urlencoded:表示HTML表單以XML提交資料時要使用的內容類型。
  • application/pdf:表示PDF表單以PDF提交資料時要使用的內容類型。
注意

您會發現,有三個對應的快速入門與處理已提交的Forms區段相關聯。 使用Java API快速入門處理以PDF提交的PDF forms,示範如何處理已提交的PDF資料。 此快速入門中指定的內容類型為application/pdf。 使用Java API快速入門處理以XML提交的PDF forms示範如何處理以PDF表單提交的已提交XML資料。 此快速入門中指定的內容類型為text/xml。 同樣地,使用Java API快速入門處理以XML提交的HTML表單,會示範如何處理從HTML表單提交的已提交XML資料。 此快速入門中指定的內容類型為application/x-www-form-urlencoded。

您會擷取張貼至Forms服務的表單資料,並判斷其處理狀態。 也就是說,將資料提交至Forms服務時,並不代表Forms服務已完成資料處理,且資料已準備好處理。 例如,資料可提交至Forms服務,以便執行計算。 計算完成後,表單將呈現給用戶並顯示計算結果。 處理提交的資料之前,建議您判斷Forms服務是否已完成資料處理。

Forms服務會傳回下列值,指出其是否已完成資料處理:

  • 0(提交): 已提交的資料已準備好進行處理。
  • 1(計算): Forms服務對資料執行計算操作,且必須將結果轉譯回使用者。
  • 2(驗證): Forms服務驗證的表單資料,必須將結果轉譯回使用者。
  • 3(下一步): 目前頁面已變更,且結果必須寫入用戶端應用程式。
  • 4(上一個):當前頁面已更改,結果必須寫入客戶端應用程式。
注意

計算和驗證必須返回給用戶。 (請參閱計算表單資料

確定表單提交是否包含檔案附件

提交至Forms服務的Forms可包含檔案附件。 例如,使用Acrobat的內建附件窗格,使用者可以選取要連同表單一併提交的檔案附件。 此外,用戶還可以使用HTML工具欄(以HTML檔案呈現)選擇檔案附件。

在您確定表單是否包含檔案附件後,您就可以處理資料。 例如,您可以將檔案附件保存到本地檔案系統。

注意

表單必須以PDF資料提交,才能擷取檔案附件。 如果表單以XML資料提交,則不會提交檔案附件。

處理提交的資料

您可以根據已提交資料的內容類型,從已提交的XML資料中擷取個別表單欄位值,或將已提交的PDF資料儲存為PDF檔案(或將其傳送至其他服務)。 要提取單個表單欄位,請將提交的XML資料轉換為XML資料源,然後使用org.w3c.dom類檢索XML資料源值。

另請參閱

包含AEM Forms Java程式庫檔案

設定連接屬性

Forms服務API快速入門

將檔案傳遞至Forms服務

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

使用Java API處理已提交的表單

使用Forms API(Java)處理已提交的表單:

  1. 包含項目檔案

    在Java專案的類別路徑中加入用戶端JAR檔案,例如adobe-forms-client.jar。

  2. 建立Forms用戶端API物件

    • 建立包含連接屬性的ServiceClientFactory對象。
    • 使用其建構子並傳遞ServiceClientFactory物件,以建立FormsServiceClient物件。
  3. 擷取表單資料

    • 要檢索發佈到Java Servlet的表單資料,請使用其建構子並從建構子中調用javax.servlet.http.HttpServletResponse對象的getInputStream方法,建立com.adobe.idp.Document對象。
    • 使用其建構子建立RenderOptionsSpec物件。 通過調用RenderOptionsSpec對象的setLocale方法並傳遞指定區域設定值的字串值來設定區域設定值。
    注意

    您可以叫用RenderOptionsSpec物件的setPDF2XDP方法並傳遞true,以及呼叫setXMLData並傳遞true,指示Forms服務從已提交的PDF內容建立XDP或XML資料。 然後,可以調用FormsResult對象的getOutputXML方法以檢索與XDP/XML資料對應的XML資料。 (FormsResult物件由processFormSubmission方法傳回,將於下一個子步驟說明。)

    • 調用FormsServiceClient對象的processFormSubmission方法並傳遞以下值:

      • 包含表單資料的com.adobe.idp.Document物件。
      • 一個字串值,它指定包括所有相關HTTP標題的環境變數。 指定要處理的內容類型。 要處理XML資料,請為此參數指定以下字串值:CONTENT_TYPE=text/xml。 若要處理PDF資料,請為此參數指定下列字串值:CONTENT_TYPE=application/pdf
      • 指定HTTP_USER_AGENT標題值的字串值,例如。 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322). 此參數值為選用值。
      • 儲存運行時選項的RenderOptionsSpec對象。

      processFormSubmission方法會傳回包含表單提交結果的FormsResult物件。

    • 叫用FormsResult物件的getAction方法,判斷Forms服務是否已完成表單資料的處理。 如果此方法返回值0,則資料已準備好進行處理。

  4. 確定表單提交是否包含檔案附件

    • 調用FormsResult對象的getAttachments方法。 此方法會傳回java.util.List物件,其中包含以表單提交的檔案。
    • 逐一查看java.util.List對象,以確定是否有檔案附件。 如果有檔案附件,則每個元素都是com.adobe.idp.Document實例。 您可以調用com.adobe.idp.Document對象的copyToFile方法並傳遞java.io.File對象,以保存檔案附件。
    注意

    此步驟僅適用於表單以PDF提交的情況。

  5. 處理提交的資料

    • 如果資料內容類型為application/vnd.adobe.xdp+xmltext/xml,請建立應用程式邏輯以檢索XML資料值。

      • 調用FormsResult對象的getOutputContent方法,建立com.adobe.idp.Document對象。
      • 通過調用java.io.DataInputStream建構子並傳遞com.adobe.idp.Document對象來建立java.io.InputStream對象。
      • 呼叫靜態org.w3c.dom.DocumentBuilderFactory物件的newInstance方法,建立org.w3c.dom.DocumentBuilderFactory物件。
      • 調用org.w3c.dom.DocumentBuilderFactory對象的newDocumentBuilder方法,建立org.w3c.dom.DocumentBuilder對象。
      • 調用org.w3c.dom.DocumentBuilder對象的parse方法並傳遞java.io.InputStream對象,建立org.w3c.dom.Document對象。
      • 檢索XML文檔中每個節點的值。 完成此工作的一種方式是建立接受兩個參數的自訂方法:org.w3c.dom.Document對象以及要檢索其值的節點的名稱。 此方法會傳回代表節點值的字串值。 在此程式後的程式碼範例中,此自訂方法稱為getNodeText。 此方法的內文如所示。
    • 如果資料內容類型為application/pdf,請建立應用程式邏輯,將提交的PDF資料儲存為PDF檔案。

      • 調用FormsResult對象的getOutputContent方法,建立com.adobe.idp.Document對象。
      • 使用其公共建構子建立java.io.File對象。 請務必指定PDF作為副檔名。
      • 叫用com.adobe.idp.Document物件的copyToFile方法並傳遞java.io.File物件,以填入PDF檔案。

另請參閱

快速入門(SOAP模式):使用Java API處理以XML提交的PDF forms

快速入門(SOAP模式):使用Java API處理以XML提交的HTML表單

快速入門(SOAP模式):使用Java API處理以PDF提交的PDF forms

包含AEM Forms Java程式庫檔案

設定連接屬性

使用Web服務API處理已提交的PDF資料

使用Forms API(網站服務)處理提交的表單:

  1. 包含項目檔案

    • 建立使用Forms服務WSDL的Java代理類。
    • 將Java代理類包含到類路徑中。
  2. 建立Forms用戶端API物件

    建立FormsService物件並設定驗證值。

  3. 擷取表單資料

    • 要檢索發佈到Java Servlet的表單資料,請使用其建構子建立BLOB對象。

    • 調用javax.servlet.http.HttpServletResponse對象的getInputStream方法,建立java.io.InputStream對象。

    • 使用其建構子並傳遞java.io.InputStream物件的長度,以建立java.io.ByteArrayOutputStream物件。

    • java.io.InputStream對象的內容複製到java.io.ByteArrayOutputStream對象中。

    • 調用java.io.ByteArrayOutputStream對象的toByteArray方法,建立位元組陣列。

    • 叫用setBinaryData方法並將位元組陣列傳遞為引數,以填入BLOB物件。

    • 使用其建構子建立RenderOptionsSpec物件。 通過調用RenderOptionsSpec對象的setLocale方法並傳遞指定區域設定值的字串值來設定區域設定值。

    • 調用FormsService對象的processFormSubmission方法並傳遞以下值:

      • 包含表單資料的BLOB物件。
      • 一個字串值,它指定包括所有相關HTTP標題的環境變數。 指定要處理的內容類型。 要處理XML資料,請為此參數指定以下字串值:CONTENT_TYPE=text/xml。 若要處理PDF資料,請為此參數指定下列字串值:CONTENT_TYPE=application/pdf
      • 指定HTTP_USER_AGENT標題值的字串值;例如Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
      • 儲存運行時選項的RenderOptionsSpec對象。
      • 由方法填入的空BLOBHolder物件。
      • 由方法填入的空javax.xml.rpc.holders.StringHolder物件。
      • 由方法填入的空BLOBHolder物件。
      • 由方法填入的空BLOBHolder物件。
      • 由方法填入的空javax.xml.rpc.holders.ShortHolder物件。
      • 由方法填入的空MyArrayOf_xsd_anyTypeHolder物件。 此參數用於儲存隨表單提交的檔案附件。
      • 由方法填入的空白FormsResultHolder物件,其表單為已提交。

      processFormSubmission方法會以表單提交的結果填入FormsResultHolder參數。

    • 叫用FormsResult物件的getAction方法,判斷Forms服務是否已完成表單資料的處理。 如果此方法傳回值0,表單資料便已可供處理。 通過獲取FormsResultHolder對象的value資料成員的值,可以獲取FormsResult對象。

  4. 確定表單提交是否包含檔案附件

    獲取MyArrayOf_xsd_anyTypeHolder對象的value資料成員的值(將MyArrayOf_xsd_anyTypeHolder對象傳遞到processFormSubmission方法)。 此資料成員返回Objects陣列。 Object陣列中的每個元素都是Object,與隨表單提交的檔案相對應。 您可以取得陣列內的每個元素,並將其轉換為BLOB物件。

  5. 處理提交的資料

    • 如果資料內容類型為application/vnd.adobe.xdp+xmltext/xml,請建立應用程式邏輯以檢索XML資料值。

      • 調用FormsResult對象的getOutputContent方法,建立BLOB對象。
      • 調用BLOB對象的getBinaryData方法,建立位元組陣列。
      • 調用java.io.ByteArrayInputStream建構子並傳遞位元組陣列,建立java.io.InputStream物件。
      • 呼叫靜態org.w3c.dom.DocumentBuilderFactory物件的newInstance方法,建立org.w3c.dom.DocumentBuilderFactory物件。
      • 調用org.w3c.dom.DocumentBuilderFactory對象的newDocumentBuilder方法,建立org.w3c.dom.DocumentBuilder對象。
      • 調用org.w3c.dom.DocumentBuilder對象的parse方法並傳遞java.io.InputStream對象,建立org.w3c.dom.Document對象。
      • 檢索XML文檔中每個節點的值。 完成此工作的一種方式是建立接受兩個參數的自訂方法:org.w3c.dom.Document對象以及要檢索其值的節點的名稱。 此方法會傳回代表節點值的字串值。 在此程式後的程式碼範例中,此自訂方法稱為getNodeText。 此方法的內文如所示。
    • 如果資料內容類型為application/pdf,請建立應用程式邏輯,將提交的PDF資料儲存為PDF檔案。

      • 調用FormsResult對象的getOutputContent方法,建立BLOB對象。
      • 調用BLOB對象的getBinaryData方法,建立位元組陣列。
      • 使用其公共建構子建立java.io.File對象。 請務必指定PDF作為副檔名。
      • 使用其建構子並傳遞java.io.File物件,以建立java.io.FileOutputStream物件。
      • 叫用java.io.FileOutputStream物件的write方法並傳遞位元組陣列,以填入PDF檔案。

另請參閱

使用Base64編碼叫用AEM Forms

本頁內容