我有一个W9 PDF文档,我每个按钮点击只填充一条记录的数据。现在,客户端想要创建一个文档,其中每个记录都是文档中的页面。以下是我们为每位员工创建PDF的代码。
protected void lnkFillFields_Click(object sender, EventArgs e)
{
using (Library.Data.PDFData data = new Library.Data.PDFData())
{
try
{
Document document = new Document();
PdfCopy writer = new PdfCopy(document, Response.OutputStream);
document.Open();
foreach (EmployeeData emp in data.sp_select_employee_data())
{
//Creates a PDF from a byte array
PdfReader reader =
new PdfReader((Byte[])data.sp_select_doc(16).Tables[0].Rows[0]["doc"]);
//Creates a "stamper" object used to populate interactive fields
MemoryStream ms = new MemoryStream();
PdfStamper stamper = new PdfStamper(reader, ms);
try
{
//MUST HAVE HERE BEFORE STREAMING!!!
//This line populates the interactive fields with your data.
// false = Keeps the fields as editable
// true = Turns all of the editable fields to their read-only equivalent
stamper.FormFlattening = false;
//fill in PDF here
stamper.Close();
reader.Close();
MergePDFs(writer, ms);
}
catch (Exception ex)
{
throw ex;
}
}
document.Close();
//Stream the file to the user
Response.ContentType = "application/pdf";
Response.BufferOutput = true;
Response.AppendHeader("Content-Disposition", "attachment; filename=W9"+ "_Complete.pdf");
Response.Flush();
Response.End();
}
catch (Exception ex)
{
throw ex;
}
}
}
插入页面不是可行的方法。相反,合并文档基本上是我们想要的。因此,我们提出了这种方法:
更新 下面是我们提出的成功将新PDF拼接到上一个PDF的方法。
private static void MergePDFs(PdfCopy writer, MemoryStream ms)
{
PdfReader populated_reader = new PdfReader(ms.ToArray());
//Add this pdf to the combined writer
int n = populated_reader.NumberOfPages;
for (int i = 1; i <= n; i++)
{
PdfImportedPage page = writer.GetImportedPage(populated_reader, i);
writer.AddPage(page);
}
}
我们需要做的是在内存中创建所有内容,然后将其吐出给用户下载。
答案 0 :(得分:1)
查看kuujinbo的tutorial here,将PDF合并/拼接在一起。
在您这样做之前,您还需要显然生成PDF。您可能想尝试在一次通过中完成所有操作,但这将很难调试。相反,我建议进行两次传递,第一次创建单个文档,第二次组合它们。您的第一个传递可以暂时将它们写入磁盘或内存。您的代码(和kuujinbo)实际上直接写入Response
流,这也是完全有效的,但也更难调试,特别是如果您将所有内容都包装在巨型try/catch
中。
您加入的PDF数量和生成频率应确定您临时存储第一个第二遍的位置。如果你只做了一两个并且他们不是巨人我会坚持到MemoryStream
并使用.ToArray()
字节数据。
如果你有比这更多的PDF或它们相当大或经常调用这个例程或者你有RAM约束,你可能最好先将它们保存到一个唯一的文件夹,拼接它们然后删除该文件夹。 / p>