使用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 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:

<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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章