Acrofields不使用多页文档打印 - itextsharp



我们正在尝试从包含可编辑的 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");

}

任何帮助表示赞赏

我看到两个主要错误:

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

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

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

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

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

//reader = new PdfReader(output);
//writer.AddDocument(reader);
//reader.Close();

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

使用未完成的结果

在关闭后者之前,您可以检索PdfCopy写入的MemoryStream的内容,因此告诉它完成其输出:

result = newFileStream.ToArray();
writer.Close();

这会导致result是不完整的 PDF。

因此,反过来尝试。(如果随后遇到newFileStream已关闭的问题,请考虑告诉writer不要关闭结果流。

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

最新更新