我正在使用object标签以HTML格式呈现PDF,但我在MVC中这样做:
<object data="/JDLCustomer/GetPDFData?projID=<%=ViewData["ProjectID"]%>&folder=<%=ViewData["Folder"] %>"
type="application/pdf" width="960" height="900">
</object>
和Controller / Action是
public void GetPDFData(string projID, Project_Thin.Folders folder)
{
Highmark.BLL.Models.Project proj = GetProject(projID);
List<File> ff = proj.GetFiles(folder, false);
if (ff != null && ff.Count > 0 && ff.Where(p => p.FileExtension == "pdf").Count() > 0)
{
ff = ff.Where(p => p.FileExtension == "pdf").ToList();
Response.ClearHeaders();
Highmark.BLL.PDF.JDLCustomerPDF pdfObj = new JDLCustomerPDF(ff, proj.SimpleDbID);
byte[] bArr = pdfObj.GetPDF(Response.OutputStream);
pdfObj = null;
Response.ContentType = "application/" + System.IO.Path.GetExtension("TakeOffPlans").Replace(".", "");
Response.AddHeader("Content-disposition", "attachment; filename=\"TakeOffPlans\"");
Response.BinaryWrite(bArr);
Response.Flush();
}
}
问题是,当我首先从服务器下载数据然后返回字节数据时,下载需要一些时间,因此我想展示一些显示处理的进度。
请帮我解决这个问题。
答案 0 :(得分:0)
您可以尝试以下操作(未在所有浏览器下测试):
<div style="background: transparent url(progress.gif) no-repeat">
<object
data="<%= Url.Action("GetPDFData, new { projID = ViewData["ProjectID"], folder = ViewData["Folder"] }") %>"
type="application/pdf"
width="640"
height="480">
<param value="transparent" name="wmode"/>
</object>
</div>
答案 1 :(得分:-2)
不幸的是,没有办法(afaik)与Acrobat插件进行交互,看看它什么时候可以显示你的PDF文档。
有些组件可以替代Acrobat并提供正确的Javascript界面。 我在他们的PDFWebViewer.NET产品上为TallComponents工作,该产品将显示没有任何插件的PDF并与ASP.NET MVC一起使用。
你确实有其他选择。如果您需要进度指示器,因为PDF生成所花费的时间比您想要的时间长,您可以使用AJAX调用轮询服务器以获取进度。 在服务器上,您需要获得某些可用的进度信息,您可以根据ajax调用返回这些信息。在浏览器中,您将使用结果向用户提供进度信息。网上有几个很好的例子(例如this blog)。此处还有其他问题(例如here),其中包含更多信息的指示。
如果生成过程只需要几秒钟,您可能会显示忙碌指示符。这可能就像从服务器触发下载时在页面中显示div一样简单。
顺便说一句,如果我没弄错的话,您应该将attachment
关键字替换为inline
标题中的Content-Disposition
。将其设置为attachment
将导致在显示任何内容之前下载整个PDF。如果将其设置为内联,Acrobat将在下载足够数据后立即显示第一页。