如何将pdf内存流转换为HTML对象

时间:2015-08-31 10:32:37

标签: c# pdf code-behind memorystream html-object

我的目标是在内存流中以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>呢?

2 个答案:

答案 0 :(得分:2)

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

要使此页面正常工作,您需要添加一个提供字节流的附加handler,例如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"

答案 1 :(得分:0)

您可以尝试以下方法:

  1. Stream PDF as inline PDF inside iframe但由于安全问题,这会限制尺寸限制而不能在IE和旧浏览器中使用。
  2. 使用PDFObject.js将PDF嵌入到HTML页面中(并可选择将其指向链接以从服务器获取动态生成的PDF)