【问题标题】:Display ASP.NET generated pdf byte[] to web page without saving the file将 ASP.NET 生成的 pdf byte[] 显示到网页而不保存文件
【发布时间】:2013-06-11 02:10:26
【问题描述】:

我正在使用 iTextSharp 生成 pdf。我可以从 PDF 字节 [] 保存 PDF 文件。

byte[] outputPDF = cnt.CreateBreakPDF();
File.WriteAllBytes(pdfOutPutPath, outputPDF);

将输出byte[] 显示到网页的最佳方式是什么?

我想在页面的 div 中显示 PDF。不是 PDF 作为完整回复。

我已经看到了 MVC 的答案,但我使用的是 ASP.NET Web 应用程序。

有比使用 HTTP 处理程序更好的方法吗?我不想将创建 PDF 的所有详细信息作为查询字符串发送。

【问题讨论】:

    标签: c# asp.net pdf itextsharp mime


    【解决方案1】:

    试试这个

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-length", outputPDF.Length.ToString());
    Response.BinaryWrite(outputPDF);
    

    【讨论】:

    • @SenJacob 你没有在你的问题中指定。更新它,这样你可能会得到更多的答案
    【解决方案2】:

    这样的东西有用吗?

    <div>
    <object data="myPDF.pdf" type="application/pdf" width="200" height="500">
    alt : <a href="myPDF.pdf">myPDF.pdf</a>
    </object>
    </div> 
    

    您只需将 pdf 传递到对象数据源。

    【讨论】:

    • 谢谢,但正如我在问题中所问的,我没有保存的PDF 文件。我需要知道是否可以将PDF bytes 直接嵌入到object。正如我们对 &lt;img src="data:image/jpg;base64,iVBORw0KGgoAAAANS..." /&gt; 之类的图像所做的那样
    【解决方案3】:

    我试过this in jsFiddle,它在Chrome和FF上运行良好,需要在其他浏览器上检查。

    使用将byte[] 转换为Base64

    string base64PDF = System.Convert.ToBase64String(outputPDF, 0, outputPDF.Length);
    

    我所要做的就是在源代码中将MIME type 指定为data:application/pdf;base64,,并给出PDFBase64 版本。

    <object data="data:application/pdf;base64, JVBERi0xLjQKJeLjz9MKMyA..." type="application/pdf" width="160px">
        <embed src="data:application/pdf;base64, JVBERi0xLjQKJeLjz9MKMyA..." type="application/pdf" />
    </object>
    

    我无法通过附加 #toolbar=0&amp;navpanes=0&amp;statusbar=0 来隐藏 FF 中出现的顶部工具栏。

    IE8 需要一个保存的 pdf 文件才能显示。

    【讨论】:

    • 这很好用,但您不需要将&lt;embed&gt; 包装在&lt;object&gt; 中。我刚刚输入了&lt;embed src="data:application/pdf;base64, &lt;%: Model.base64doc %&gt;" type="application/pdf" width="100%" height="500"/&gt;,它运行良好。谢谢。
    • 你有没有幸运地将 Open PDF 参数附加到 base64 源?
    • 我没有尝试发送任何其他参数,而是将 PDF 数据本身作为 base64。但我认为在网络浏览器中,我们可以使用PDF流的arraybuffer响应并将其转换为Uint8Array或blob,然后使用window.URL创建浏览器链接,以便在现代浏览器中更轻松地显示PDF。
    • 我试过这个,它既可以作为对象,也可以作为嵌入。我的 C# 代码类似于: byte[] bPDF = File.ReadAllBytes("filename.pdf");字符串 base64PDF = System.Convert.ToBase64String(bPDF, 0, bPDF.Length);包裹在字符串 str = " ";我的 Razor 代码是 @Html.Raw(PDFModel.strReturnPDF()) 。它显示了全高 PDF,51 页。
    【解决方案4】:

    我一直在将Convert.ToBase64String(content) 用于某些项目而没有任何问题,直到今天,我使用了一个大约 1 MB 的 18 页文件。 Chrome 控制台的错误是Failed to load resource: net::ERR_INVALID_URL。我猜是因为字符串大小?!

    我最终使用了 web api 并将其返回为 FileStreamResult 而不是 Base64 字符串。

    var stream = new MemoryStream();
    await stream.WriteAsync(content, 0, content.Length);
    stream.Position = 0;
    return new FileStreamResult(stream, "application/pdf");
    

    更新:在剃须刀页面上显示基本相同。我刚刚在这里复制了使用 RingCentral 检索传真内容的代码。更好的是,只需使用FileContentResult,因为您已经拥有byte[]

    public async Task<IActionResult> OnGet(string messageId)
    {
        try
        {
            using (var rc = new RingCentral.RestClient(setting.ClientId, setting.ClientSecret, setting.Production, "Fax"))
            {
                await rc.Authorize(setting.UserName, setting.Extension, setting.Password);
                var extension = rc.Restapi().Account().Extension();
                var outputPDF = await extension.MessageStore(messageId).Content(messageId).Get();
    
                return new FileContentResult(outputPDF, "application/pdf");
            }
            return Page();
        }
        catch (Exception ex)
        {
            _logger.Error(ex.Message);
            throw;
        }
    }
    

    【讨论】:

    • 这在服务器部分确实是一个不错的选择。由于问题是关于如何在客户端页面上显示 PDF,请您补充一下您是如何在客户端页面上显示的?
    • @SenJacob 只需调用 api,您就会在页面上看到 pdf。我刚刚发现在剃刀页面上显示是一样的。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2015-03-11
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多