c#如何动态生成pdf文件并将其流式传输到浏览器,而无需写入本地目录

c#如何动态生成pdf文件并将其流式传输到浏览器,而无需写入本地目录,c#,pdf,browser,pdf-generation,itext,C#,Pdf,Browser,Pdf Generation,Itext,我正在编写一个简单的asp.net,它将允许用户下载一个对象列表作为PDF文档。单击“获取pdf”按钮时,客户端浏览器应询问用户希望将文件保存在何处。就这样。非常直截了当 我找到了一些指南,解释了如何从数据表生成PDF,但所有这些似乎都要求您将PDF保存到某种临时文件中,并在过程中本地存储 PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("c://sample.pdf", FileMode.Create));

我正在编写一个简单的asp.net,它将允许用户下载一个对象列表作为PDF文档。单击“获取pdf”按钮时,客户端浏览器应询问用户希望将文件保存在何处。就这样。非常直截了当

我找到了一些指南,解释了如何从数据表生成PDF,但所有这些似乎都要求您将PDF保存到某种临时文件中,并在过程中本地存储

PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("c://sample.pdf", FileMode.Create));
在本地保存文件并将其传递给用户(用户可以选择再次保存文件)时,是否真的需要这样做?我错过什么了吗?有没有办法在文件上生成PDF,然后将其传递到客户端浏览器

编辑:


具体来说,我在这里讨论的可能是直接向客户端浏览器发送一个流,该文件是动态生成的。在用户收到“是否要下载此文件”提示之前,没有本地存储

这个问题令人困惑,因为不清楚“本地”是什么意思

通常,在服务器上(“远程”)创建PDF时,不需要将PDF存储在服务器的文件系统中。您只需在内存中创建PDF,并将字节传递给
Response.OutputStream
,如中所做

字节被发送到客户端,在那里它们被“本地”存储在最终用户的磁盘上。最终用户可能不会注意到文件存储在本地,因为它存储在临时目录中。为什么存储在本地?因为PDF查看器需要磁盘上的文件。PDF查看器在结尾处开始读取文件。这就是交叉引用表所在的位置。交叉引用表包含PDF中每个对象的字节偏移量。PDF查看器需要随机访问文件才能使用这些对象。另请参见

如果使用iText(如您所见),此函数调用将采用任何类型的流,例如,以下将返回一个字节数组,您可以将其流式传输到客户端,而无需写入磁盘:

using (MemoryStream ms = new MemoryStream())
{
    Document doc = new Document(PageSize.A4, 50, 50, 15, 15);

    PdfWriter writer = PdfWriter.GetInstance(doc, ms);

    //You need to actually write something to the document here...

    return ms.ToArray();
}

您需要将文档保存到Response.OutputStream,而不是将其保存到文件中。在写入PDF内容之前,还应注意不要向浏览器写入任何内容。您还应该将响应流的内容类型设置为PDF mime类型。为了便于用户使用,您应该添加一个指定PDF文件名称的标题。这将确保浏览器打开“文件保存”对话框

Response.Clear();
// Tell server to cache output until asked to flush
Response.BufferOutput = true;
// Set the mime type - tells the browser that a
// PDF document is on the way
Response.ContentType = "application/pdf";
// Give the document a name
Response.AddHeader(
    "content-disposition",
    "attachment; filename=pdf_doc.pdf");

然后将您的PDF文件写入响应流,就像Paddy给出的那样。我认为您不需要将内存流更改为数组。我认为您应该能够直接将memorystream写入response.OutputStream。

检查此项检查此项检查实际上取决于您使用的pdf框架。如果框架有写入流的选项,那么是的,您不需要将其保存为临时文件。谢谢!我看了无数只在我不得不这么做时才设法说服我的导游