Я использую itextsharp
для заполнения моих PDF-файлов. У меня нет проблем с этим. По сути, я делаю получение PDF и заполнение полей в памяти, а затем возвращаю MemoryStream
для отображения на веб-странице. Все это работает с одним документом PDF.
То, что я сейчас пытаюсь выяснить, это объединение нескольких PDF-файлов в один MemoryStream
. Часть, которую я не могу понять, состоит в том, что документы, которые я заполняю, идентичны. Так, например, у меня есть List<Person>
, который содержит 5 человек. Я хочу заполнить PDF для каждого человека и объединить их в один, в памяти. Не берите в голову, я собираюсь заполнить один и тот же тип документа для каждого человека.
Проблема, которую я получаю, заключается в том, что, когда я пытаюсь добавить вторую копию того же PDF-файла для заполнения для второй итерации, он просто перезаписывает первый заполненный PDF-файл, поскольку это тот же документ, поэтому не добавляется второй скопируйте для второго Person
на всех.
Таким образом, в основном, если бы у меня было 5 человек, я бы в итоге получил одну страницу с данными 5-го человека, а не PDF-файл с 5 подобными страницами, которые содержат данные каждого человека соответственно.
Вот код ...
MemoryStream ms = ms = new MemoryStream();
PdfReader docReader = null;
PdfStamper Stamper = null;
List<Person> persons = new List<Person>() {
new Person("Larry", "David"),
new Person("Dustin", "Byfuglien"),
new Person("Patrick", "Kane"),
new Person("Johnathan", "Toews"),
new Person("Marian", "Hossa")
};
try
{
// Iterate thru all persons and populate a PDF for each
foreach(var person in persons){
PdfCopyFields Copier = new PdfCopyFields(ms);
Copier.AddDocument(GetReader("Person.pdf"));
Copier.Close();
docReader = new PdfReader(ms.ToArray());
Stamper = new PdfStamper(docReader, ms);
AcroFields Fields = Stamper.AcroFields;
Fields.SetField("FirstName", person.FirstName);
}
}catch(Exception e){
// handle error
}finally{
if (Stamper != null)
{
Stamper.Close();
}
if (docReader != null)
{
docReader.Close();
}
}