2

我的目标是html-<object>从内存流中显示 PDF。

从后面的 C# 代码中,我可以从内存流中获取 PDF 以在这样的浏览器中显示,这将有效地将整个浏览器转换为 PDF 阅读器(不理想),因为我失去了我的应用程序控件等。我想保留应用程序的感觉就像一切都在一种形式中:

    MyWeb.Service.Retrieve.GetPdfById r = new MyWeb.Service.Retrieve.GetPdfById();

            MemoryStream byteStream = new MemoryStream(r.Execute("705"));
            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "inline; filename=dummy.pdf");
            Response.AddHeader("content-length", byteStream.Length.ToString());
            Response.BinaryWrite(byteStream.ToArray());
            Response.End();

在 HTML 中,我可以让 PDF 显示在<object>这样的格式中,这意味着我可以理想地显示它,<div>但它不是来自动态生成的内存流:

    <object data="PDF_File/myFile.pdf" type="application/pdf" width="800px"height="600px">
      alt : <a href="PDF_File/myFile.pdf">TAG.pdf</a>
    </object>

那么如何将内存流放入HTML-<object>请?

4

2 回答 2

2

object 标签的data属性应该包含一个 URL,该 URL 指向将提供 PDF 字节流的端点。

要使该页面正常工作,您需要添加一个提供字节流的附加处理程序,例如 GetPdf.ashx。处理程序的 ProcessRequest 方法将准备 PDF 字节流并在响应中内联返回它,前面是适当的标头,表明它是一个 PDF 对象。

protected void ProcessRequest(HttpContext context)
{
    byte[] pdfBytes = GetPdfBytes(); //This is where you should be calling the appropriate APIs to get the PDF as a stream of bytes
    var response = context.Response;
    response.ClearContent();
    response.ContentType = "application/pdf";
    response.AddHeader("Content-Disposition", "inline");
    response.AddHeader("Content-Length", pdfBytes.Length.ToString());
    response.BinaryWrite(pdfBytes); 
    response.End();
}

使用指向处理程序的 URL 填充数据属性,例如 "GetPdf.ashx".

于 2015-08-31T10:51:17.670 回答
0

您可以尝试以下方法:

  1. 在 iframe 中将 PDF 作为内联 PDF 流式传输,但这会施加大小限制,并且由于安全问题而无法在 IE 和旧版浏览器中运行。
  2. 使用PDFObject.js将 PDF 嵌入 HTML 页面(并可选择将其指向链接以从服务器获取动态生成的 PDF)
于 2015-09-01T08:15:15.947 回答