使用HttpHandler解析并展示PDF文档内容
前言
如果我們想將服務端的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的讀取解析非常簡單,只用如下代碼即可完成:
private?static?string?parseUsingPDFBox(string?filename){
????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;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?ProcessRequest(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:
<system.web>????<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類庫
download the PDFBox package
?
轉載于:https://www.cnblogs.com/blodfox777/archive/2009/03/11/1408568.html
總結
以上是生活随笔為你收集整理的使用HttpHandler解析并展示PDF文档内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存储过程之like写法一
- 下一篇: SPList和SPDocumentLib