6

XFAフォームのすべてのフィールドの簡単なリストを取得しようとしています。私はこのコードを使用しています:

private void ListFieldNames()
{
    string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf";
    MemoryStream m = new MemoryStream();

    // title the form
    this.Text += " - " + pdfTemplate;

    // create a new PDF reader based on the PDF template document
    PdfReader pdfReader = new PdfReader(pdfTemplate);
    PdfStamper pdfStamper = new PdfStamper(pdfReader, m);
    AcroFields formFields = pdfStamper.AcroFields;        
    AcroFields form = pdfReader.AcroFields;
    XfaForm xfa = form.Xfa;
    StringBuilder sb = new StringBuilder();
    sb.Append(xfa.XfaPresent ? "XFA form" : "AcroForm");
    sb.Append(Environment.NewLine);

    foreach (string key in form.Fields.Keys)
    {
        sb.Append(key);
        sb.Append(Environment.NewLine);
        txtFields.Text = sb.ToString();
    }

    txtFields.Text = sb.ToString();
}

しかし、私が取得しているのはXFAフォームだけであり、フィールドはありません。私が間違っていることについて何か考えはありますか?

前もって感謝します

4

1 に答える 1

12

私の著書「iText in Action」の第 8 章からコード サンプルを取り上げました。そのコード サンプルの結果は、私が 273 ページに書いた内容と一致しています。

このフォームをリソースとしてリスト 8.18 を実行すると、次の結果が得られます。

AcroForm

あなたの質問が私が間違っていることを知っていますか?答えは簡単です。270 ページで読むのをやめたか、付属のドキュメントを読まずにコード サンプルを使用しました。これを修正する方法は?ドキュメントを読んでください!

あなたの質問がフィールドに関する情報を取得できないのはなぜですか? (これはあなたの質問ではありませんが、そうだと仮定しましょう)、答えは次のとおりです。コードを使用して AcroForm フィールドを取得していますが、フォームにはそのようなフィールドは含まれていません。フォームは純粋な XFA フォームです。つまり、すべてのフィールド情報は XML および XML のみとして保存されます。

次のことを知りたいとします。その XML を抽出するにはどうすればよいですか? 次に、コピー/貼り付けした例を見つけた場所に移動する必要があります。

それはここにあります: http://itextpdf.com/examples/iia.php?id=164

または多分ここ: http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs

またはここでも: http://kuujinbo.info/iTextInAction2Ed/index.aspx?ch=Chapter08&ex=XfaMovie

このコード スニペットは、完全な XFA ストリームを返します。

public string ReadXfa(PdfReader reader) {
  XfaForm xfa = new XfaForm(reader);
  XmlDocument doc = xfa.DomDocument;
  reader.Close();

  if (!string.IsNullOrEmpty(doc.DocumentElement.NamespaceURI)) {
    doc.DocumentElement.SetAttribute("xmlns", "");
    XmlDocument new_doc = new XmlDocument();
    new_doc.LoadXml(doc.OuterXml);
    doc = new_doc;
  }

  var sb = new StringBuilder(4000);
  var Xsettings = new XmlWriterSettings() {Indent = true};
  using (var writer = XmlWriter.Create(sb, Xsettings)) {
    doc.WriteTo(writer);
  }
  return sb.ToString();    
}

<xfa:datasets>タグを探します。subtag <xfa:data>(フォームが空の場合はおそらく空) と subtag があり<dd:dataDescription>ます。タグ内に、dataDescriptionXSD に似たものがあります。それが、フォームのフィールドが何であるかを知る必要があることです。

次のような質問を推測し続けることができます:そのようなフォームに記入するにはどうすればよいですか?メソッドを使用してfillXfaForm(); どうすればそのようなフォームを平らにできますか? XFA ワーカー (iTextSharp の上に記述されたクローズド ソース ライブラリ) を使用することによって、しかし、それらの質問は別のスレッドに保持しましょう ;-)

于 2013-02-16T14:55:35.180 に答える