Как я могу программно прочитать поля AcroFields и XFA для заполнения?

Я пишу приложение C#, которое нужно будет читать как в шаблонах XFA, так и в AcroField. Из-за размера компании и количества существующих PDF-документов, которые можно подключить к приложению, не может быть и речи о том, чтобы выбрать один и использовать его.

В настоящее время я использую iTextSharp для чтения в AcroFields, но на самом деле он не сохраняет изменения. Я сделал AcroFields, используя пробную версию Acrobat Pro.

РЕДАКТИРОВАТЬ: (я удалил большую часть оригинального поста)

У меня есть обходной путь, который несколько работает, но я бы предпочел не выполнять поиск в глубину в XML. У меня также пока нет ничего, кроме текстовых полей.

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;
}

person Mike    schedule 11.07.2012    source источник


Ответы (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;
}
person Mike    schedule 12.07.2012