送信済みフォームの処理
- 適用対象:
- Experience Manager 6.5
作成対象:
- 開発者
このドキュメントのサンプルと例は、JEE 環境の AEM Forms のみを対象としています。
ユーザーがインタラクティブフォームに入力できる Web ベースのアプリケーションでは、データをサーバーに送り返す必要があります。Forms サービスを使用すると、ユーザーがインタラクティブフォームに入力したデータを取得できます。データを取得したら、ビジネス要件に合わせてそのデータを処理できます。例えば、そのデータをデータベースに格納したり、別のアプリケーションに送信したり、別のサービスに送信したり、フォームデザインで結合したり、Web ブラウザーに表示したりすることができます。
フォームデータは、XML データまたは PDF データとして Forms サービスに送信されます(その選択は Designer で設定します)。XML 形式で送信されたフォームを使用すると、個々のフィールドデータ値を抽出できます。つまり、ユーザーがフォームに入力した各フォームフィールドの値を抽出できます。PDF 形式で送信されたフォームは、XML データではなくバイナリデータです。そのフォームは、PDF ファイルとして保存するか、別のサービスに送信することができます。XML 形式で送信されたフォームからデータを抽出し、そのフォームデータを使用して PDF ドキュメントを作成する場合は、別の AEM Forms 操作を呼び出します。(送信された XML データを使用して PDF ドキュメントを作成するを参照してください)
次の図は、Web ブラウザーに表示されたインタラクティブフォームから HandleData
という名前の Java サーブレットに送信されるデータを示しています。
次の表で、図の手順を説明します。
手順 | 説明 |
---|---|
1 | ユーザーがインタラクティブフォームに入力し、フォームの「送信」ボタンをクリックします。 |
2 | データが XML データとして HandleData Java サーブレットに送信されます。 |
3 | HandleData Java サーブレットには、データを取得するアプリケーションロジックが含まれています。 |
送信された XML データの処理
フォームデータを XML 形式で送信すると、送信データを表す XML データを取得できます。すべてのフォームフィールドは、XML スキーマのノードとして表示されます。ノードの値は、ユーザーが入力した値に対応します。フォーム内の各フィールドが XML データ内のノードとして表示されるローン申請書について考えてみましょう。各ノードの値は、ユーザーが入力する値に対応します。ユーザーが次のフォームに示すデータを使用してローン申請書に入力するとします。
次の図に、Forms サービスクライアント API を使用して取得される、対応する XML データを示します。
ローン申請書のフィールド。これらの値は、Java XML クラスを
使用して取得できます。
送信された PDF データの処理
Forms サービスを呼び出す web アプリケーションについて考えます。Forms サービスがインタラクティブ PDF フォームをクライアント web ブラウザーにレンダリングしたら、ユーザーはフォームに入力し、フォームを PDF データとして送り返します。Forms サービスは PDF データを受け取ると、PDF データを別のサービスに送信したり、PDF ファイルとして保存したりできます。次の図に、アプリケーションのロジック・フローを示します。
次の表に、この図の手順を示します。
ステップ | 説明 |
---|---|
1 | Web ページには、Forms サービスを呼び出す Java サーブレットにアクセスするリンクが含まれています。 |
2 | Forms サービスは、インタラクティブな PDF フォームをクライアント web ブラウザーにレンダリングします。 |
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-16LE
または UTF-16BE
のいずれかに設定できます。Designer はこの機能を提供していません。
手順の概要
送信されたフォームを処理するには、次のタスクを実行します。
- プロジェクトファイルを含めます。
- Forms Client API オブジェクトを作成します。
- フォームデータを取得します。
- フォーム送信に添付ファイルが含まれているかどうかを確認します。
- 送信されたデータを処理します。
プロジェクトファイルを含める
必要なファイルを開発プロジェクトに含めます。Java を使用してクライアントアプリケーションを作成する場合は、必要な JAR ファイルを含めます。Web サービスを使用している場合は、プロキシファイルを必ず含めてください。
Forms Client API オブジェクトの作成
Forms Service Client API 操作をプログラムで実行する前に、Forms サービスクライアントを作成する必要があります。Java API を使用している場合は、FormsServiceClient
オブジェクトを作成します。Forms Web サービス API を使用している場合は、FormsService
オブジェクトを作成します。
フォームデータを取得
送信されたフォームデータを取得するには、FormsServiceClient
オブジェクトの processFormSubmission
メソッドを呼び出します。このメソッドを呼び出す場合は、送信されたフォームのコンテンツタイプを指定する必要があります。クライアントの Web ブラウザーから Forms サービスにデータが送信された場合、そのデータは XML または PDF データとして送信できます。フォームフィールドに入力されたデータを取得するには、データを XML データとして送信します。
また、次の実行時オプションを設定して、PDF データとして送信されたフォームからフォームフィールドを取得することもできます。
CONTENT_TYPE=application/pdf
の値をコンテンツタイプパラメーターとしてprocessFormSubmission
メソッドに渡します。RenderOptionsSpec
オブジェクトのPDFToXDP
値をtrue
に設定しますRenderOptionsSpec
オブジェクトのExportDataFormat
値をXMLData
に設定します
processFormSubmission
メソッドを呼び出すときに、送信されたフォームのコンテンツタイプを指定します。次のリストで、適用可能なコンテンツタイプの値を指定します。
- text/xml:PDF フォームがフォームデータを XML として送信するときに使用するコンテンツタイプを表します。
- application/x-www-form-urlencoded:HTML フォームがデータを XML として送信するときに使用するコンテンツタイプを表します。
- application/pdf:PDF フォームがデータを PDF として送信するときに使用するコンテンツタイプを表します。
application/pdf
です。Java API クイックスタートを使用して XML として送信された PDF フォームの処理は、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 ツールバーを使用して、添付ファイルを選択することもできます。
フォームに添付ファイルが含まれているかどうかを確認したら、そのデータを処理できます。例えば、添付ファイルをローカルファイルシステムに保存できます。
送信されたデータの処理
送信データのコンテンツタイプによって異なりますが、送信されたのが XML データであれば個々のフォームフィールドの値を抽出することができ、送信されたのが PDF データであれば PDF ファイルとして保存(または別のサービスに送信)することができます。個々のフォームフィールドを抽出するには、送信された XML データを XML データソースに変換し、org.w3c.dom
クラスを使用して XML データソースの値を取得します。
関連トピック
Java API を使用して送信フォームを処理する
Forms API(Java)を使用して、送信されたフォームを処理します。
-
プロジェクトファイルを含める
adobe-forms-client.jar などのクライアント JAR ファイルを Java プロジェクトのクラスパスに含めます。
-
Forms Client API オブジェクトの作成
- 接続プロパティを含む
ServiceClientFactory
オブジェクトを作成します。 - コンストラクタを使用し、
ServiceClientFactory
オブジェクトを渡すことによって、FormsServiceClient
オブジェクトを作成します。
- 接続プロパティを含む
-
フォームデータを取得
- Java サーブレットに投稿されたフォームデータを取得するには、コンストラクタを使用し、そのコンストラクタ内から
javax.servlet.http.HttpServletResponse
オブジェクトのgetInputStream
メソッドを呼び出すことによって、com.adobe.idp.Document
オブジェクトを作成します。 - コンストラクタを使用して
RenderOptionsSpec
オブジェクトを作成します。RenderOptionsSpec
オブジェクトのsetLocale
メソッドを呼び出し、ロケール値を指定する文字列値を渡すことによって、ロケール値を設定します。
NOTE
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
を返した場合、データを処理する準備が整っています。
- Java サーブレットに投稿されたフォームデータを取得するには、コンストラクタを使用し、そのコンストラクタ内から
-
フォーム送信に添付ファイルが含まれているかどうかを確認します
FormsResult
オブジェクトのgetAttachments
メソッドを呼び出します。このメソッドは、フォームと共に送信されたファイルを含むjava.util.List
オブジェクトを返します。java.util.List
オブジェクトを反復処理して、添付ファイルが存在するかどうかを確認します。添付ファイルがある場合、各要素はcom.adobe.idp.Document
インスタンスです。com.adobe.idp.Document
オブジェクトのcopyToFile
メソッドを呼び出してjava.io.File
オブジェクトを渡すことで、添付ファイルを保存できます。
NOTE
この手順は、フォームが PDF として送信された場合にのみ適用されます。 -
送信されたデータを処理
-
データコンテンツタイプが
application/vnd.adobe.xdp+xml
またはtext/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 ドキュメント内の各ノードの値を取得します。このタスクを実行する 1 つの方法は、
org.w3c.dom.Document
オブジェクトおよび値を取得するノードの名前の 2 つのパラメーターを受け入れるカスタムメソッドを作成することです。このメソッドは、ノードの値を表す文字列値を返します。このプロセスに続くコード例では、このカスタムメソッドはgetNodeText
と呼ばれています。このメソッドの本文を示します。
-
データコンテンツタイプが
application/pdf
の場合、アプリケーションロジックを作成して、送信された PDF データを PDF ファイルとして保存します。FormsResult
オブジェクトのgetOutputContent
メソッドを呼び出すことによってcom.adobe.idp.Document
オブジェクトを作成します。- パブリックコンストラクターを使用して
java.io.File
オブジェクトを作成します。ファイル名の拡張子には必ず PDF を指定してください。 com.adobe.idp.Document
オブジェクトのcopyToFile
メソッドを呼び出してjava.io.File
オブジェクトを渡すことによって、PDFファイルに入力します。
-
Web サービス API を使用して送信された PDF データを処理します
Forms API(Web サービス)を使用して送信されたフォームを処理します。
-
プロジェクトファイルを含める
- Forms Service WSDL を使用する Java プロキシクラスを作成します。
- Java プロキシクラスをクラスパスに含めます。
-
Forms Client API オブジェクトの作成
FormsService
オブジェクトを作成し、認証値を設定します。 -
フォームデータを取得
-
Java サーブレットに投稿されたフォームデータを取得するには、コンストラクタ―を使用して
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
オブジェクトを取得できます。
-
-
フォーム送信に添付ファイルが含まれているかどうかを確認します
MyArrayOf_xsd_anyTypeHolder
オブジェクトのvalue
データメンバーの値を取得します(MyArrayOf_xsd_anyTypeHolder
オブジェクトはprocessFormSubmission
メソッドに渡されました)。このデータメンバーはObjects
の配列を返します。Object
配列内の各要素は、フォームとともに送信されたファイルに対応するObject
です。配列内の各要素を取得し、BLOB
オブジェクトにキャストできます。 -
送信されたデータを処理
-
データコンテンツタイプが
application/vnd.adobe.xdp+xml
またはtext/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 ドキュメント内の各ノードの値を取得します。このタスクを実行する 1 つの方法は、
org.w3c.dom.Document
オブジェクトおよび値を取得するノードの名前の 2 つのパラメーターを受け入れるカスタムメソッドを作成することです。このメソッドは、ノードの値を表す文字列値を返します。このプロセスに続くコード例では、このカスタムメソッドはgetNodeText
と呼ばれています。このメソッドの本文を示します。
-
データコンテンツタイプが
application/pdf
の場合、アプリケーションロジックを作成して、送信された PDF データを PDF ファイルとして保存します。FormsResult
オブジェクトのgetOutputContent
メソッドを呼び出すことによってBLOB
オブジェクトを作成します。BLOB
オブジェクトのgetBinaryData
メソッドを呼び出してバイト配列を作成します。- コンストラクターを使用して
java.io.File
オブジェクトを作成します。ファイル名の拡張子には必ず PDF を指定してください。 - コンストラクターを使用して
java.io.FileOutputStream
オブジェクトを渡すことによって、java.io.File
オブジェクトを作成します。 java.io.FileOutputStream
オブジェクトのwrite
メソッドを呼び出してバイト配列を渡すことによって、PDF ファイルを生成します。
-