从MVC视图中的数据库中呈现PDF?

时间:2012-11-29 17:54:19

标签: asp.net asp.net-mvc asp.net-mvc-3 pdf

我想知道是否可以在不使用MVC 3中的第三方组件的情况下执行此操作。(虽然我对免费组件持开放态度。)有几个链接,但它们似乎主要关注报告和其他声称做这种事情的代码示例似乎没有编译。我在保存和从我的数据库中检索PDF方面没有任何问题,但当我将PDF作为FileFileStreamResult返回时,会提示用户下载。更理想的方法是在浏览器中实际呈现PDF。我已经看过iTextSHarp,它在一定程度上完成了这项工作,但它不是一个完整的解决方案。例如,当且仅当客户端安装了Adobe Reader时,它才会在视图中显示PDF,否则会提示下载。从技术上讲,我主要是在寻找一个PDF查看器。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

截至目前,this似乎是最佳解决方案,但我还没有尝试过。它需要被移植到C#并使MVC兼容,但是如果你不想在第三方组件like Syncfusion上展开,这似乎是要走的路。

12月4日编辑

我花了好几天寻找解决方法,我想我找到了一个非常好的解决方案。 ghostscript转换器已经有很多C#包装器,为什么不推出自己的方案呢? (我最终做了)。包装器:

Mark Redman's Wrapper

Matt Ephraim's Wrapper

如果你想要一个更实用的解决方案,Codeproject上有两篇很棒的文章:

How To Convert PDF to Image Using Ghostscript API

Convert a PDF into a series of images using C# and GhostScript

但是我觉得解决方案仍然不是最优的。例如,Ghostscript转换器与文件目录一起工作,这意味着您必须在磁盘上生成PDF文件的物理副本以供转换器使用,如果可以使用字节数组实现这一目标会好得多。可能有办法解决这个问题。

12月21日编辑

最后,为了完整起见并回答实际问题:

经过一番研究后,我得出结论,目前最好的PDF查看器是精彩的PDF.js库。我已经尝试了一些,对我来说这是迄今为止最好的。我甚至尝试过第三方组件(Syncfusion's Pdf Viewer),甚至不像PDF.js那样一致或可靠。 PDF.js的缺点:

  1. 有点令人困惑,很难开始,文档很简单
  2. 它只适用于最新的浏览器(因为它使用了很多HTML5,因此很自然)。我已经在Firefox 17和Chrome 23中成功测试了它。它在IE9中有一些问题,但在IE10中运行得非常好。但我根本不介意。如果您的网站浏览者希望您的应用程序(或任何其他Web应用程序)具有如此强大的功能,那么他们应该使用最新技术。
  3. 似乎没有办法(至少不是我知道的)将PDF加载为字节数组/流,因此如果您希望在磁盘上创建PDF的副本显示它。除了这些可以忽略不计的打嗝之外,PDF.js确实令人惊叹。
  4. 我已经创建了一个小型但功能齐全的PDF.js here MVC演示。

答案 1 :(得分:2)

我一直在使用iTextSharp,效果很好。我可以设法在单独的窗口中打开pdf,甚至没有安装Adobe(我在我的comp中使用福昕阅读器)。实际上在我的例子中我根本没有使用iTextSharp。

我的观点:

<a href="@Url.Action("RetreiveFile", "File", new { id = fileId })" target="_blank">
    OpenPdf
</a>

我的控制器:

    public ActionResult RetreiveFile(int id)
    {
        ComplexClass myClass= _FileModel.GetFile(id);
        byte[] img = myClass.ContentData.ToArray();
        Response.AppendHeader("Content-Disposition", "inline; filename=xyz.pdf");
        return File(img, "application/pdf");
    }

而我的contentdata作为二进制数据存储在数据库中。

无论如何,也许我误解了你的问题,但这就是我在项目中处理pdf的方式,我的浏览器从未要求我下载pdf:)

问候。

答案 2 :(得分:-1)

iTextSharp是解决此问题的方法。