C# ASP.NET-向用户发送PDF

C# ASP.NET-向用户发送PDF,c#,asp.net,C#,Asp.net,我有一个创建PDF的过程。我希望这些PDF是暂时的和短暂的。当用户单击按钮时,我希望能够执行以下操作: string CreatePDF()//returns fileName.pdf PromptUserToDownloadPDF() DeletePDF(fileName.pdf) 我希望避免创建清理过程,并处理用户在运行清理时并发创建PDF时产生的任何竞争条件 在winforms中,我会同步提示用户下载文件。如何在web中执行类似的任务 更新 请注意,我正在使用第三方应用程序创建PDF()

我有一个创建PDF的过程。我希望这些PDF是暂时的和短暂的。当用户单击按钮时,我希望能够执行以下操作:

string CreatePDF()//returns fileName.pdf
PromptUserToDownloadPDF()
DeletePDF(fileName.pdf)
我希望避免创建清理过程,并处理用户在运行清理时并发创建PDF时产生的任何竞争条件

在winforms中,我会同步提示用户下载文件。如何在web中执行类似的任务

更新
请注意,我正在使用第三方应用程序创建PDF()。基本上,我(将)有一个调用命令行的函数:

C:>fop“inputfile”“output.pdf”

所以,在记忆中不是一个选项…除非我能像…那样做

string CreatePDF()//returns fileName.pdf
string RecreatePDFInMemory()
DeletePDF(fileName.pdf)
PromptUserToDownloadPDF()

不确定您的过程,但您应该能够将PDF写入字节[],并完全跳过写入磁盘

byte[] pdf = GetPDFBytes(filename)
MemoryStream pdfStream = new MemoryStream(pdf);
然后使用pdfStream发送回用户。

类似以下内容:

byte[] _pdfbytes = CreatePDF();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Length", _pdfbytes.Length.ToString());
Response.BinaryWrite(_pdfbytes);
因为这会在内存中创建PDF,所以不需要担心清理问题

编辑OP的编辑:


CreatePDF
中,可以使用创建临时文件并执行“fop”写入该文件。在返回
字节[]
之前立即删除该文件。我建议在
finally
块中执行此删除操作。然而,“Fop”确实支持将其输出通过管道传输到标准输出。使用
CreatePDF
函数抓取可能更干净。

您可以使用asp.net页面流式输出文件

我试图为您找到一篇非常老的文章,它用GIF演示了这一点(没有实际的文件)

它制作了一个特殊的页面,用于输出数据(在标题中适当地设置内容类型)


类似地,您可以创建一个“页面”来流式输出PDF,它甚至可能不需要驻留在磁盘上,但如果它驻留在磁盘上,您可以在将其流式输出到浏览器后将其删除。

按照这些思路进行操作

与其他人在不同答案中提到的内容类似,您不需要在系统中保存PDF文件,只需将其作为响应发送即可

我不确定您是如何创建PDF的,但请尝试查看下面的内容,看看您的流程是否可以使用类似的内容

HttpResponse currentResponse = HttpContext.Current.Response;
currentResponse.Clear();
currentResponse.ClearHeaders();
currentResponse.ContentType = "application/pdf";
currentResponse.AppendHeader("Content-Disposition", "attachment; filename=my.pdf");

//create the "my.pdf" here

currentResponse.Flush();
currentResponse.End();

fop确实支持将其输出管道化到标准输出。如果您想使用standardoutput管道化输出,请参阅伟大的答案-您有一些重要的技能。