Вот ситуация. У меня есть PDF с автоматически сгенерированными именами полей формы PDF. Проблема состоит в том, что эти имена не очень удобны для пользователя. Они смотрят что-то как: topmostSubform[0].Page1[0].Website_Address[0]
Я хочу быть в состоянии изменить их так, чтобы они были чем-то как WebsiteAddress. У меня есть доступ к ABCPDF, и у меня есть опыт с iTextSharp, но я попытался использовать их API, чтобы сделать это (поля формы доступа и пытаться переименовать), но не кажется, как будто это возможно.
Делает у кого-либо есть любой опыт при попытке сделать это через какой-то API (предпочтительно открытый исходный код). Кодом является .NET также.
Хорошая новость: вы можете изменять имена полей в 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();
}
А теперь плохие новости: похоже, существуют ограничения на символы, которые вы можете использовать в переименованных полях.
Я проверил приведенный выше фрагмент с вашим примером имени поля, и он не сработал. Однако удалите точки, и это действительно сработает. Я не уверен, есть ли обходной путь, но это может быть проблемой для вас,
Да, поля формы можно переименовывать. У меня нет опыта работы с API исходного кода, который поможет вам в этом, но мои компании PDF SDK могут помочь вам в этом, и после небольшого поиска выясняется, что iText действительно позволит вам переименовать поля формы .
Полное имя поля 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 . См. Также документацию по Пути к объектам .