博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 实现将 PDF 转文本的功能
阅读量:6547 次
发布时间:2019-06-24

本文共 2239 字,大约阅读时间需要 7 分钟。

更新

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

  这篇文章和对应的Visual Studio项目已经更新到目前最新的 PDFBox 版本(1.8.4)。可以从 下载包含所有依赖内容的完整项目(要消除依赖关系有点棘手)。

 如何解析 PDF 文件

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

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

  • iTextSharp;

  • PDFBox。

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

 Adobe PDF IFilter

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

  • Windows 2000 或者后续版本

  • Adobe Acrobat 或 Reader 7.0.5+ (或单独的  [adobe.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

   是一个 Java 的PDF 操作库 的.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();
  
}
}

  信用证: 

  缺点:

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

 PDFBox

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

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

  在.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)

  速度还可以:解析 (5.1 MB)文件用了13秒。

  感谢提供的改进建议。

  缺点:

  1. IKVM.NET依赖 (18 MB)

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

 相关信息

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

  原文地址:

转载地址:http://ehedo.baihongyu.com/

你可能感兴趣的文章
Permutation Test 置换检验
查看>>
喵哈哈村的魔法考试 Round #19 (Div.2) 题解
查看>>
添加商品验证商品是否存在的两种实现方式
查看>>
《java虚拟机》汇总所有关键要点
查看>>
Win7 VNC远程连接Centos桌面
查看>>
使用cookie记录页面跳转次数,然后从最后一级页面跳转回首页面
查看>>
Eclipse和MyEclipse工程描述符.classpath和.project和.mymetadata详解(转)
查看>>
2016年互联网企业收入规模统计及分析
查看>>
软件复杂性的通俗理解
查看>>
批量更新代码整理(代码库)从数组中批量取数据的方法
查看>>
Contiki源码+原理+功能+编程+移植+驱动+网络(转)
查看>>
检测用户命令序列异常——使用LSTM分类算法【使用朴素贝叶斯,类似垃圾邮件分类的做法也可以,将命令序列看成是垃圾邮件】...
查看>>
Centos6.5安装步骤(U盘安装)
查看>>
cf1060D. Social Circles(贪心)
查看>>
JSON Web Token(JWT)原理和用法介绍
查看>>
Mybatis连接mysql数据库出现乱码
查看>>
IP Helper API 使用方法
查看>>
30天敏捷结果(14):要事第一
查看>>
产品线工程:软件产品线-规模化产品开发介绍
查看>>
申明一个函数指针,并且该函数的返回值也是一个函数指针 -- 示例代码
查看>>