如何将 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"
.
您可以尝试以下方法:
- Stream PDF as inline PDF inside iframe 但这会施加大小限制,并且由于安全问题无法在 IE 和旧版浏览器中使用。
- 使用 PDFObject.js 将 PDF 嵌入 HTML 页面(并可选择将其指向 link 以从服务器获取动态生成的 PDF)
我的 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"
.
您可以尝试以下方法:
- Stream PDF as inline PDF inside iframe 但这会施加大小限制,并且由于安全问题无法在 IE 和旧版浏览器中使用。
- 使用 PDFObject.js 将 PDF 嵌入 HTML 页面(并可选择将其指向 link 以从服务器获取动态生成的 PDF)