【问题标题】:Extracting text from PDFs in C# [closed]在 C# 中从 PDF 中提取文本 [关闭]
【发布时间】:2011-01-08 03:44:12
【问题描述】:

很简单,我需要从多个 PDF 中提取文本(实际上很多),以便在将内容粘贴到 SQL 数据库之前对其进行分析。

我发现了一些相当粗略的免费 C# 库,它们可以工作(最好的库使用 iTextSharp),但存在大量格式错误,并且一些字符被打乱,而且很多时候到处都有空格 (' ') -字里行间,每个字母之间,大块的占了好几行,显得有些随意。

是否有任何简单的方法可以做到这一点,而我完全忽略了(很可能!),还是将提取的字节值可靠地转换为字母是一项艰巨的任务?

【问题讨论】:

标签: c# pdf text extract


【解决方案1】:

可靠地执行此操作可能有些困难。问题在于 PDF 是一种 presentation 格式,它重视良好的排版。假设您只想输出一个单词:Tap

PDF 渲染引擎可能会将其输出为 2 个单独的调用,如下伪代码所示:

moveto (x1, y); output ("T")
moveto (x2, y); output ("ap")

这样做是因为字母 T 和 a 之间的默认 kerning(字母间距)可能无法被渲染引擎接受,或者它可能会在它们之间添加或删除一些微小空间字符以获得完全对齐的行。这最终导致在 PDF 中找到的实际文本片段通常不是完整的单词,而是它们的片段。

【讨论】:

  • 很好地描述了从 PDF 中提取文本的潜在困难。
  • 此外,PDF 最终会放置 字形,而不是文本。在许多 PDF 中,字形索引与 Unicode 代码点相同,但它们可能会有所不同,在这种情况下,除非还明确添加了文本,否则只会出现乱码。
【解决方案2】:

您可以尝试Docotic.Pdf library(免责声明:我为 Bit Miracle 工作)从 PDF 文件中提取文本。该库使用一些启发式方法来提取美观的文本,而单词中的字母之间没有多余的空格。

请查看显示how to extract text from PDF 的示例。

【讨论】:

  • 扫描的 PDF 文档/低分辨率文档效果不佳。
【解决方案3】:

您可以尝试使用 .NET 中的文本/数据提取框架 Toxy。它支持 .NET 标准 2.0。详情请访问https://github.com/nissl-lab/toxy

【讨论】:

  • -1 这与 PDF 没有任何关系(目前)。您不妨告诉我们访问websitethatplansonhavingcodetoextracttextfrompdfsoneday.com
  • 我说过会的。无论如何,你很快就会看到它。我会在六月之前提供。
  • Toxy 1.0 在这里。现在支持PDF
  • 更新你的答案,这样我就可以删除我的 -1。 :-)
  • 我已将 Toxy 更新为使用使用 MIT 许可证的 PDFSharp。新的更新在 Toxy 1.4 版本中可用
【解决方案4】:

如果您正在寻找“免费”替代方案,请查看PDF Clown。我个人使用过基于 iFilter 的方法,如果您需要轻松支持其他文件类型,它似乎可以正常工作。示例代码here

【讨论】:

    【解决方案5】:

    看看 DotNet 上的 Tika,可通过 Nuget 获得: https://www.nuget.org/packages/TikaOnDotnet.TextExtractor/

    这是一个非常好的 Tika java 库的包装器,使用 IKVM。非常易于使用,可处理 PDF 以外的各种文件类型,包括新旧办公格式。它会根据文件扩展名自动选择解析器,所以很简单:

    var text = new TextExtractor().Extract(file.FullName).Text;
    

    更新:此解决方案的一个注意事项是 IKVM 上的开发已经结束。我不确定从长远来看这意味着什么。 http://weblog.ikvm.net/2017/04/21/TheEndOfIKVMNET.aspx

    【讨论】:

    • 这行得通。但是,我遇到了将连字字符“ffi”、“ff”、“fi”等显示为�的问题。你有这个问题吗?
    • @kurt,我没有注意到这个问题,但我主要将英文文本输入搜索索引,其中连字字符的问题不会是主要问题。
    【解决方案6】:

    如果您处理 PDF 文件的目的是将数据导入数据库,那么我建议您考虑ByteScout PDF Extractor SDK。包括一些有用的功能是

    • 表格检测;
    • 文本提取为 CSV、XML 或格式化文本(带有可选的布局恢复);
    • 支持正则表达式的文本搜索;
    • 访问文本对象的低级 API

    免责声明:我隶属于 ByteScout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-24
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多