gpt4 book ai didi

c# - 填充多个 PDF

转载 作者:太空狗 更新时间:2023-10-29 23:42:19 26 4
gpt4 key购买 nike

我正在使用 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();
}
}

最佳答案

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

创建一个 PopulatePDF() 接受 Person 对象并返回一个的方法 strong> 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的方法:/p>

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

关于c# - 填充多个 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com