我有一堆带有表格数据的PDF文档,我需要将其提取为更易读的格式以存储在电子表格,数据库或其他内容中。以编程方式提取PDF表格
有什么列世界(最好是免费),其能够获得表格数据出PDF的成更可读的格式散装或者与一个应用程序或通过命令行或循环被动原生集成代码进程(.net)?
只要表格被保留,就可以是任何格式(doc,html)。
到目前为止,我发现的任何东西都是一次性的(一次只能做一个文档,我有数百个,但没有发生)或者不维护表结构。
任何想法请发布。
我有一堆带有表格数据的PDF文档,我需要将其提取为更易读的格式以存储在电子表格,数据库或其他内容中。以编程方式提取PDF表格
有什么列世界(最好是免费),其能够获得表格数据出PDF的成更可读的格式散装或者与一个应用程序或通过命令行或循环被动原生集成代码进程(.net)?
只要表格被保留,就可以是任何格式(doc,html)。
到目前为止,我发现的任何东西都是一次性的(一次只能做一个文档,我有数百个,但没有发生)或者不维护表结构。
任何想法请发布。
这是一个巨大的麻烦。一般来说,提取PDF文件的文本内容是针对PDF要求你做的。
从试图获取文本开始。这可能或多或少取决于PDF的构建方式。一个地方开始是GhostScript或pstotext。如果你失败了,这个人有一个list of text extraction tools。一旦你有了文本流,你就可以尝试以编程方式重新组装表格结构。最后,如果你的状态严重不好,如果PDF不合作,你可以做OCR的事情。正确的长期解决方案是一开始就将数据转化为正确的格式,无论是通过单一的,大规模的,痛苦的,可能是部分手动的过程;或去信息来源,并建议以更可用的形式提供数据。
如果您可以给出更具体的PDF示例文件,可能会有更好或更精确的答案......没有一般的解决方案,如果可能的话,它将需要针对您的特定源数据。
注意这个rather pointed response to the general question ......并没有帮助你解决你面前的问题,但是当向你的老板解释为什么没有明显的答案时,它可能会提供有用的顶盖。 ;-)
弹出一个新的SO问题,并提到这个库 - iTextSharp - 看起来可能相关。SO问题:Best way to extract...
当你说
什么我迄今发现...只做一次在一个文档
我假设你的意思是“是一个GUI应用程序,没有一个编程接口“。
在这种情况下,您可以使用Microsoft UI Automation以编程方式控制应用程序并使其按照自己的需要进行操作。
UIA ...提供了公开和收集有关用户界面元素和控件信息的方法,以支持用户界面可访问性和软件测试自动化......并且与Win32和.NET Framework兼容。
考虑到您的要求,直接向您的问题的答案是它是不可能的。原因是,与word/excel不同,PDF规范没有名为Table的对象。您在这些PDF文档中看到的表格只是一系列矩形,它看起来像表格,它取决于创建这些PDF文件的PDF Writer,因为有些可能会使用Line of Line来绘制表格类型的结构。
但可能你可以根据PDF File Specification写自己的解析器,但它仍然是,如果你选择实现自己的解析器,是一项艰巨的任务,这将需要几个月的时间才能得到一个这正与不少PDF文档。
Incase,你决定写你自己的解析器。下面的文章会给你一个开始。 Code Project Article
有一堆PDF工具集在那里...我不知道这是如何帮助回答这个问题。 – andersoj 2010-10-17 20:13:12
@andersoj,感谢您的反馈。过去两年来我一直在开发商业PDF解决方案。基于我的知识和多年的PDF文件格式的经验,这个问题过去曾被我们的几个客户问过。所以我给了我直截了当的回应。而且,据我所知,市场上没有这样的组件。但是有一些商业解决方案可以将PDF导出为Word Document,我知道它们的可靠程度;)干杯, – 2010-10-18 04:52:00
啊,这与LaTeX to Word方法类似吗?为每个页面生成一个位图,放置在页面上,准备好是您的文字文档? – 2010-10-18 14:52:39
PDF格式是建立为一个字母集合,它没有固有的格式或任何东西。您可以将PDF视为通过OCR进入的页面,并且您可以从那里获取PDF(字母和它们的坐标) - 其余的由您决定 - 来计算布局,格式,列和最终表格。
如果所有的数据都是文本数据,您可以随时使用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
这将至少让你开始的文字。
它不是免费的商业用途。 – Paparazzi 2011-12-27 23:03:37
我试过使用类似pdf2text的工具从PDF中提取纯文本,但是太多的表格和格式以及布局信息会丢失,无法准确重建原始版本。
使用PDF API提取文本框和行的x,y位置并使用该信息重构表格可能会更成功。
似乎有是一些第三方工具和API试试这个方法:
的Solid Framework付费版本似乎能够从我的PDF文件自动较好地提取从PDF表格,Excel和CSV已经抛出了它。
免费PDF Mechanic似乎是一个围绕Solid Framework的小型GUI程序,您可以使用它来试用其PDF提取技术。
还有免费的工具pdf2table,你可以从你的程序中调用,但我还没有尝试过。
对于有关为什么PDF文件格式应该永远不会被托管提取,结构化数据认为是合适的背景,看到这篇文章:
对于一个惊人的工具系列,每周都会从PDF中提取表格数据(除非它们是扫描的页面),它们会逐渐变得更好,更好,矛盾点'1'。上述看到这些链接:
我最近遇到了这个问题。
我发现的另一种解决方案是在Adobe中打开PDF文档并将其导出到xml。至少在我的PDF文件中保存了表格信息,然后我就可以通过编程方式使用XML生成表格文件,例如excel等。
我遇到的另一个问题是Adobe只允许您在时间和我有很多文件。幸运的是,Adobe也有合并功能。我最终将所有文件合并在一起,然后将它们导出为一个大XML文件并使用该文件生成我需要的文件。
如果您可以通过源PDF的具体示例来扩展此问题,这将有所帮助,因为这是以任何精度回答问题所必需的。 – andersoj 2010-10-17 20:14:36
@Thilo - 你对这个问题附加了一个赏金,并且@markdigi没有注意。您是否有一些示例数据可以指出您想要解决的问题? – andersoj 2010-10-18 15:48:49
@andersoj这是与http://stackoverflow.com/questions/3929793/how-can-i-extract-parse-tabular-data-from-a-text-file-in-perl(我得到的文本数据从pdftotext)。 – Thilo 2010-10-20 04:15:22