填充多个PDF

Gab*_*abe 5 c# pdf asp.net-mvc itextsharp

itextsharp用来填充我的PDF.我对此没有任何问题.基本上我正在做的是获取PDF并填充内存中的字段然后传回MemoryStream以显示在网页上.所有这些都与单个文档PDF一起使用.

我现在要弄清楚的是将多个PDF合并为一个MemoryStream.我无法弄清楚的部分是,我填充的文件是相同的.例如,我有一个List<Person>包含5个人的人.我想为每个人填写PDF并将它们全部合并到一个内存中.请记住,我将为每个人填写相同类型的文件.

我得到的问题是,当我尝试为第二次迭代添加相同PDF的第二个副本时,它只会覆盖第一个填充的PDF,因为它是相同的文档,因此不会为此添加第二个副本第二个Person.

所以基本上如果我有5个人,我最终会得到一个包含第5个人数据的单页,而不是包含5个相似页面的PDF,分别包含每个人的数据.

这是一些代码......

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

Gab*_*abe 2

我已经创建了一个可行的解决方案,我希望这对某人有所帮助。

创建一个 PopulatePDF() 接受该 Person 对象并返回 a 的方法 byte[]

private byte[] PopulatePersonPDF(Person obj)
{
   MemoryStream ms = new MemoryStream();
   PdfStamper Stamper = null;

   try
   {
      PdfCopyFields Copier = new PdfCopyFields(ms);
      Copier.AddDocument(GetReader("Person.pdf"));
      Copier.Close();

      PdfReader docReader = new PdfReader(ms.ToArray());
      ms = new MemoryStream();
      Stamper = new PdfStamper(docReader, ms);
      AcroFields Fields = Stamper.AcroFields;
      Fields.SetField("FirstName", obj.FirstName);
   }
   finally
   {
      if (Stamper != null)
      {
         Stamper.Close();
      }
   }
   return ms.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

创建一个 MergePDFs() 返回的方法 MemoryStream

private MemoryStream MergePDFs(List<byte[]> pdfs)
{
   MemoryStream ms = new MemoryStream();
   PdfCopyFields Copier = new PdfCopyFields(ms);

   foreach (var pdf in pdfs)
      Copier.AddDocument(new PdfReader(pdf));
   Copier.Close();
   return ms;
}
Run Code Online (Sandbox Code Playgroud)

实施示例:

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")
};

List<byte[]> pdfs = new List<byte[]>();

foreach(var person in persons)
   pdfs.Add(PopulatePersonPDF(person));

MemoryStream ms = MergePDFs(pdfs);
Run Code Online (Sandbox Code Playgroud)