在Web中以HTML格式显示PDF

时间:2010-06-14 13:15:23

标签: asp.net-mvc pdf

我正在使用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();
        }
    }

问题是,当我首先从服务器下载数据然后返回字节数据时,下载需要一些时间,因此我想展示一些显示处理的进度。

请帮我解决这个问题。

2 个答案:

答案 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将在下载足够数据后立即显示第一页。