更新

  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 文件,你需要:

  • Windows 2000 或者后续版本

  • Adobe Acrobat 或 Reader 7.0.5+ (或单独的 Adobe PDF IFilter [adobe.com])

  • IFilter COM 封装类 [dotlucene.net]

  样例代码:

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的启动时间)

 相关信息

  • 在SquarePDF.NET上可以看到本文(和后续更新)。

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

C# 实现将 PDF 转文本的功能相关推荐

  1. 如何使用 Java 将 PDF 转换为文本 (TXT)

    由于在 PDF 上执行简单的编辑任务相对困难,因此通常使用第三方 PDF 编辑器(或高级 Adob​​e 工具)来获得所需的结果.这些解决方案虽然在逐个文件的基础上有效,但对于实现大规模的结果并不是很 ...

  2. PDF Reader Pro,功能强大的 PDF 阅读编辑器

    DF Reader Pro 是一款操作简单,功能强大的PDF处理软件,提供了 PDF文件阅读.注释.PDF创建.页面文字编辑.格式转换.表单创建填写与签名,添加水印,页眉页脚等功能. PDF Read ...

  3. java代码实现对pdf文件文本和图片内容的提取

    教程 pom文件引入jar依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><depend ...

  4. python怎么读取pdf为文本_轻松用Python批量提取PDF文本内容,这个小技巧告诉你!...

    轻松用Python批量提取PDF文本内容,这个小技巧告诉你!-1.jpg (22.73 KB, 下载次数: 0) 2018-9-7 08:33 上传 本文为你展示,如何用Python把许多PDF文件的 ...

  5. OFDRW提供了将OFD文档导出为其他格式文档的能力,如导出为图片、SVG、PDF、文本等

    OFDRW提供了将OFD文档导出为其他格式文档的能力,如导出为图片.SVG.PDF.文本等. OFDRW 转换模块在 2.0.0 之后抽象了多种文档导出接口,使用统一的 API 实现 OFD 文档导出 ...

  6. 巧妙使用ABBYY FineReader PDF 15页面管理功能调整页面布局

    页面管理功能是ABBYY FineReader PDF 15 的一项PDF文档管理功能,允许使用者为当前PDF文档添加新页面.调整格式.创建新PDF文档等,以实现快捷的页面布局功能. 作为一个独立的面 ...

  7. js中显示一个指定html文档,JS实现选定指定HTML元素对象中指定文本内容功能示例...

    本文实例讲述了JS实现选定指定HTML元素对象中指定文本内容功能.分享给大家供大家参考,具体如下: 该功能用处多多,可以灵活运用之!主要函数如下: //选中文本中指定部分 function selec ...

  8. OpenCV绘图和文本输出功能的实例(附完整代码)

    OpenCV绘图和文本输出功能的实例 OpenCV绘图和文本输出功能的实例 OpenCV绘图和文本输出功能的实例 #include "opencv2/core.hpp" #incl ...

  9. 【Qt】简单Qt文本查找功能

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计 04. 执行结果 05. 附录 01. 概述 以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框. ...

最新文章

  1. webservice 接口练习
  2. 并发编程之Java内存模型
  3. 图数据库应用系列(一):金融智能风控
  4. socket的accept函数解析以及服务器和多个客户端的端口问题
  5. C#与PHP字符串解压缩
  6. 疯狂ios之cocos2d中的文本
  7. php7.1 mysql_安装最新LAMP环境 (CentOS7+PHP7.1.5+Mysql5.7)
  8. 获取winform应用程序集信息
  9. 基于Vue的车辆租赁管理系统设计与实现
  10. 根据经纬度计算两点之间的距离
  11. 淘宝平台搜索规则变化,怎么提升搜算转换率?
  12. Java作业(2020 12 05)
  13. 区间再现公式的理解与应用
  14. 你是我生命中最美丽的温暖
  15. 使用git强行切换分支
  16. 强制卸载VS2013
  17. html修改logo,教你用CSS3打造HTML5的Logo
  18. vivado仿真时,输出为高阻态
  19. fastboot 新手刷机傻瓜教程
  20. VMware提示此主机支持Intel VT-x,但Intel VT-x处于禁用状态——解决方法

热门文章

  1. vue中使用Base64编码和解码
  2. devDependencies与dependencies (转载)
  3. eachart图表100px大小原因,及处理办法
  4. java中Arrays的用法
  5. JS 正则匹配字符串
  6. PHP异常处理类(文件上传提示)
  7. Oracle排序中NULL值处理的五种常用方法
  8. SQL Server数据库重命名、数据导出等若干问题
  9. 通过设置Ionic-Cli代理解决ionic serve跨域调试问题
  10. VMware vSphere Client中启动虚拟机提示No boot filename received/Operating System not found解决方法