Действительно ли возможно изменить Имена полей Формы PDF?

Вот ситуация. У меня есть PDF с автоматически сгенерированными именами полей формы PDF. Проблема состоит в том, что эти имена не очень удобны для пользователя. Они смотрят что-то как: topmostSubform[0].Page1[0].Website_Address[0]

Я хочу быть в состоянии изменить их так, чтобы они были чем-то как WebsiteAddress. У меня есть доступ к ABCPDF, и у меня есть опыт с iTextSharp, но я попытался использовать их API, чтобы сделать это (поля формы доступа и пытаться переименовать), но не кажется, как будто это возможно.

Делает у кого-либо есть любой опыт при попытке сделать это через какой-то API (предпочтительно открытый исходный код). Кодом является .NET также.

8
задан ncyankee 26 February 2010 в 17:52
поделиться

3 ответа

Хорошая новость: вы можете изменять имена полей в iTextSharp.

На самом деле вы не можете редактировать PDF. Вы читаете существующий PDF-файл, обновляете имена полей в памяти, а затем записываете исправленный PDF-файл. Чтобы изменить имя поля, вызовите метод AcroFields.RenameField.

Вот отрывок:

PdfReader reader = new PdfReader(PDF_PATH);
using (FileStream fs = new FileStream("Test Out.pdf", FileMode.Create)) {
    PdfStamper stamper = new PdfStamper(reader, fs);
    AcroFields fields = stamper.AcroFields;
    fields.RenameField("oldFieldName", "newFieldName");
    stamper.Close();
}

А теперь плохие новости: похоже, существуют ограничения на символы, которые вы можете использовать в переименованных полях.

Я проверил приведенный выше фрагмент с вашим примером имени поля, и он не сработал. Однако удалите точки, и это действительно сработает. Я не уверен, есть ли обходной путь, но это может быть проблемой для вас,

10
ответ дан 5 December 2019 в 05:56
поделиться

Да, поля формы можно переименовывать. У меня нет опыта работы с API исходного кода, который поможет вам в этом, но мои компании PDF SDK могут помочь вам в этом, и после небольшого поиска выясняется, что iText действительно позволит вам переименовать поля формы .

0
ответ дан 5 December 2019 в 05:56
поделиться

Полное имя поля AcroForm не сохраняется в поле явно. На самом деле он получен из иерархии полей с разделенным точками списком предков, отображаемым слева.

Простое переименование поля из «topmostSubform [0] .Page1 [0] .Website_Address [0]» в «WebsiteAddress» вряд ли приведет к правильному результату.

Вы найдете раздел 8.6.2 «Словари полей» справочника PDF, который дает хорошее объяснение того, как работает именование полей; -)

По сути, каждое поле в AcroForm определяется словарем, который может содержать некоторые необязательные записи, относящиеся к имени поля.

  • Ключ '/ T' указывает частичное имя. В вашем вопросе topmostSubform [0], Page1 [0] и Website_Address [0] все представляют собой частичные имена.

  • Ключ '/ TU' определяет альтернативное «удобное для пользователя» имя для полей, которое может использоваться вместо фактического имени поля для идентификации полей в пользовательском интерфейсе.

Вместо переименования рассматриваемого поля подумайте о добавлении записи / TU!

В приведенном ниже примере используется ABCpdf для перебора всех полей в AcroForm и вставки альтернативного имени в поле на основе его частичного имени.

VBScript:

Set theDoc = CreateObject("ABCpdf7.Doc")
theDoc.Read "myForm.pdf"

Dim theFieldIDs, theList
theFieldIDs = theDoc.GetInfo(theDoc.Root, "Field IDs")
theList = Split(theFieldIDs, ",")

For Each fieldID In theList
    thePartialName = theDoc.GetInfo(fieldID, "/T:text")
    theDoc.SetInfo fieldID, "/TU:text", thePartialName
Next

theDoc.Save "output.pdf"
theDoc.Clear

Изменение "/ TU: text" на "/ T: text" установит частичное имя поля.

Примеры используемых функций, написанные на C # и VB.NET, можно найти здесь: Doc.GetInfo , Doc.SetInfo . См. Также документацию по Пути к объектам .

6
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: