PDF Sharp - AddPages заменяет поля формы

У меня есть несколько страниц .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 и оставить их как есть. Без перезаписи значений полей.

currentIntNumber — это просто счетчик для получения уникального идентификатора. - Обновлю пост. idx -> да, думаю, да. Это просто способ получить имена полей и получить доступ к SetName.

birmsi 15.10.2022 15:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В файлах PDF поля имеют область действия документа, а не области страницы. 2 или более полей с одинаковыми именами на одной странице или на разных страницах на самом деле являются одним и тем же полем с несколькими виджетами (визуальными представлениями), и все виджеты отображают одно и то же значение поля.

Поведение, с которым вы столкнулись, является нормальным, и есть 2 возможных решения:

  1. Вы сглаживаете поля формы после каждого вызова AddPage. У вас больше не будет конфликтов, но поля больше не будут доступны для редактирования.
  2. Переименуйте поля либо в целевом документе, либо на исходной странице перед вызовом AddPage.

Я не знаком с 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 было способом фактически изменить имя поля, а не только запись в словаре.

Другие вопросы по теме