【发布时间】:2014-07-17 20:00:22
【问题描述】:
我正在尝试从大约 5000 个表单的列表中创建单个 pdf 文档,这些表单是我从用 C# 编写的 ASP.NET MVC 网站中的对象列表中标记的。一旦我执行了大约 1500 个表格的冲压过程,我就会收到内存不足异常。如果我将对象列表限制为 1500 个以下对象,我不会收到错误消息。
这是模仿表单数据的数据对象:
public class MyPageData
{
public string Name { get; set; }
public string Description { get; set; }
public decimal DueAmount { get; set; }
public decimal PaidAmount { get; set; }
}
创建文档的代码。注意 模板是一个 pdf 表单,Stream 是一个 FileStream 对象,创建时具有写访问权限,没有文件共享。
public class DocumentBuilder
{
public static void FillDocument(IList<MyPageData> pages, string template, Stream outputFile)
{
using (Document document = new Document())
{
using (PdfSmartCopy copy = new PdfSmartCopy(document, outputFile))
{
document.Open();
foreach (var page in pages)
{
PdfReader reader = new PdfReader(StampPage(template, page));
copy.AddPage(copy.GetImportedPage(reader, 1));
copy.FreeReader(reader);
}
}
}
}
private static byte[] StampPage(string template, MyPageData page)
{
PdfReader reader = new PdfReader(template);
using (MemoryStream stream = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
AcroFields fields = stamper.AcroFields;
FillFields(fields, page);
stamper.FormFlattening = true;
stamper.Writer.Flush();
}
return stream.ToArray();
}
}
private static void FillFields(AcroFields fields, MyPageData page)
{
fields.SetField("Name", page.Name);
fields.SetField("Description", page.Description);
fields.SetField("DueAmount", page.DueAmount.ToString());
fields.SetField("PaidAmout", page.PaidAmount.ToString());
}
}
我浏览过 iText 和 iTextSharp 文档,我相信我的代码是正确的。我确实尝试压缩文档,如Here 演示的那样,但是在盖章时仍然会抛出错误。有什么想法或建议吗?
【问题讨论】:
-
我知道发生了什么。其他开发人员之一签入了副本中没有的代码。FreeReader(reader);
标签: asp.net-mvc c#-4.0 itextsharp