很简单,我需要从多个 PDF(实际上很多)中提取文本,以便在将其粘贴到 SQL 数据库之前分析内容。
我发现了一些相当粗略的免费 C# 库,可以工作(最好的一个使用 iTextSharp),但存在无数格式错误,一些字符被打乱,而且很多时候单词内部到处都有空格 (' ') ,每个字母之间,大块的字母占据了好几行,这一切看起来都有点随机。
是否有任何简单的方法可以做到这一点,而我完全忽略了(很可能!),或者这是一项艰巨的任务,需要将提取的字节值可靠地转换为字母?
可靠地做到这一点可能会有些困难。问题是 PDF 是一种重视良好排版的“演示文稿”格式。假设您只想输出一个单词:Tap。 PDF 渲染引擎可能会将其输出为 2 个单独的调用,如以下伪代码所示:
moveto (x1, y); output ("T")
moveto (x2, y); output ("ap")
这样做是因为字母 T 和 a 之间的默认kerning
(字母间距)可能无法被渲染引擎接受,或者它可能会添加或删除字符之间的一些微小空间以获得完全合理的行。最终导致的结果是,在 PDF 中找到的实际文本片段通常不是完整的单词,而是其中的片段。
这是使用 IKVM 的非常好的 Tika java 库的包装。非常易于使用,可处理除 PDF 之外的各种文件类型,包括新旧办公格式。它将根据文件扩展名自动选择解析器,因此非常简单:
var text = new TextExtractor().Extract(file.FullName).Text;
此解决方案的一个警告是 IKVM 的开发已结束。我不确定这从长远来看意味着什么。 http://weblog.ikvm.net/2017/04/21/TheEndOfIKVMNET.aspx
。我个人使用过基于 iFilter 的方法,如果您需要轻松支持其他文件类型,它似乎工作得很好。示例代码这里。