如何将 pdf 内存流式传输到 HTML 对象

How to memory stream a pdf to a HTML Object

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

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

    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 中,我可以像这样在 <object> 中显示 PDF,这意味着我可以在 <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>

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

要使此页面正常工作,您需要添加一个额外的 handler 来提供字节流,例如GetPdf.ashx。处理程序的 ProcessRequest 方法将准备 PDF 字节流和 return 它在响应中内联,前面有适当的 headers 表明它是 PDF object.

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".

您可以尝试以下方法:

  1. Stream PDF as inline PDF inside iframe 但这会施加大小限制,并且由于安全问题无法在 IE 和旧版浏览器中使用。
  2. 使用 PDFObject.js 将 PDF 嵌入 HTML 页面(并可选择将其指向 link 以从服务器获取动态生成的 PDF)