Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 填充多个PDF_C#_Asp.net Mvc_Pdf_Itextsharp - Fatal编程技术网

C# 填充多个PDF

C# 填充多个PDF,c#,asp.net-mvc,pdf,itextsharp,C#,Asp.net Mvc,Pdf,Itextsharp,我正在使用itextsharp填充我的PDF。我对此没有异议。基本上,我正在做的是获取PDF并填充内存中的字段,然后将MemoryStream传回到网页上显示。所有这些都与单个文档PDF一起工作 我现在想弄明白的是,将多个PDF合并成一个MemoryStream。我搞不清楚的是,我填充的文档是相同的。例如,我有一个包含5个人的列表。我想为每个人填写一份PDF,并将它们合并成一个,在内存中。请记住,我将为每个人填写相同类型的文档 我遇到的问题是,当我尝试为第二次迭代添加相同PDF的第二份副本时,它

我正在使用
itextsharp
填充我的PDF。我对此没有异议。基本上,我正在做的是获取PDF并填充内存中的字段,然后将
MemoryStream
传回到网页上显示。所有这些都与单个文档PDF一起工作

我现在想弄明白的是,将多个PDF合并成一个
MemoryStream
。我搞不清楚的是,我填充的文档是相同的。例如,我有一个包含5个人的
列表。我想为每个人填写一份PDF,并将它们合并成一个,在内存中。请记住,我将为每个人填写相同类型的文档

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

所以基本上,如果我有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();
   }
}
MemoryStream ms=ms=new MemoryStream();
PdfReader docReader=null;
PdfStamper压模=null;
名单人员=新名单(){
新人(“拉里”、“大卫”),
新人(“Dustin”、“Byfuglien”),
新人(“帕特里克”、“凯恩”),
新人(“Johnathan”、“Toews”),
新人(“玛丽安”、“霍萨”)
};
尝试
{
//遍历所有人并为每个人填充PDF
foreach(var个人对个人){
PdfCopyFields复印机=新的PdfCopyFields(毫秒);
Copier.AddDocument(GetReader(“Person.pdf”);
复印机关闭();
docReader=新的PDF阅读器(ToArray女士());
压模=新PdfStamper(文件阅读器,ms);
AcroFields=Stamper.AcroFields;
Fields.SetField(“FirstName”,person.FirstName);
}
}捕获(例外e){
//处理错误
}最后{
如果(母版!=null)
{
压模关闭();
}
if(docReader!=null)
{
docReader.Close();
}
}

检查PdfStamper构造函数签名有一个重载,它接受一个布尔值,告诉它附加到当前文档中。

我已经创建了一个有效的解决方案,我希望这对其他人有所帮助

创建一个
PopulatePDF()
方法,该方法接受
对象并返回一个
字节[]

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();
}
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;
}
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);
创建一个
合并PDF()
方法,该方法返回
内存流

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();
}
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;
}
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);
私有内存流合并PDF(列出PDF)
{
MemoryStream ms=新的MemoryStream();
PdfCopyFields复印机=新的PdfCopyFields(毫秒);
foreach(pdf格式的风险值)
复印机.AddDocument(新pdf阅读器(pdf));
复印机关闭();
返回ms;
}
实施示例:

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();
}
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;
}
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);
List persons=新列表(){
新人(“拉里”、“大卫”),
新人(“Dustin”、“Byfuglien”),
新人(“帕特里克”、“凯恩”),
新人(“Johnathan”、“Toews”),
新人(“玛丽安”、“霍萨”)
};
List pdfs=new List();
foreach(var个人对个人)
添加(PopulatePersonPDF(person));
MemoryStream ms=合并PDF(PDF);

这里可能是您的解决方案的另一个答案:

+1代表芝加哥黑鹰队!!:)@卡梅隆-彼得斯-是的,他们是一个地狱般的团队。你如何在不加载10次模板的情况下做到这一点?获得10倍大小的
PdfCopyFields
似乎是最赚钱的选择。如果您正在处理内存中的流,则有一点非常重要:
PdfCopyFields Copier=new PdfCopyFields(ms);Copier.Writer.CloseStream=false