PDFフォームの利用方法

現在手がけているシステムのアーキテクチャ検討で、Acrobat8 Professionalで作成した既存のPDFフォームの利用方法を調査しています。フォームを一から生成するなら簡単なのですが、既存のPDFフォームを元にしてフィールドを初期化するのは結構難しいです。
もちろん直にPDFをいじるなんてことはせずに定番のiTextを使う予定です。

既存PDFフォームのフィールド設定

既存のPDFフォームのフィールドに値を設定します。Acrobat Reader7.0.3等の古いバージョンではエラーが出ます。7.0.9の最新版ではOKでした。

// we create a reader for a certain document
PdfReader reader = new PdfReader("SimpleRegistrationForm.pdf");
int n = reader.getNumberOfPages();
// filling in the form
PdfStamper stamp1 = new PdfStamper(reader, new FileOutputStream("registered.pdf"));
AcroFields form1 = stamp1.getAcroFields();
form1.setField("name", "progknn");
form1.setField("address", "日本北海道");
form1.setField("postal_code", "XXX-XXXX");
form1.setField("email", "hoge@host.com");
stamp1.close();

既存PDFフォームのフィールドを読み込み専用に設定

既存のPDFフォームのフィールドを読み込み専用に設定します。setField()はFormデザイナーで設定したフィールド名を引数にするのですが、setFieldPropertyだけ何故かXFA XMLファイルでの完全修飾名を引数にします。だから、フィールド名からXFAの完全修飾名を検索してやらなくてはなりません。なんででしょうねえ。
あと、"setflag"と"setfflag"の違い等のプロパティ名の意味がよくわからないです。Javadocでは簡単な説明しかないし、iTextのソースを追いかけてもわからないです。PDFの仕様も含めてもっと深く調べた方がいいかも。

XfaForm xfa = form1.getXfa();
String name = new String("OrderedByCompany");
if (xfa.isXfaPresent()) {
name = xfa.findFieldName(name, form1);
if (name == null)
return; //Error
form1.setFieldProperty(name,"setfflags",PdfFormField.FF_READ_ONLY, null);
}

既存PDFフォームにグラフィックを追加

既存のPDFにグラフィックを追加します。検印欄に判子のグラフィックを追加するとかですね。
現在調査中。背景にスタンプを貼るとかなら簡単に出来そうですが、1ページの下の検印欄に追加するといった事ができるかどうか・・・

PDFフォームからHTTP送信

PDFフォームから直にサーバにデータをアップします。Acrobat ReaderでPDFフォームを開いてHTTP送信ボタンを押すとXMLファイルをサーバにPOSTしてくれるので簡単簡単と嘗めていたらはまりました。
GetAccess等Form認証しているサイトだとアップする画面を表示する前にログイン画面が表示されるので、ログイン画面にXMLをPOSTしてしまいます。
これも要検討ですね。