我已成功实施iTextSharp.text.pdf以填充我们已设置的PDF模板文件。目前该文件正在自动保存到本地计算机上的特定文件夹...但我们不希望这样,我们希望用户将填充的PDF保存到他们选择的PC上。发布此应用程序后,我们不希望在服务器上保留任何这些文件。
下面的代码创建了硬编码的文件路径并填充了它,但是底部提示用户保存文件的部分创建了一个我们想要的文件名格式的pdf,但文件总是20k而且不会打开。如何将以下代码更改为不在服务器上实际创建文件,而是在用户选择保存文件时将其创建给用户?
using (FileStream outfile = new FileStream(outputfile, FileMode.Create))
{
PdfReader rdr = new PdfReader(pdftemplate);
PdfStamper stm = new PdfStamper(rdr, outfile);
AcroFields fields = stm.AcroFields;
foreach (var de in rdr.AcroFields.Fields)
{
if (de.Key == "Date")
{
fields.SetField("Date", dt.Rows[0]["Form Date"].ToString());
}
if (de.Key == "Project Name")
{
fields.SetField("Project Name", dt.Rows[0]["Project Name"].ToString());
}
if (de.Key == "Contract No")
{
fields.SetField("Contract No", dt.Rows[0]["Contract Number"].ToString());
}
}
stm.Close();
rdr.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename=" + newFile);
Response.Write(outfile);
Response.End();
}
答案 0 :(得分:1)
我认为您的代码存在的问题是您正在使用filestream
导致pdf保存到您的服务器。使用memorystream
应该解决这个问题。尝试这样的事情,看看它是否有帮助。
Using (MemoryStream ms = new MemoryStream())
{
PdfReader rdr = new PdfReader(pdftemplate);
PdfStamper stm = new PdfStamper(rdr, ms);
AcroFields fields = stm.AcroFields;
foreach (var de in rdr.AcroFields.Fields)
{
if (de.Key == "Date")
{ fields.SetField("Date", dt.Rows[0]["Form Date"].ToString()); }
if (de.Key == "Project Name")
{ fields.SetField("Project Name", dt.Rows[0]["Project Name"].ToString()); }
if (de.Key == "Contract No")
{ fields.SetField("Contract No", dt.Rows[0]["Contract Number"].ToString()); }
}
stm.Close();
rdr.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename=MyFile.pdf");
//To display pdf in the browser window instead of saving, change attachment to inline
Response.BinaryWrite(ms.ToArray());
Response.End();
}
通过使用MemoryStream
和html标题,您应该收到保存文件的提示。