C# 保存PDF的对话框提示,而不是保存到硬编码路径
我已经成功地实现了iTextSharp.text.pdf来填充我们设置的pdf模板文件。目前,该文件正在自动保存到本地计算机上的特定文件夹中…但我们不希望这样,我们希望用户将填充的PDF保存到其pc上选择的文件夹中。一旦发布此应用程序,我们不希望在服务器上保留任何这些文件 下面的代码创建硬编码的文件路径并填充,但底部提示用户保存文件的部分创建了一个具有我们想要的文件名格式的pdf,但该文件始终为20k且无法打开。如何更改下面的代码,使其不在服务器上实际创建文件,而是在用户选择保存文件时将其创建到pc上C# 保存PDF的对话框提示,而不是保存到硬编码路径,c#,asp.net,pdf,itextsharp,C#,Asp.net,Pdf,Itextsharp,我已经成功地实现了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();
}
我认为您的代码的问题在于您使用的是
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标题,您应该会得到保存文件的提示。您可以尝试将文件内容读入字节[]
数组,并使用MemoryStream
流包装该数组。然后使用MemoryStream
流,而不是您现在使用的FileStream
(因此填写它并写入响应
对象)。您还可以尝试在将流写入响应
流之前重置流以恢复其初始位置。因此,使用MemoryStream代替FileStream?是的,我不确定它是否能解决问题,但它可能会有所帮助。据我所知,你问了两个问题:1。如何不覆盖服务器上的模板PDF文件。2.如何允许用户正确下载更新的文件。这是正确的吗?使用MemoryStream
应该有助于1。对于pdf部分,需要使用模板文件进行填充,然后使用填充的值创建输出文件,最好不要提供输出文件,而是将输出推送到用户下载,而不是直接保存到服务器。由于用户可以根据需要多次请求表单,因此我们不希望对其进行管理,如果您作为用户选择要查看的报表,则会提示您打开表单或保存表单(所有这些都需要在用户pc上进行),而不是在我们的服务器上。希望这是有意义的。将文件填充后的字节(或包含这些字节的流)写入响应
流可能就是这样。这将把填写好的文件直接发送给用户,而不会保存在服务器上。但是,请注意,如果没有实现缓存机制,则每次用户请求文件时都会触发整个填写过程。