【问题标题】:c# How to generate and stream a pdf file to browser on the fly without ever having to write to a local directory [closed]c#如何动态生成pdf文件并将其流式传输到浏览器,而无需写入本地目录[关闭]
【发布时间】:2015-03-11 09:03:18
【问题描述】:

我正在编写一个简单的 asp.net,用户可以将对象列表下载为 PDF 文档。单击“获取 pdf”按钮时,客户端浏览器应询问用户他们希望将文件保存在哪里。就是这样。很直接。

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

PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("c://sample.pdf", FileMode.Create));

真的有必要将文件保存在本地,然后传递给用户,然后谁可以选择再次保存文件?我在这里想念什么吗?有什么方法可以在文件上生成 PDF,然后将其传递给客户端浏览器?

编辑:

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

【问题讨论】:

标签: c# pdf browser pdf-generation itext


【解决方案1】:

您需要将其保存到 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 给出的那样。我认为您不需要将内存流更改为数组。我认为您应该能够直接将内存流写入 response.OutputStream。

【讨论】:

    【解决方案2】:

    如果使用 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();
    }
    

    【讨论】:

    • 谢谢!我查看了无数指南,这些指南只有在我不得不做的时候才让我感到困惑
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 2011-04-21
      • 2010-10-11
      • 2016-08-02
      相关资源
      最近更新 更多