Acrofields无法使用多页文档进行打印-Itextsharp

时间:2018-08-30 07:09:48

标签: c# pdf itext

我们正尝试从包含可编辑acrofields的单个模板pdf打印/创建多页pdf。在用于简单的单页时,似乎可以找到该代码。但是,当尝试进行多页打印时,多页pdf打印时似乎没有显示值。

此代码如下

   public ActionResult InsertUpdateFoodCourtMultiple(string FoodCourt, int EmployeeId, string EmployeeNo, DateTime FromDate, DateTime ToDate)
    {
        iTextSharp.text.Document document = new iTextSharp.text.Document();

        String fileName = "";
        fileName = "FoodToken.pdf";
        string filePath = "~/Content/Files/" + fileName;
        byte[] result;

        //create newFileStream object which will be disposed at the end
        using (MemoryStream newFileStream = new MemoryStream())
        {
            // step 2: we create a writer that listens to the document
            PdfCopy writer = new PdfCopy(document, newFileStream);

            // step 3: we open the document
            document.Open();

            while (FromDate <= ToDate)
            {

            var reader = new PdfReader(Server.MapPath(filePath));

            MemoryStream output = new MemoryStream();
            var stamper = new PdfStamper(reader, output);

            stamper.AcroFields.SetField("TxtSerial", EmployeeId.ToString());
            stamper.AcroFields.SetField("TxtEmployeeId", EmployeeNo);
            stamper.AcroFields.SetField("TxtDate", FromDate.ToString("dd-MMM-yyyy"));
            stamper.AcroFields.SetField("TxtIssuedBy", SessionHelper.GetLoggedInUser().FirstName + " " + SessionHelper.GetLoggedInUser().LastName);
            stamper.AcroFields.SetField("TxtMeal", " - " + FoodCourt);
            stamper.FormFlattening = true;



                // step 4: we add content
                for (int i = 1; i <= reader.NumberOfPages; i++)
                {
                    PdfImportedPage page = writer.GetImportedPage(reader, i);
                    writer.AddPage(page);
                }
                stamper.Close();
            //    writer.AddDocument(reader);
                reader.Close();

                // step 5: we close the document and writer

                //reader = new PdfReader(output);

                //writer.AddDocument(reader);
                //reader.Close();
                FromDate = FromDate.AddDays(1);

            }
            result = newFileStream.ToArray();

            writer.Close();
        }//disposes the newFileStream object

        document.Close();
        Response.AddHeader("Content-Disposition", "inline; filename=" + fileName);
        Response.ContentType = "application/pdf";

        return File(result, "application/pdf");


    }

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

我看到两个主要错误:

复制未更改的原件,而不是填写的副本

在您的while循环中,将当前FromDate的文档添加到PdfCopy

for (int i = 1; i <= reader.NumberOfPages; i++)
{
    PdfImportedPage page = writer.GetImportedPage(reader, i);
    writer.AddPage(page);
}

但是,错误是,您从reader中添加了包含原始“ FoodToken.pdf”(而不是已填写的版本)的页面在stamper中创建。实际上,您实际上完全忽略了stamper的结果。

您在注释中的代码表明您可能曾经尝试过尝试将填充版本添加到PdfCopy实例的代码:

//reader = new PdfReader(output);

//writer.AddDocument(reader);
//reader.Close();

这是您应该尝试使用的代码。 (如果该代码的问题是output已经关闭,请考虑告诉stamper不要关闭结果流,或者只是检索其字节。)

使用未完成的结果

在关闭MemoryStream之前,您要检索PdfCopy写入的result = newFileStream.ToArray(); writer.Close(); 的内容,然后告诉它完成输出:

result

这导致newFileStream是不完整的PDF。

因此,尝试另一种方法。 (如果然后遇到writer已关闭的问题,请考虑告诉document不要关闭结果流。)

您不应该做的另一件事是在处置其输出定向到的MemoryStream之后关闭writer。在这里,您可能很幸运,因为在将document.Close()设为NOP之前关闭了Close;不过,一般来说,这样的grunt-html-validation调用很可能会导致某些异常。