zoukankan      html  css  js  c++  java
  • C# 实现将 PDF 转文本的功能

     更新

      2014年2月27日: 这篇文章最初只描述使用 PDFBox 来解析PDF文件。现在它已经被扩展到包括使用 IFilter 和 iTextSharp 的例程了。

      这篇文章和对应的Visual Studio项目已经更新到目前最新的 PDFBox 版本(1.8.4)。可以从http://www.squarepdf.net/how-to-convert-pdf-to-text-in-net-sample-project/ 下载包含所有依赖内容的完整项目(要消除依赖关系有点棘手)。

     如何解析 PDF 文件

      在.NET中从PDF文件里提取文本的几种主要方法有:

    • Microsoft 的 IFilter 接口 和 Adobe 的 IFilter 实现;

    • iTextSharp;

    • PDFBox。

      不幸的是这些 PDF 解析方案都不完美。我们将在下面讨论这些方法。

     Adobe PDF IFilter

      为了使用 IFilter 接口来解析 PDF 文件,你需要:

      样例代码:

    1
    2
    3
    4
    5
    6
    7
    using IFilter;
     
    // ...
     
    public static string ExtractTextFromPdf(string path) {
      return DefaultParser.Extract(path); 
    }

      缺点:

    1. 使用了不可靠的 COM 互操作来处理 IFilter 接口 (并且组合 IFilter COM、 Adobe PDF IFilter 特别麻烦)。

    2. 需要在目标系统上单独安装 Adobe IFilter。如果你需要对其它人发布可索引的解决方案,会很痛苦。

     iTextSharp

      iTextSharp(http://sourceforge.net/projects/itextsharp/) 是一个 Java 的PDF 操作库iText(http://itextpdf.com/) 的.NET输出。它主要着眼于编辑PDF而不是阅读,但它当然也支持从PDF中提取文本(尽管有点大材小用)。

      例程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using iTextSharp.text.pdf;
    using iTextSharp.text.pdf.parser;
     
    // ...
      
    public static string ExtractTextFromPdf(string path)
    {
      using (PdfReader reader = new PdfReader(path))
      {
        StringBuilder text = new StringBuilder();
     
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            text.Append(PdfTextExtractor.GetTextFromPage(reader, i));
        }
     
        return text.ToString();
      }
    }

      信用证: 成员号 10364982

      缺点:

    1. 需要许可证(如果你不喜欢 AGPL许可证 的话)

     PDFBox

      PDFBox是另一个Java PDF类库。它同时也可以与原来的Java Lucene一同使用(参见LucenePDFDocument)。

      幸运的是,PDFBox有一个使用IKVM.NET开发的.NET版本 (只需访问PDFBox下载页)。

      在.NET中使用PDFBox需要引用:

    • IKVM.OpenJDK.Core.dll

    • IKVM.OpenJDK.SwingAWT.dll

    • pdfbox-1.8.4.dll

      并将下列文件复制到bin文件夹下:

    • commons-logging.dll

    • fontbox-1.8.4.dll

    • IKVM.OpenJDK.Util.dll

    • IKVM.Runtime.dll

      使用PDFBox解析PDF十分简单:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using org.apache.pdfbox.pdmodel;
    using org.apache.pdfbox.util;
     
    // ...
     
    private static string ExtractTextFromPdf(string path)
    {
      PDDocument doc = null;
      try {
        doc = PDDocument.load(path)
        PDFTextStripper stripper = new PDFTextStripper();
        return stripper.getText(doc);
      }
      finally {
        if (doc != null) {
          doc.close();
        }
      }
    }

      编译后的大小加起来差不多有18MB:

    • IKVM.OpenJDK.Core.dll (4 MB)

    • IKVM.OpenJDK.SwingAWT.dll (6 MB)

    • pdfbox-1.8.4.dll (4 MB)

    • commons-logging.dll (82 kB)

    • fontbox-1.8.4.dll (180 kB)

    • IKVM.OpenJDK.Util.dll (2 MB)

    • IKVM.Runtime.dll (1 MB)

      速度还可以:解析U.S. Copyright Act PDF (5.1 MB)文件用了13秒。

      感谢bobrien100提供的改进建议。

      缺点:

    1. IKVM.NET依赖 (18 MB)

    2. 速度(尤其是IKVM.NET的启动时间)

     相关信息

      原文地址:http://www.codeproject.com/Articles/12445/Converting-PDF-to-Text-in-C

  • 相关阅读:
    xml文件格式例如以下
    Nio学习3——基础模型:多路复用模型
    BP神经网络基本原理
    WPS2012交叉引用技巧,word比wps这点强更新參考文献
    hdu1023
    使用MERGE语句同步表
    商业软件编程非常无聊?
    jQuery Easy UI Panel(面板)组件
    很具体GC学习笔记
    cocos2dx-js学习笔记(一)环境搭建
  • 原文地址:https://www.cnblogs.com/ranzige/p/3586862.html
Copyright © 2011-2022 走看看