在c# Mvc中使用ajax调用在屏幕上显示Pdf
本文关键字:屏幕 显示 Pdf 调用 Mvc ajax | 更新日期: 2023-09-27 18:07:01
我正在使用ItextSharp使用html到Pdf生成Pdf。我想在屏幕上显示Pdf的预览,以便用户可以看到它。用户将能够玩周围的html和得到所需的结果pdf。我正在正确生成pdf,但在屏幕上显示时遇到问题。
Ajax调用:
function Preview()
{
var HtmlInfo = document.getElementById('HtmlToBarCodes').value;
$.ajax({
url: '/BarCodeGenerator/PreviewPDF',
type: 'POST',
cache: false,
data: { Html: HtmlInfo },
success: function (data) {
Loading = false;
$("#pdfResult").html(
$('<iframe>', {
src: data,
width: '600px',
height: "800px"
}));
},
error: function (x) {
Loading = false;
}
});
}
控制器
[HttpPost]
[ValidateInput(false)]
public FilePathResult PreviewPDF(string Html)
{
FileStream fs = null;
string pdfFilePath = "";
try
{
//ItextSharp, Html -> Pdf
pdfFilePath = BLL.GenerateBarCodes.GenerateBarcodes(Html, 5);
Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = true;
Response.AppendHeader("Content-Disposition", "inline; attachment; filename=Preview.pdf");
Response.ContentType = "application/pdf";
Response.WriteFile(pdfFilePath);
Response.Flush();
Response.End();
//fs = new FileStream(pdfFilePath, FileMode.Open, FileAccess.Read);
}
catch (Exception ex)
{
//ToDo: log error
}
return File(pdfFilePath, "application/pdf", "Preview.pdf");
}
我可以确认Pdf正在生成和保存在我的C:Temp文件夹中,我也可以查看它,但是当我点击预览时,我得到的都是空白。我不确定如何从ajax调用加载pdf数据,或者如果它甚至是可能的。
有许多解决方案和变通方法。我将指出两个解决方案。
解决方案1:
步骤1:在后端生成PDF并保存在服务器位置。该pdf可以通过URL访问。
步骤2:传递URL作为AJAX调用的响应。
步骤3:获得ajax响应并设置为iframe并显示iframe在这个答案中有很多预览pdf的方法。
引用:
在HTML中嵌入PDF的推荐方法?
使用AJAX调用显示PDF
你可以使用下面的jquery代码显示你的pdf
var iframe = $('<iframe>');
iframe.attr('src','http://www.pdf995.com/samples/pdf.pdf');
$('#targetDiv').append(iframe);
解决方案2:使用标签。请通读这篇文章。
您不一定需要Ajax。如果在服务器端代码中将内容配置设置为附件,那么只需一个链接就足够了。通过这种方式,父页面将保持打开状态,如果这是您主要关心的问题(否则为什么要不必要地选择Ajax呢?)此外,没有办法以异步方式很好地处理这个问题。PDF不是字符数据。它是二进制数据。你不能做像$(element).load()这样的事情。您需要为此使用全新的请求。pdf是非常合适的。
参考:
使用Ajax下载并打开pdf文件
iframe
src
属性需要一个URI,而不是填充iframe
的原始数据。
你有两个选择
a)使用srcdoc属性(如果你只需要支持最新的浏览器)。
b)从数据构造一个数据URI并使用它作为src
下面是两种方法的示例
var data = "<html><body>hello world</body></html>"
$(function() {
$("#target").append($("<iframe>", {
srcdoc: data
}));
var dataUri = "data:text/html;base64," + btoa(data);
$("#target").append($("<iframe>", {
src: dataUri
}));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js">
</script>
<div id=target></div>
编辑:当然,pdf
是二进制格式。您可以下载一个blob,创建一个数据URI并获胜!
$(function() {
var oReq = new XMLHttpRequest();
oReq.open("GET", "/somedoc.pdf", true);
oReq.responseType = "blob";
oReq.onload = function (oEvent) {
var blob = oReq.response;
var url = URL.createObjectURL(blob);
$("#target").append($("<iframe>", { src: url }));
};
oReq.send();
})