原来是以为在Web应用程序中显示PDF是很难的一件事,但现在我可以告诉你们,解决这个问题只需要5分钟的时间。
以下这个范例就是一个简单的 ASP.NET 程序,包含一个网页以及一个 IHttpHandler来显示图片,为了让范例尽可能简单,我这边只用了纯粹的服务器端代码而不使用任何浏览器客户端代码。
开始
首先你将需要 Cyotek.GhostScript 与 Cyotek.GhostScript.PdfConversion.zip
定位 gsdll32.dll
为了能让程序正常运行, gsdll32.dll需要放置在你的应用程序路径下。可能在你的Windows 32位系统的 system32文件夹,也可能在Windows 64位系统的 SysWOW64文件夹。
当在开发过程中,我总是让网站根目录下的bin目录存放这个dll文件。当然因为我测试本范例时都是使用自己的机器,所以在IIS的Full Trust信任级别下是正常运行的,但是可不保证在 Medium Trust或者更低的信任级别下能正常工作。
必须运行在 64 位 Windows 系统
你有如下选择:
创建与64位系统对应的 GhostScript.dll.
使用IIS7.0或更高的版本
创建解决方案
1,先创建一个 ASP.NET Web应用程序。然后打开 Default.aspx 添加以下代码
01 |
<%@ Page Language="C#" AutoEventWireup="true" |
02 |
CodeBehind="Default.aspx.cs" Inherits="GhostScriptWebTest._Default" %> |
03 |
04 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
05 |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
06 |
07 |
< html xmlns = "http://www.w3.org/1999/xhtml" > |
08 |
< head runat = "server" > |
09 |
< title >PDF Conversion Example</ title > |
10 |
</ head > |
11 |
< body > |
12 |
< form id = "form1" runat = "server" > |
13 |
< div > |
14 |
< p > |
15 |
< asp:LinkButton runat = "server" ID = "previousLinkButton" |
16 |
Text = "Previous" OnClick = "previousLinkButton_Click" /> |
17 |
< asp:LinkButton runat = "server" ID = "nextLinkButton" |
18 |
Text = "Next" OnClick = "nextLinkButton_Click" /> |
19 |
</ p > |
20 |
< p > |
21 |
< asp:Image runat = "server" ID = "pdfImage" |
22 |
ImageUrl = "~/PdfImage.ashx?fileName=sample.pdf&page=1" /> |
23 |
</ p > |
24 |
</ div > |
25 |
</ form > |
26 |
</ body > |
27 |
</ html > |
整段代码应该很好理解,唯一有意思的就是那个 pdfImage 的Image控件,此控件会调用一个Http handler,也就是我下一部分将讲解的内容。
请注意到 pdfImage 控件是指向到一个 sample.pdf 文件的,所以你在向网站的根目录添加任意pdf文件时请确保pdf文件的 Build Action 被设置为 Content,否则会无效。
创建 Image handler
如何配合IHttpHandler创建图像处理的问题你在网络上可以找到一大堆技术文章,所以我这里就不多说了。注意我下面的代码是以添加了 GhostScript.dll 作引用为前提的。
01 |
using System; |
02 |
using System.Drawing; |
03 |
using System.Drawing.Imaging; |
04 |
using System.Web; |
05 |
using Cyotek.GhostScript.PdfConversion; |
06 |
07 |
namespace GhostScriptWebTest |
08 |
{ |
09 |
public class PdfImage : IHttpHandler |
10 |
{ |
11 |
public void ProcessRequest(HttpContext context) |
12 |
{ |
13 |
string fileName; |
14 |
int pageNumber; |
15 |
Pdf2Image convertor; |
16 |
Bitmap image; |
17 |
18 |
fileName = context.Server.MapPath( "~/" + context.Request.QueryString[ "fileName" ]); |
19 |
pageNumber = Convert.ToInt32(context.Request.QueryString[ "page" ]); |
20 |
21 |
// convert the image |
22 |
convertor = new Pdf2Image(fileName); |
23 |
image = convertor.GetImage(pageNumber); |
24 |
25 |
// set the content type |
26 |
context.Response.ContentType = "image/png" ; |
27 |
28 |
// save the image directly to the response stream |
29 |
image.Save(context.Response.OutputStream, ImageFormat.Png); |
30 |
} |
31 |
32 |
public bool IsReusable |
33 |
{ get { return true ; } } |
34 |
} |
35 |
} |
恩,这也是一段很简单的代码。先通过查询字符串来提取pdf的文件名以及页码索引,然后创建一个Pdf2Image的对象,从pdf文件的指定页中获取图像。
接下来,你需要设置Response的 ContentType对象来让浏览器知道该如何处理。最后我们将图片的流对象直接存储到 Response的 OutputStream属性中。
简单的导航
现在我们能显示PDF了,但是还需要一些基本的导航。打开 Default.aspx.cs 然后添加以下代码
view sourceprint?
01 |
using System; |
02 |
using System.Collections.Specialized; |
03 |
using System.Web; |
04 |
using Cyotek.GhostScript.PdfConversion; |
05 |
06 |
namespace GhostScriptWebTest |
07 |
{ |
08 |
public partial class _Default : System.Web.UI.Page |
09 |
{ |
10 |
protected void previousLinkButton_Click( object sender, EventArgs e) |
11 |
{ |
12 |
this .IncrementPage(-1); |
13 |
} |
14 |
15 |
protected void nextLinkButton_Click( object sender, EventArgs e) |
16 |
{ |
17 |
this .IncrementPage(1); |
18 |
} |
19 |
20 |
private void IncrementPage( int increment) |
21 |
{ |
22 |
NameValueCollection queryString; |
23 |
int pageNumber; |
24 |
string pdfFileName; |
25 |
Pdf2Image converter; |
26 |
27 |
queryString = HttpUtility.ParseQueryString(pdfImage.ImageUrl.Substring(pdfImage.ImageUrl.IndexOf( "?" ))); |
28 |
pdfFileName = queryString[ "fileName" ]; |
29 |
pageNumber = Convert.ToInt32(queryString[ "page" ]) + increment; |
30 |
converter = new Pdf2Image( this .Server.MapPath( "~/" + pdfFileName)); |
31 |
32 |
if (pageNumber > 0 && pageNumber <= converter.PageCount) |
33 |
pdfImage.ImageUrl = string .Format( "~/PdfImage.ashx?fileName={0}&page={1}" , pdfFileName, pageNumber); |
34 |
} |
35 |
} |
36 |
} |
很明显,只需要通过更改页码我们就能得到需要的成果了。
原文链接 :http://www.codeproject.com/Articles/421645/Displaying-the-contents-of-a-PDF-file-in-an-ASP-NE
oschina 原创翻译
发表回复