2010-05-19 84 views
5

我使用itextsharp来填充我的PDF。我对此没有任何问题。基本上我正在做的是获取PDF并填充内存中的字段,然后传回MemoryStream以显示在网页上。所有这些都与单个文档PDF一起工作。填充多个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(); 
    } 
} 
+1

+1芝加哥黑鹰! :) – 2010-05-19 21:18:11

+0

@Cameron彼得斯 - 是的,他们是一个团队的地狱。 – Gabe 2010-05-19 21:23:01

回答

2

我已经创建了一个工作解决方案,我希望这可以帮助一路上的人。

创建PopulatePDF()方法,是以Person对象,并返回一个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(); 
} 

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

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); 
+0

你怎么做这个没有加载模板10次? geting 10x的大小 – 2011-01-18 13:29:42

+0

'PdfCopyFields'似乎是钱镜头。如果你正在处理内存中的流,一些非常重要的事情:'PdfCopyFields Copier = new PdfCopyFields(ms); Copier.Writer.CloseStream = false' – 2013-09-09 20:04:59

0

检查PdfStamper构造签名存在,需要一个布尔值,告诉它附加到当前文档的过载。