我有一堆 PDF 文档,其中包含表格数据,我需要将其提取为更易读的格式以存储在电子表格、数据库或其他任何内容中。
世界上是否有任何东西(最好是免费的)能够将表格数据从 PDF中批量转换为更易读的格式,或者与应用程序原生集成,或者通过命令行被动地或在代码(.net)中循环过程?
只要维护表格,就可以是任何格式(doc、html)。
到目前为止,我发现的任何东西要么是一次性的(一次只做一个文档,我有数百个,这不会发生),要么不维护表结构。
任何想法请张贴。
这是一个巨大的麻烦。通常,提取 PDF 文件的文本内容与 PDF 希望您执行的操作背道而驰。
首先尝试获取文本。这可能或多或少成功,具体取决于 PDF 的构建方式。一个开始的地方是 GhostScript 或pstotext。如果你失败了,这个人有一个文本提取工具列表。获得文本流后,您可以尝试以编程方式重新组装表格结构。
最后,如果你的状态非常糟糕,并且 PDF 不合作,你可以做 OCR 的事情。正确的长期解决方案是在一开始就将数据转换为正确的格式,或者通过执行单个、大量、痛苦且可能部分手动的过程;或者去源头并建议以更有用的形式提供数据。
如果您可以提供更具体的 PDF 示例文件,则可能会有更好或更准确的答案……对此没有通用的解决方案,如果可能,则需要根据您的特定源数据进行定制。
请注意这个对一般问题的相当尖锐的回答......对于您面前的问题没有帮助,但是当向您的老板解释为什么没有明显的答案时,它可能会提供有用的封面?;-)
弹出了一个新的 SO 问题,并引用了这个库——iTextSharp——它看起来可能相关。所以问题:提取的最佳方法......
有关为什么PDF 文件格式不应该被认为适合托管可提取的结构化数据的背景,请参阅这篇文章:
对于从 PDF 中提取表格数据(除非它们是扫描的页面)每周都在变得越来越好的惊人工具系列,这与第1 点相矛盾。上面看到这些链接:
查看 IvyTools IvyPdf:www.ivytools.net 它可以提取表格以及任何其他数据。如果您的文档结构良好,则很容易设置,但它也可以处理相当复杂的场景。它是免费供个人使用的。
PDF 格式是作为字母的集合构建的,它们没有固有的格式或任何东西。您可以将 PDF 视为已通过 OCR 的页面,并且您从那里获取它 - 字母及其坐标在那里 - 其余的取决于您 - 以确定布局、格式、列和最终表格。
考虑到您的要求,直接回答您的问题是不可能的。原因是,与 word/excel 不同,PDF 规范没有名为 Table 的对象。您在这些 PDF 文档中看到的表格只是一系列矩形,其绘制方式看起来像表格,这取决于创建这些 PDF 文件的 PDF Writer,因为有些人可能会使用 Series of Line 绘制表格类型的结构。
但是也许您可以根据PDF 文件规范编写自己的解析器,但如果您选择实现自己的解析器,这仍然是一项艰巨的任务,并且需要几个月的时间才能获得一个可以处理大量PDF 文档的解析器。
Incase,您决定编写自己的解析器。下面的文章将为您提供快速入门。 代码项目文章
我尝试使用 pdf2text 之类的工具从 PDF 中提取纯文本,但是太多的表格、格式和布局信息丢失了,无法准确地重建原始版本。
使用 PDF API 提取文本框和行的 x、y 位置并使用该信息重建表格可能更成功。
似乎有几个第三方工具和 API 尝试了这种方法:
Solid Framework的付费版本似乎能够自动将表格从 PDF 提取到 Excel 和 CSV,并且可以很好地从我扔给它的 PDF 中提取出来。
免费的PDF Mechanic似乎是一个围绕 Solid Framework 包装的小型 GUI 程序,您可以使用它来尝试他们的 PDF 提取技术。
还有免费工具pdf2table,您可以从您的程序中调用它,但我还没有尝试过。
如果所有数据都是文本数据,您始终可以使用 iTextSharp。它是免费的,您只需要“itextsharp.dll”。
http://sourceforge.net/projects/itextsharp/
这是一个从 PDF 中读取文本的简单函数。
Public Shared Function GetTextFromPDF(PdfFileName As String) As String
Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)
Dim sOut = ""
For i = 1 To oReader.NumberOfPages
Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy
sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
Next
Return sOut
End Function
这至少会让你开始阅读文本。
当你说
到目前为止我发现的任何东西......一次只做一个文档
我假设您的意思是“是一个 GUI 应用程序,没有编程接口”。
在这种情况下,您可以使用Microsoft UI 自动化以编程方式控制应用程序并使其执行您想要的操作。
UIA ...提供了一种公开和收集有关用户界面元素和控件的信息的方法,以支持用户界面可访问性和软件测试自动化...并且与 Win32 和 .NET Framework 兼容。
我最近遇到了这个问题。
我发现的另一种解决方案是在 Adobe 中打开 PDF 文档并将其导出为 xml。至少在我的 PDF 中,它保留了表格信息,然后我能够以编程方式使用 XML 生成表格文件,如 excel 等。
我遇到的另一个问题是 Adobe 一次只允许您导出一个文件,而我有很多文件。幸运的是,Adobe 也有合并功能。我最终将所有文件合并在一起,然后将它们导出为一个大的 XML 文件,并使用该文件生成我需要的文件。