前言
如果我們想將服務端的PDF文檔內容展示給客戶端,往往會通過URL直接訪問的方式。這樣一來,PDF文檔就會毫無保留的保存到客戶端去,通過瀏覽器的PDF插件,客戶端可以隨意拷貝PDF的副本。(如下圖)
本文通過HttpHandler和開源控件PDFBox來對PDF文檔進行訪問控制,只向客戶端解析並展示PDF的內容而非PDF文件本身。
PDF解析
目前有許多PDF解析組件,國內比較常用的是iTextSharp,該控件早期從JAVA移植過來,完全支持.NET平臺,在創建PDF文檔方面非常靈活易用。然而在讀取解析PDF時卻顯得力不從心,只有少數複雜難用的類可以讓我們讀取PDF。故不適合本案。
PDFBox在此方面表現卻非常突出,同樣,它也是從java平臺移植過來的, 常用來作爲Lucene的PDF索引器。目前,它的開源項目中已經包含了通過IKVM.NET(IKVM.NET is an implementation of Java for Mono and the Microsoft .NET Framework.)封裝,而支持.NET的組件。
PDFBox對PDF的讀取解析非常簡單,只用如下代碼即可完成:
{
PDDocument doc = PDDocument.load(filename);
PDFTextStripper stripper = new PDFTextStripper();
return stripper.getText(doc);
}
故我們選取PDFBox作爲PDF解析器。
編寫HttpHandler
接下來,我們新建一個類庫項目,在其中創建PDFHandler類,實現IHttpHandler接口,用來作爲.pdf文件的handler。
主要完成的步驟如下:
1. 爲類庫和網站添加如下引用:
- PDFBox-0.7.2.dll
- IKVM.GNU.Classpath.dll
並將下面兩個類庫也複製到網站的Bin文件夾中:
- FontBox-0.1.0-dev.dll
- IKVM.Runtime.dll
2. 編寫PDFHandler類:
using System.Collections.Generic;
using System.Text;
using System.Web;
using org.pdfbox.pdmodel;
using org.pdfbox.util;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.IO;
namespace LanceZhang.HTTP
{
public class PDFHandler:IHttpHandler
{
#region IHttpHandler Members
public bool IsReusable
{
get { return true; }
}
public void Proce***equest(HttpContext context)
{
//獲取請求的文件路徑,如C:\www\a.pdf
string path = context.Request.MapPath(context.Request.Path);
//創建PDF實體和文字解析器
PDDocument doc = PDDocument.load(path);
PDFTextStripper stripper = new PDFTextStripper();
//創建一個TextBox用來顯示PDF內容
TextBox tb = new TextBox();
tb.Style.Add("width","100%");
tb.Style.Add("height", "100%");
tb.TextMode = TextBoxMode.MultiLine;
tb.Text=stripper.getText(doc);
//將TextBox render出來
context.Response.Write(RenderControlAsString(tb));
}
public string RenderControlAsString(Control ctl)
{
StringWriter sw = new StringWriter();
HtmlTextWriter writer = new HtmlTextWriter(sw);
ctl.RenderControl(writer);
return sw.ToString();
}
#endregion
}
}
部署HttpHandler
1. 編碼完成後,我們編譯Handler類庫項目,並添加網站對該項目的引用。
2. 要使客戶端對*.pdf文件的請求被handler處理,我們還需要在web.config中配置剛剛編寫好的handler:
<httpHandlers>
<add verb="*" path="*.pdf" type="LanceZhang.HTTP.PDFHandler,LanceZhang.HTTP"/>
</httpHandlers>
</system.web>
3. 這時,使用Visual Studio自帶的ASP.NET Deployment Server已經可以成功運行程序了。然而,如果將網站部署到IIS中,我們還需要對IIS的應用程序配置做出修改,在程序映射中,使用aspnet_isapi.dll來處理.pdf文件:
OK,接下來啓動IIS,瀏覽“CardSpace.pdf”文件,我們就可以得到下面的效果:
下載PDFBox類庫