我正在使用itextsharp
来填充我的PDF。我对此没有任何问题。基本上我正在做的是获取PDF并填充内存中的字段,然后传回MemoryStream
以显示在网页上。所有这些都是使用单个文档PDF。
我现在要弄清楚的是,将多个PDF合并为一个MemoryStream
。我无法弄清楚的部分是,我填充的文件是相同的。例如,我有一个包含5个人的List<Person>
。我想为每个人填写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();
}
}
答案 0 :(得分: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();
}
创建一个 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;
}
示例实施:
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);
答案 1 :(得分:0)
检查PdfStamper构造函数签名是否存在一个带有布尔值的重载,该值指示它附加到当前文档。
答案 2 :(得分:0)
这可能是您解决方案的另一个答案:Batch Pdf generation