У меня есть несколько страниц .pdf (это заполненные формы), которые я хочу объединить в один файл pdf.
Сначала я создаю документ в формате PDF, в котором будет храниться информация. Затем я открываю каждый файл PDF,
var docToImport = PdfReader.Open(pathToPdf, PdfDocumentOpenMode.Import);
И добавление первой страницы каждого PDF-файла в документ, который я создаю
doc.AddPage(docToImport.Pages[0]);
Код создает файл PDF и добавляет файлы PDF, которые я хочу.
Проблема, которую я не могу решить:
Последняя добавленная страница перезаписывает предыдущие поля (если они имеют одно и то же имя) Попытался изменить имена полей, используя
var form = docIntervencoes.AcroForm;
var fields = form.Fields;
var fieldNames = fields.Names;
for (int idx = 0; idx < fieldNames.Length; ++idx)
{
var fieldName = fieldNames[idx];
var field = fields[fieldName];
field.Elements.SetName($"/Type {fieldName}", $"/Type {fieldName}_{currentIntNumber}");
}
currentIntNumber — это просто int, который увеличивается от pdf до pdf, чтобы получить другое имя для полей.
Но это не меняет имена полей.
Я дергаю себя за волосы. Просто хотел добавить страницы в pdf и оставить их как есть. Без перезаписи значений полей.





В файлах PDF поля имеют область действия документа, а не области страницы. 2 или более полей с одинаковыми именами на одной странице или на разных страницах на самом деле являются одним и тем же полем с несколькими виджетами (визуальными представлениями), и все виджеты отображают одно и то же значение поля.
Поведение, с которым вы столкнулись, является нормальным, и есть 2 возможных решения:
Я не знаком с PDFSharp API, но мне кажется, что вы пытаетесь изменить низкоуровневый словарь PDF COS объекта поля. SetName в этой ситуации устанавливает объект имени COS в словаре, но не устанавливает имя поля. Кроме того, низкоуровневый ключ COS, в котором хранится имя поля, — /T (не /Type), а его значение — строковый объект COS.
Я рекомендую искать свойство Name или метод SetName в объекте поля PDF в PDFSharp API, поскольку изменение низкоуровневого объекта COS может привести к неожиданным результатам.
Следует за решением проблемы POSTED, используя ответ от iPDFdev в качестве руководства:
Следует решение:
var fields = doc.AcroForm.Fields;
var fieldNames = fields.Names;
for (int id = 0; id < fieldNames.Length; ++id){
var fieldName = fieldNames[id];
var field = fields[fieldName];
field.Elements.SetString("/T", $"{ newUniqueFieldName}");
}
Использование SetString было способом фактически изменить имя поля, а не только запись в словаре.
currentIntNumber — это просто счетчик для получения уникального идентификатора. - Обновлю пост. idx -> да, думаю, да. Это просто способ получить имена полей и получить доступ к SetName.