ruby - 解析大型 PDF 文件的方法

标签 ruby database pdf ghostscript pdftotext

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

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

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

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

由于格式不规则,我一直在想办法解决这个问题。至少,任何人都可以为我指出用于此任务的 Ruby PDF 库吗?

更新:我不小心提供了错误的信息!该文件的实际大小为 300 MB,即 300,000 KB。我做了上面的更改以反射(reflect)这一点。

最佳答案

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

在尝试以编程方式从此类怪物文件中解析和提取文本之前(即使它只有 200 MByte——对于 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 ( from the XPDF folks )。还有其他一些更不方便的方法可用,但这可能已经完成了工作:

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-8UCS-2)来调整编码。

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

关于ruby - 解析大型 PDF 文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3712556/

相关文章:

ruby-on-rails - form_for 中不在模型中的自定义字段

php - 您如何看待这种在 mysql 中记录更改并具有某种审计跟踪的方法

android - 从 Android 应用程序中读取 PDF

php - 如何防止移动设备在我的网站上自动下载 PDF?

windows - 为什么在 Lighttpd 提供服务的情况下,在 IE 中下载某些 PDF 时会挂起

ruby - 如何快速测试 ruby​​ 中的类行为

ruby - 在 Ruby 中评估字符串中的正则表达式

ruby-on-rails - 安装 rails-4.0.0 时出错

sql - 在数据库中存储多项选择测验 - 决定模式

sql-server - 如何通过累积连接获取 SQL 中字符串值的分组