如何内存流一个pdf到一个HTML对象

本文关键字:一个 pdf 对象 HTML 何内存 内存 | 更新日期: 2023-09-27 18:10:27

我的目标是在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中,我可以在<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>呢?

如何内存流一个pdf到一个HTML对象

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填充data属性,例如:"GetPdf.ashx" .

您可以尝试以下操作:

  1. 将PDF作为内联PDF在iframe中流式传输,但这会施加大小限制,并且由于安全问题而无法在IE和旧浏览器中工作。
  2. 使用PDFObject.js将PDF嵌入到HTML页面中(并可选择将其指向链接以从服务器动态生成PDF)