每个记录单页

时间:2013-09-20 23:18:48

标签: pdf itextsharp

我有一个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);
        }
    }

我们需要做的是在内存中创建所有内容,然后将其吐出给用户下载。

1 个答案:

答案 0 :(得分:1)

查看kuujinbo的tutorial here,将PDF合并/拼接在一起。

在您这样做之前,您还需要显然生成PDF。您可能想尝试在一次通过中完成所有操作,但这将很难调试。相反,我建议进行两次传递,第一次创建单个文档,第二次组合它们。您的第一个传递可以暂时将它们写入磁盘或内存。您的代码(和kuujinbo)实际上直接写入Response流,这也是完全有效的,但也更难调试,特别是如果您将所有内容都包装在巨型try/catch中。

您加入的PDF数量和生成频率应确定您临时存储第一个第二遍的位置。如果你只做了一两个并且他们不是巨人我会坚持到MemoryStream并使用.ToArray()字节数据。

如果你有比这更多的PDF或它们相当大或经常调用这个例程或者你有RAM约束,你可能最好先将它们保存到一个唯一的文件夹,拼接它们然后删除该文件夹。 / p>