2012-07-11 39 views
2

我正在編寫一個需要在XFA和AcroField模板中讀取的C#應用​​程序。由於公司的規模以及可能與應用程序相關的現有PDF文檔的數量,選擇一個並採用它是不可能的。我如何編程讀取AcroFields和XFA字段進行填充?

我目前使用iTextSharp來讀取AcroFields,但它實際上並沒有保存更改。我使用Acrobat Pro的試用版製作了AcroFields。

編輯:(我刪了很多原始帖子)

我有一種變通方法有些工作,但對XML我寧願不做一個Deapth優先搜索。我也沒有弄清除文本字段之外的任何東西。

public List<String> getKeys(AcroFields af) 
{ 
    XfaForm xfa = af.Xfa; 
    List<String> Keys = new List<string>(); 
    foreach (var field in af.Fields) 
    { 
     Keys.Add(field.Key); 
    } 
    if (xfa.XfaPresent) 
    { 
     System.Xml.XmlNode n = xfa.DatasetsNode.FirstChild; 
     if (n == null) return Keys; 

     // drill down in to the children 
     while (n.FirstChild != null) { n = n.FirstChild; } 

     // if the node is filled in data, grab the parent 
     if ((n.Name.ToCharArray(0, 1))[0] == '#') n = n.ParentNode; 
     while ((n = n.NextSibling) != null) 
     { 
      Keys.Add(n.Name); 
     } 
    } 
    return Keys; 
} 

回答

1

好的,我想出瞭如何獲得XFA和AcroField PDF文檔的字段名稱,這是我的原始問題。

我還使用了一個名爲myKey的類。它有一個價值和一個關鍵。我忽略了.equals來比較關鍵值,並寫了我自己的.ToString

public AcroFields loadAcroFields(String path) 
{ 
    PdfReader pdfReader = new PdfReader(path); 
    AcroFields fields = pdfReader.AcroFields; 
    pdfReader.Close(); 
    return fields; 
} 


public List<myKey> getKeys(AcroFields af) 
{ 
    XfaForm xfa = af.Xfa; 
    List<myKey> Keys = new List<myKey>(); 
    foreach (var field in af.Fields) 
    { 
     Keys.Add(new myKey(field.Key, af.GetField(field.Key))); 
    } 
    if (xfa.XfaPresent) 
    { 
     System.Xml.XmlNode n = xfa.DatasetsNode.FirstChild; 
     Keys.AddRange(BFS(n)); 
    } 
    return Keys; 
} 


public List<myKey> BFS(System.Xml.XmlNode n) 
{ 
    List<myKey> Keys = new List<myKey>(); 
    System.Xml.XmlNode n2 = n; 

    if (n == null) return Keys; 

    if (n.FirstChild == null) 
    { 
     n2 = n; 
     if ((n2.Name.ToCharArray(0, 1))[0] == '#') n2 = n2.ParentNode; 
     while ((n2 = n2.NextSibling) != null) 
     { 
      Keys.Add(new myKey(n2.Name, n2.Value)); 
     } 
    } 

    if (n.FirstChild != null) 
    { 
     n2 = n.FirstChild; 
     Keys.AddRange(BFS(n2)); 
    } 
    n2 = n; 
    while ((n2 = n2.NextSibling) != null) 
    { 
     Keys.AddRange(BFS(n2)); 
    } 
    return Keys; 
}