2

我有一个非常大的 PDF 文件(200,000 KB 或更多),其中包含一系列只包含表格的页面。我想以某种方式使用 Ruby 解析这些信息,并将结果数据导入 MySQL 数据库。

有谁知道将这些数据从 PDF 中提取出来的任何方法?数据按以下方式格式化:

姓名 | 地址 | 现金报告 | 报告年份 | 持有人名称

有时,名称字段会溢出到地址字段中,在这种情况下,剩余的列将显示在下一行。

由于格式不规则,我一直在弄清楚这一点。至少,有人可以为我指出一个 Ruby PDF 库来完成这项任务吗?

更新:我不小心提供了不正确的信息!文件的实际大小为 300 MB,即 300,000 KB。我在上面进行了更改以反映这一点。

4

5 回答 5

2

我假设在 Acrobat Reader 或其他 PDF 查看器中打开 PDF 时,您可以毫无问题地复制粘贴文本片段?

在尝试以编程方式从此类怪物文件中解析和提取文本之前(即使它只有 200 MB——对于 huuuuge 表中的简单文本,除非你有 200000 页......),我会这样继续:

  1. 首先尝试通过重新蒸馏来清理文件。
  2. 尝试使用不同的 CLI 工具将文本提取到 .txt 文件中。

这是几分钟的事情。编写一个 Ruby 程序来完成这项工作肯定需要几个小时、几天或几周的时间(取决于您对 PDF 文件格式内部结构的了解……我怀疑您还没有太多经验)。

如果“2”。工作,你可能已经完成了一半。如果它有效,您也知道使用 Ruby 以编程方式执行它是一项原则上可以解决的工作。如果“2”。不起作用,您知道以编程方式实现可能非常困难。

清理“Monster.pdf”:

我建议使用Ghostscript。如果您可以访问 Adob​​e Acrobat Distiller,您也可以使用它。

gswin32c.exe ^
  -o Monster-PDF-sanitized ^
  -sDEVICE=pdfwrite ^
  -f Monster.pdf

(我很好奇与输入相比,单个命令会使您的输出 PDF 缩小多少。)

从 PDF 中提取文本:

我建议首先尝试pdftotext.exe来自 XPDF 人)。还有其他一些更不方便的方法,但这可能已经完成了这项工作:

pdftotext.exe ^
   -f 1 ^
   -l 10 ^
   -layout ^
   -eol dos ^
   -enc Latin1 ^
   -nopgbrk ^
   Monster-PDF-sanitized.pdf ^
   first-10-pages-from-Monster-PDF-sanitized.txt

这不会提取所有页面,而只会提取 1-10 个(用于概念证明,看看它是否有效)。要从每个页面中提取,只需省略-f 1 -l 10参数即可。您可能需要通过将参数更改为-enc ASCII7(或UTF-8, UCS-2) 来调整编码。

如果这不是快速简单的方法(因为有时会发生,原始 PDF 中的某些字体使用“自定义编码向量”),您应该提出一个新问题,描述您迄今为止发现的详细信息。然后你需要使用更大的口径来解决这个问题。

于 2010-09-15T10:16:19.597 回答
1

至少,有人可以为我指出一个 Ruby PDF 库来完成这项任务吗?

如果您还没有这样做,您应该查看前面的两个问题:“ Ruby:阅读 PDF 文件”和“ ruby pdf parsing gem/library ”。PDF::ReaderPDF::ToolkitDocsplit是一些比较流行的建议库。甚至有人建议使用 JRuby 和一些 Java PDF 库解析器

我不确定这些解决方案中的任何一个是否真的适合您的问题,尤其是您正在处理如此巨大的 PDF 文件。因此,除非有人提供更丰富的答案,否则也许您应该选择一两个库并带它们进行试驾。

于 2010-09-14T21:45:39.623 回答
0

检查 PDF 中是否有结构化内容。我在http://www.jpedal.org/PDFblog/?p=410写了一篇博客文章对此进行了解释

如果没有,您将需要构建它。

于 2010-09-15T07:26:17.797 回答
0

这将是一项艰巨的任务,因为渲染的 PDF 没有表格布局的概念,只有预定位置的行和文本。可能无法确定什么是行和什么是列,但这可能取决于 PDF 本身。

java 库是最健壮的,并且可以做的不仅仅是提取文本。所以我会研究 JRuby 和 iText 或 PDFbox。

于 2010-09-15T02:25:20.017 回答
-1

也许是虾红宝石库?链接文本

于 2010-09-14T22:07:14.433 回答