以编程方式提取PDF表格

时间:2010-08-06 14:12:55

标签: .net pdf extract acrobat

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

世界上是否有任何东西(最好是免费的)能够将PDF格式的表格数据转换为更易读的格式 批量 与本机集成的app或被动地通过命令行或循环代码(.net)?

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

到目前为止,我发现的任何事情都是一次性的(一次只有一个文档,我有数百个,没有发生)或者没有维护表结构。

任何想法请发布。

9 个答案:

答案 0 :(得分:12)

这是一个巨大的麻烦。通常,提取PDF文件的文本内容是针对PDF要求您执行的操作而运行的。

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

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

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

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

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

答案 1 :(得分:3)

  1. 有关为什么 PDF文件格式永远不应被认为适合托管可提取的结构化数据 的背景信息,请参阅此文章:< / p>

  2. 对于一个惊人的工具系列,每周都会越来越好,从PDF中提取表格数据(除非它们是扫描页面), 矛盾点“1”。上面 请参阅以下链接:

答案 2 :(得分:1)

PDF格式是作为一组字母构建的,它们没有固有的格式或任何东西。您可以将PDF视为一个通过OCR的页面,并且您从那里开始使用它 - 字母和它们的坐标在那里 - 其余由您决定 - 以确定布局,格式,列和最终表格。 / p>

答案 3 :(得分:1)

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

这至少可以让你得到文本。

答案 4 :(得分:1)

查看IvyTools IvyPdf:www.ivytools.net 它可以提取表格以及任何其他数据。如果您的文档结构合理,则设置非常简单,但它也可以处理非常复杂的场景。它是免费供个人使用。

答案 5 :(得分:0)

当你说

  

到目前为止我发现的任何内容......一次只能找到一个文档

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

在这种情况下,您可以使用Microsoft UI Automation以编程方式控制应用并使其按照您的意愿进行操作。

  

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

答案 6 :(得分:0)

考虑到你的要求,你问题的直接答案是不可能的。原因是,与word / excel不同,PDF规范没有名为Table的对象。您在这些PDF文档中看到的表格只是以看起来像表格的方式绘制的矩形系列,并且由创建这些PDF文件的PDF Writer决定,因为有些人可能使用Line of Series绘制表格类型的结构。

但是你可能可以根据PDF File Specification编写自己的解析器,但是如果你选择实现自己的解析器,它仍然是一项艰巨的任务,并且需要花费几个月的时间才能得到一个与之相关的解析器 PDF文档

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

答案 7 :(得分:0)

我尝试使用像pdf2text这样的工具从PDF中提取纯文本,但是过多的表格和格式和布局信息都会丢失,无法准确地重建原始版本。

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

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

Solid Framework的付费版本似乎能够自动地从PDF中提取表格到Excel和CSV,并且从我投入的PDF中提取得很好。

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

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

答案 8 :(得分:0)

我最近遇到了这个问题。

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

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