以编程方式提取 PDF 表

Posted

技术标签:

【中文标题】以编程方式提取 PDF 表【英文标题】:Programmatically Extract PDF Tables 【发布时间】:2011-03-26 08:56:47 【问题描述】:

我有一堆包含表格数据的 PDF 文档,我需要将它们提取为更易读的格式,以存储在电子表格、数据库或其他任何东西中。

世界上是否有任何东西(最好是免费的)能够将表格数据从 PDF 中提取为更易读的格式批量或者原生集成应用程序或通过命令行被动或在代码(.net)中循环进程?

只要表格得到维护,实际上可以是任何格式(doc、html)。

到目前为止,我发现的任何东西要么是一次性的(一次只做一个文档,我有数百个,这不会发生),要么不维护表结构。

任何想法请发表。

【问题讨论】:

如果您可以使用源 PDF 的特定示例扩展此问题,这将有所帮助,因为这是准确回答问题所必需的。 @Thilo - 你对这个问题给予了赏金,目前尚不清楚@markdigi 是否给予任何关注。您是否有一些示例数据可以指出您想要解决的问题? @andersoj 这与***.com/questions/3929793/…有关(我从pdftotext获取文本数据)。 How to read table from PDF using itextsharp?的可能重复 【参考方案1】:

这是一个巨大的麻烦。通常,提取 PDF 文件的文本内容与 PDF 希望您执行的操作背道而驰。

首先尝试获取文本。这可能或多或少成功,具体取决于 PDF 的构建方式。一个起点是 GhostScript 或 pstotext。如果你失败了,这个人有一个list of text extraction tools。获得文本流后,您可以尝试以编程方式重新组装表格结构。

最后,如果您的状态非常糟糕,并且 PDF 不合作,您可以执行 OCR 操作。正确的长期解决方案是在一开始就将数据转换为正确的格式,或者通过执行单个、大量、痛苦且可能部分手动的过程;或者去源头并建议以更有用的形式提供数据。

如果您可以提供更具体的 PDF 示例文件,可能会有更好或更准确的答案...对此没有通用解决方案,如果可能,需要根据您的具体情况进行定制源数据。

请注意,rather pointed response to the general question... 对您面前的问题没有帮助,但在向您的老板解释为什么没有明显的答案时,它可能会提供有用的封面? ;-)

弹出了一个新的 SO 问题,并引用了这个库 -- iTextSharp -- 看起来可能相关。所以问题:Best way to extract...

【讨论】:

【参考方案2】:

    关于为什么PDF 文件格式不应该被认为适合托管可提取的结构化数据,请参阅这篇文章:

    Why Updating Dollars for Docs Was So Difficult

    对于从 PDF 中提取表格数据(除非它们是扫描页面)每周都变得越来越好的惊人工具系列,与第 1 点相矛盾。以上请查看以下链接:

    Introducing Tabula: Upload a PDF, get back tabular CSV data. Poof! Tabula-Extractor: A Command Line Interface to Tabula Tabula source code repository Tabula API (upcoming, not ready yet)

【讨论】:

【参考方案3】:

查看 IvyTools IvyPdf:www.ivytools.net 它可以提取表格以及任何其他数据。如果您的文档结构良好,则很容易设置,但它也可以处理相当复杂的场景。免费供个人使用。

【讨论】:

【参考方案4】:

考虑到您的要求,直接回答您的问题是完全不可能的。原因是,与 word/excel 不同,PDF 规范没有名为 Table 的对象。您在这些 PDF 文档中看到的表格只是一系列以看起来像表格的方式绘制的矩形,这取决于创建这些 PDF 文件的 PDF Writer,因为有些人可能会使用线条系列绘制表格类型的结构。

但是也许你可以基于PDF File Specification编写你自己的解析器,但是如果你选择实现你自己的解析器,这仍然是一项艰巨的任务,并且需要几个月的时间才能得到一个可以使用很多PDF 文档

Incase,您决定编写自己的解析器。下面的文章将为您提供快速入门。 Code Project Article

【讨论】:

那里有一堆 PDF 工具集...我不知道这如何帮助回答这个问题。 @andersoj,感谢您的反馈。在过去的 2 年里,我一直在开发商业 PDF 解决方案。根据我在 PDF 文件格式方面的知识和多年经验,我们的几个客户过去曾问过这个问题。因此,我给出了直截了当的回应。此外,据我所知,市场上没有此类组件。但是有一些商业解决方案可以将 PDF 导出为 Word 文档,我知道它们的可靠性有多高;)干杯, 啊,这类似于 LaTeX 到 Word 的方法?为每一页生成一个位图,放在页面上,你的word文档准备好了吗? @Karthik -- 我删除了我的反对票。作为 PDF 专家,您知道问题无法以当前形式回答——假设这些表格被编码为嵌入图像?假设他们使用了非标准字体/字体编码?鉴于 PDF 几乎没有语义,而且 PDF 输出被各种生产者随意构建,这些问题很普遍......我们需要样本数据来回答这个问题。 @Stephan,不,这些工具不使用基于位图的方法。相反,这些工具基本上解析给定的 PDF 文件,然后在第一次通过时提取文本及其位置,并根据从 PDF 文档中检索到的文本 XY 位置,创建新的 Word 文档。这种方法适用于少数文档(您将获得与 PDF 中存在的类似输出),但不能保证这将可靠地适用于所有 PDF 文档。【参考方案5】:

PDF 格式是作为字母的集合构建的,没有固有的格式或任何东西。您可以将 PDF 视为已通过 OCR 的页面,并且您从那里获取它 - 字母及其坐标在那里 - 其余的取决于您 - 找出布局、格式、列和最终的表格。

【讨论】:

【参考方案6】:

当你说

到目前为止我发现的任何东西......一次只做一个文档

我假设您的意思是“是一个 GUI 应用程序,没有编程接口。”

在这种情况下,您可以使用Microsoft UI Automation 以编程方式控制应用程序并使其执行您想要的操作。

UIA ...提供了一种公开和收集有关用户界面元素和控件的信息的方法,以支持用户界面可访问性和软件测试自动化...并且与 Win32 和 .NET Framework 兼容。

【讨论】:

【参考方案7】:

如果所有数据都是文本数据,你总是可以使用 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

这至少会让你得到开始的文字。

【讨论】:

不免费用于商业用途。【参考方案8】:

我尝试使用 pdf2text 等工具从 PDF 中提取纯文本,但丢失了太多表格、格式和布局信息,无法准确地重建原始版本。

使用 PDF API 提取文本框和行的 x,y 位置并使用该信息重建表格可能更成功。

似乎有几个第三方工具和 API 尝试了这种方法:

Solid Framework 的付费版本似乎能够自动将表格从 PDF 提取到 Excel 和 CSV,并且相当好地从我扔给它的 PDF 中提取出来。

免费的PDF Mechanic 似乎是一个围绕着 Solid Framework 的小型 GUI 程序,您可以使用它来试用他们的 PDF 提取技术。

还有免费工具pdf2table,您可能可以从您的程序中调用它,但我还没有尝试过。

【讨论】:

【参考方案9】:

我最近遇到了这个问题。

我发现的另一种解决方案是在 Adob​​e 中打开 PDF 文档并将其导出为 xml。至少我的 PDF 保留了表格信息,然后我能够以编程方式使用 XML 生成表格文件,如 excel 等。

我遇到的另一个问题是 Adob​​e 一次只允许您导出一个文件,而且我有很多文件。幸运的是,Adobe 也有合并功能。我最终将所有文件合并在一起,然后将它们导出为一个大的 XML 文件并使用该文件生成我需要的内容。

【讨论】:

以上是关于以编程方式提取 PDF 表的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式搜索 PDF 文件中的文本并告知页码? [关闭]

如何在 C# 中以编程方式搜索 PDF 文档 [关闭]

如何以编程方式填写和获取 Excel 电子表格的 PDF 输出?

如何以特定格式以编程方式创建pdf?

以编程方式读取 PDF 嵌入式搜索索引

如何以编程方式在 iOS 中创建 PDF?