我的目标是在内存流中以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>
呢?
答案 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)
您可以尝试以下方法: