【问题标题】:Show PDF in HTML in web在网页中以 HTML 格式显示 PDF
【发布时间】:2010-06-14 13:15:23
【问题描述】:

我使用对象标签在 HTML 中呈现 PDF,但我在 MVC 中这样做:

<object data="/JDLCustomer/GetPDFData?projID=<%=ViewData["ProjectID"]%>&folder=<%=ViewData["Folder"] %>"
    type="application/pdf" width="960" height="900">
</object>

控制器/动作是

    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();
        }
    }

问题是,由于我是先从服务器下载数据,然后返回字节数据,所以下载需要一些时间,所以我想显示一些进度来显示处理。

请帮帮我。

【问题讨论】:

    标签: asp.net-mvc pdf


    【解决方案1】:

    您可以尝试以下方法(未在所有浏览器下测试):

    <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>
    

    【讨论】:

      【解决方案2】:

      很遗憾,无法 (afaik) 与 Acrobat 插件交互并查看它何时可以显示您的 PDF 文档。

      有一些组件可以替代 Acrobat 并提供适当的 Javascript 界面。 我在他们的PDFWebViewer.NET 产品上为 TallComponents 工作,该产品将在没有任何插件的情况下显示 PDF 并与 ASP.NET MVC 一起使用。

      不过,您确实还有其他一些选择。如果您需要进度指示器,因为 PDF 生成花费的时间比您希望的要长,您可以使用 AJAX 调用轮询服务器以获取进度。 在服务器上,您需要有一些可用的进度信息,您可以将其作为 ajax 调用的结果返回。在浏览器中,您将使用结果向用户提供进度信息。网上有几个很好的例子(例如this blog)。这里还有其他关于 SO(例如 here)的问题,提供了更多信息的良好指针。

      如果生成过程只需要几秒钟,您可能可以通过显示繁忙指示器来解决问题。当您触发从服务器下载时,这可能就像在您的页面中显示一个 div 一样简单。

      顺便说一句,如果我没记错的话,您应该在 Content-Disposition 标头中将 attachment 关键字替换为 inline。将其设置为attachment 将导致在显示任何内容之前下载整个 PDF。如果您将其设置为内联,Acrobat 将在下载足够的数据后立即开始显示第一页。

      【讨论】:

      • AFAIK 我们不应该使用这个论坛来插入我们自己的产品。
      • 我认为我对产品的参与非常清楚,这在撰写本文时(3 年前!)与常见问题解答一致。有关元here 的更多信息。除此之外,我认为我在答案中提供了足够多的相关信息,这几乎不是促销插件。另请注意,产品已在一年前开源。所有代码都可以在 codeplex herehere 上找到。
      猜你喜欢
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2013-07-20
      • 2011-03-30
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多