Почему ABCpdf .Net не видит поля в моем PDF-файле, созданном с помощью Adobe LiveCycle?

Я работаю над приложением PDF Filler, которое будет заполнять поля в PDF значениями из веб-формы. Мой код отлично работает для старых PDF-файлов, которые у меня есть, но новые, созданные с помощью Adobe LiveCycle Designer, похоже, не могут видеть поля в PDF-файле. Было предложено сохранить PDF как «Adobe Static PDF Form», но это не решило проблему.

Вот мой код:

        Doc doc = new Doc();
        doc.Read(Server.MapPath("~/pdfs/test.pdf"));

        foreach (Field field in doc.Form.Fields)
        {
            if (field.Name == "StreetAddress")
            {
                field.Value = StreetAddress.Text;
            }
        }

В моем коде doc.Form.Fields содержит только 1 поле, имя которого имеет значение «form1[0]», хотя на самом деле в PDF-файле 7 полей.

Любая помощь будет принята с благодарностью.


person brookesmash    schedule 06.06.2012    source источник
comment
Я изучал это немного больше и обнаружил, что Adobe LiveCycle создает PDF-файлы со слоями. Это приводит к тому, что имя поля меняется с «StreetAddress» на form1[0].#subform[0].StreetAddress[0]. Есть ли способ, чтобы Adobe Live Cycle сохранил исходное имя поля «StreetAddress».   -  person brookesmash    schedule 07.06.2012
comment
Я предлагаю вам лучше обратиться в службу поддержки по этому вопросу. Или вы можете поискать альтернативу в гугле. Как ты думаешь?   -  person    schedule 07.06.2012
comment
Я сделал оба из них уже с небольшой помощью, но я наконец нашел решение для этого.   -  person brookesmash    schedule 07.06.2012


Ответы (1)


Я нашел ответ на этот вопрос после долгих экспериментов с кодом. Используйте функцию GetFieldNames(), чтобы получить массив имен полей, потому что это вернет все поля независимо от уровня. При этом вы можете прокручивать массив, создавая поля по имени. Единственная другая проблема, с которой я столкнулся, заключалась в том, что имя поля по-прежнему имеет формат «form1[0].#pageSet[0].Page1[0].StreetAddress[0]», но если вы используете свойство PartialName, оно вернет «StreetAddress [0]", поэтому вам просто нужно удалить последние 3 символа, чтобы получить правильное имя поля.

    string[] fieldNames = doc.Form.GetFieldNames();
    foreach (string fieldName in fieldNames)
    {
      Field field = doc.Form[fieldName];
      if(field.PartialName.Substring(0, field.PartialName.Length - 3).ToLower().Equals("streetaddress"))
      {
        field.Value = "whatever value you want";
      }
   }
person brookesmash    schedule 07.06.2012