2013-02-13 18 views
6

私はXFAフォームのすべてのフィールドの単純なリストを取得しようとしています。私はこのコードを使用しています: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フォームであり、フィールドはありません。私が間違って何をしているのか?事前に

おかげで

答えて

11

あなたは私の本の第8章からのサンプルコードを撮影した「アクションでiTextの。」そのコードサンプルの結果は、私は273ページに書いたものと一致している:

AcroForm

:リソースとしてこのフォームで8.18リスト

実行中は、あなたに次のような結果が得られます

あなたの質問がの場合私は間違って何を考えていますか?答えはシンプルです.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>タグを探します。サブタグ<xfa:data>(フォームが空の場合はおそらく空です)とサブタグ<dd:dataDescription>があります。 dataDescriptionタグの中には、XSDに似たものがあります。それがフォームのフィールドが何であるかを知るために必要なものです。

私は、次のような推測の質問に行くことができます:どのようにそのようなフォームに記入しますか?fillXfaForm()の方法を使用することにより; どうすればこのようなフォームを平坦化できますか? XFA Worker(iTextSharpの上に書かれたクローズドソースライブラリ)を使って、別のスレッドの質問を残しておきます;-)

関連する問題