【问题标题】:Stream PDF to browser?将 PDF 流式传输到浏览器?
【发布时间】:2013-04-18 02:53:24
【问题描述】:

谁能告诉我如何将 pdf 流式传输到新的标签浏览器?我只是在内存中有 pdf 流,当我单击链接以在新选项卡或窗口浏览器中显示 PDF 时,我想要。 我怎么能那样做? 谢谢!!!

我有这个链接:

<a id="hrefPdf" runat="server" href="#" target="_blank"><asp:Literal ID="PdfName" runat="server"></asp:Literal></a>

在我后面的代码中,我在 onload 事件中有这个:

                Stream pdf= getPdf
                if (pdf != null)
                {
                    SetLinkPDF(pdf);
                }

    private void SetLinkPDF(IFile pdf)
    {
        hrefPdf.href = "MyPDF to the Browser"
        PdfName.Text = pdf.PdfName;      
    }

我必须以某种方式处理流 pdf(IFile 包含 PDF 的名称、流、元数据等)

我可以做些什么来处理这个,当我点击在新浏览器上显示流时?

我有另一个问题,没有工作 OnClientClick="aspnetForm.target='_blank';" timbck2 建议我。我必须在新窗口中打开文件(图像或 pdf),我该怎么办?不工作。谢谢!

Timbbck2 我的asp代码是:

<asp:LinkButton runat="server" ID="LinkButtonFile" OnClick="LinkButtonFile_Click" OnClientClick="aspnetForm.target = '_blank';"></asp:LinkButton>

谢谢!!!

【问题讨论】:

  • 欢迎来到 StackOverflow!要在此处获得积极响应,请展示您的尝试。

标签: c# asp.net pdf stream


【解决方案1】:

要直接在浏览器中显示 pdf,您应该为application/pdf 的响应设置内容类型

您的用户还应该安装某种 pdf 阅读器才能正常工作。

【讨论】:

  • 这是什么意思?是的,但我怎么能从一个链接调用一个新页面并发送 pdf 流???我正在使用网络表单。
【解决方案2】:

你试过Response.BinaryWrite??您可能还想设置一些标题。

【讨论】:

  • 我的信息流中有一些元数据。只需点击链接时显示它,怎么做?
  • 展示您目前编写的一些代码,并尝试更详细地解释您要完成的工作。从您目前的形式来看,您的问题还不是很清楚。
  • 我从我的数据库中得到一个 PDF 作为流,我想在链接中显示它 (name.pdf),当我点击链接时,我想在浏览器中显示 pdf。
【解决方案3】:

我已经通过磁盘上的文件完成了这项工作——从内存流中发送数据应该不会有太大的不同。除了数据本身之外,您还需要向浏览器提供两条元数据。首先,您需要提供数据的 MIME 类型(在您的情况下为 application/pdf),然后在 Content-Length 标头中提供数据的大小(以字节(整数)为单位),然后发送数据本身。

所以总而言之(考虑到 cmets 以及我认为您要问的内容,您的标记将如下所示:

<asp:LinkButton ID="whatever" runat="server" OnClick="lnkButton_Click" 
  OnClientClick="aspnetForm.target='_blank';">your link text</aspnet:LinkButton>

后面代码中的这几行 C# 代码应该可以解决问题(或多或少):

protected void lnkButton_Click(object sender, EventArgs e)
{
    Response.ClearContent();
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "inline; filename=" + docName);
    Response.AddHeader("Content-Length", docSize.ToString());
    Response.BinaryWrite((byte[])docStream);
    Response.End();
}

【讨论】:

  • 是的,但是当我点击链接时,我需要将pdf调用到浏览器,该怎么做?
  • Response.BinaryWrite() 将 pdf 数据发送到浏览器。或者,也许我完全误解了你的问题。我不是 100% 清楚你在问什么。
  • 我想我必须从 Stream 转换为 Byte[] 对吗?那么它浏览的我的 pdf 文件的链接 URL 是什么?
  • 是的,你是对的,Response.BinaryWrite() 的参数需要是一个字节[]。我仍然不明白您对链接 URL 的要求。我会像这样使用 &lt;asp:LinkButton id="whatever" runat="server" onClick="linkButton_Click" onClientClick="aspnetForm.target='_blank';"&gt;link text&lt;/asp:LinkButton&gt;。这有帮助吗?
  • 是的,我想我必须转换为字节数组,但是在我的服务器 onclick 事件上,我必须写什么,上面的代码?是这样吗?提前致谢!
【解决方案4】:

最佳答案建议首先将流转换(转换)为字节[],这会将文件下载到服务器(从它来自的任何流),然后将其发送到客户端。

如果您需要提供Stream 作为某些外部服务的参数(例如我的 Azure 存储),您可以使用以下方法。

public ActionResult Coupons(string file)
{
    Response.AddHeader("Content-Disposition", "inline; filename=" + file);
    Response.ContentType = "application/pdf";
    AzureStorage.DownloadFile(file, Response.OutputStream);//second parameters asks for a 'Stream', you can use whatever stream you want here, just put it in the Response.OutputStream
    return new EmptyResult();
}

这会将文件直接流式传输到客户端(据我所知)。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2013-04-18
    • 2013-05-26
    • 1970-01-01
    • 2010-09-14
    • 2015-04-21
    • 2012-02-17
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多