如何内存流一个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>
呢?
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"
.
您可以尝试以下操作:
- 将PDF作为内联PDF在iframe中流式传输,但这会施加大小限制,并且由于安全问题而无法在IE和旧浏览器中工作。
- 使用PDFObject.js将PDF嵌入到HTML页面中(并可选择将其指向链接以从服务器动态生成PDF)