gpt4 book ai didi

c# - 为什么我的 PDF 生成过程会锁定我站点中的其他 ajax 过程?

转载 作者:行者123 更新时间:2023-11-30 18:32:00 25 4
gpt4 key购买 nike

我有一个 MVC3 应用程序需要定期生成大型报告。用户可以选择他们的标准并启动报告。现在我正在使用 javascript window.open() 方法打开一个新的选项卡/窗口。在生成报告时,用户无法使用该网站。一切都等到报告生成。生成报告的代码是:

private FileStreamResult doSpecReport(List<int> idProjItems)
{
PdfDocument outputDocument = new PdfDocument(); // returning to the user
foreach(var id in idProjItems)
{
var item = _entities.ProjectEquipmentItems.First(f => f.idProjectEquipmentItem == id);
var cutsheetPath = item.CutSheet;
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("p_idEquipmentItem", id.ToString());
var fs = GetReportHtml("NameOfReport", dictionary); // Returns FileStreamResult from crystal

var inputDocument1 = CompatiblePdfReader.Open(fs.FileStream); // add report to output doc
int count = inputDocument1.PageCount;
for(int idx = 0; idx < count; idx++)
{
PdfPage page = inputDocument1.Pages[idx];
outputDocument.AddPage(page);
}

if (!string.IsNullOrEmpty(cutsheetPath))
{
cutsheetPath = Path.Combine(Server.MapPath("~/Files/CutSheetFiles/"), cutsheetPath);
if (File.Exists(cutsheetPath))
{
var inputDocument2 = CompatiblePdfReader.Open(cutsheetPath);//, PdfDocumentOpenMode.Import);
count = inputDocument2.PageCount;
for(int idx = 0; idx < count; idx++)
{
PdfPage page = inputDocument2.Pages[idx];
outputDocument.AddPage(page);
}
}
}
}

var ms = new MemoryStream();
outputDocument.Save(ms, false);
ms.Position = 0;

return new FileStreamResult(ms, "application/pdf")
{
FileDownloadName = "Report.pdf"
};
}

我不确定我是否做错了什么,我不明白为什么这个过程会占用浏览器的所有资源。感谢您的帮助。

更新:调用 doSpecReport 的代码的一个版本。围绕成功的代码不起作用。

$.ajax({
url: url,
data: qdata,
type: "POST",
success: function (result) { // this doesn't actually work.
var obj = $('<object type="application/pdf" width="100%" height="100%" border="2"></object>');
obj.attr('data', 'data:application/pdf;base64,' + result);
$(".mask").hide();
$('#divContainer').append(obj);
}
});

最佳答案

您必须在服务器端生成一个临时文件位置并返回位置 url。您不能使用二进制 PDF 设置 HTML 文档内容。您能否生成报告并将其存储在临时位置并在响应中传递其 url 链接。假设 doSpecReport 生成一个名为 mypdf.pdf 的临时 pdf 文件,

然后在您的成功 block 中,您可以将其添加到对象数据属性中,以便最终对象看起来像this

  <object width="400" height="500" type="application/pdf" data="/my_pdf.pdf?#zoom=85&scrollbar=0&toolbar=0&navpanes=0" id="pdf_content">

</object>

关于c# - 为什么我的 PDF 生成过程会锁定我站点中的其他 ajax 过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com