我想知道是否可以在不使用 MVC 3 中的 3rd 方组件的情况下执行此操作。(尽管我对免费组件持开放态度。)那里有几个链接,但它们似乎主要关注报告和其他代码示例确实声称做这种事情似乎没有编译。我在数据库中保存和检索 PDF 时没有任何问题,但是当我将 PDF 作为 aFile
或 a返回时FileStreamResult
提示用户下载。更理想的方法是在浏览器中实际呈现 PDF。我看过 iTextSHArp,它在一定程度上完成了这项工作,但它不是一个完整的解决方案。例如,当且仅当客户端安装了 Adobe Reader 时,它才会在视图中显示 PDF,否则会提示下载。所以从技术上讲,我主要是在寻找一个 PDF 查看器。有任何想法吗?
3 回答
到目前为止,这似乎是最好的解决方案,尽管我还没有尝试过。它需要移植到 C# 并使 MVC 兼容,但如果您不想在Syncfusion 之类的 3rd 方组件上大放异彩,这似乎是可行的方法。
编辑 12 月 4 日
我花了好几天寻找解决方法,我想我找到了一个很好的解决方法。Ghostscript 转换器已经有许多 C# 包装器,那么为什么不推出自己的方案呢?(我最终做了)。包装:
如果你想要一个更实用的解决方案,Codeproject 上有 2 篇很棒的文章:
如何使用 Ghostscript API 将 PDF 转换为图像
使用 C# 和 GhostScript 将 PDF 转换为一系列图像
但是我觉得解决方案仍然不是最佳的。例如,Ghostscript 转换器适用于文件目录,这意味着您必须在磁盘上生成 PDF 文件的物理副本以供转换器使用,如果这可以使用字节数组来实现会好得多。不过,可能有一种方法可以解决这个问题。
编辑 12 月 21 日
最后,为了完整起见并回答实际问题:
经过更多研究,我得出结论,目前最好的 PDF 查看器是出色的PDF.js库。我已经尝试了一些,对我来说这是迄今为止最好的。我什至尝试过第三方组件(Syncfusion 的 Pdf Viewer),甚至不如 PDF.js 一致或可靠。PDF.js 的缺点:
- 有点混乱和难以开始,文档有点弱
- 它只适用于最新的浏览器(很自然,因为它使用了如此多的 HTML5)。我已经在 Firefox 17 和 Chrome 23 中成功测试了它。它在 IE9 中存在一些问题,但在 IE10 中运行良好。但我一点也不介意。如果您的网站浏览者期望您的应用程序(或任何其他网络应用程序)具有如此强大的功能,那么他们应该使用最新的技术。
- 似乎没有办法(至少我不知道)将 PDF 作为字节数组/流加载,因此如果您希望显示它,则必须在磁盘上创建 PDF 的副本。除了这些微不足道的小问题之外,PDF.js 真的很棒。
我在这里创建了一个 PDF.js 的小型但功能齐全的 MVC 演示。
我一直在使用 iTextSharp,效果很好。我可以设法在单独的窗口中打开 pdf,即使没有安装 Adobe(我在我的 comp 中使用 Foxit Reader)。实际上,在我的示例中,我根本没有使用 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");
}
而我的内容数据作为二进制数据存储在数据库中。
无论如何,也许我误解了你的问题,但这就是我在项目中处理 pdf 的方式,而且我的浏览器从不要求我下载 pdf :)
问候。
iTextSharp是解决这个问题的首选。