我有一个非常大的 PDF 文件(200,000 KB 或更多),其中包含一系列仅包含表格的页面。我想使用 Ruby 以某种方式解析此信息,并将结果数据导入 MySQL 数据库。
有谁知道从 PDF 中提取这些数据的方法吗?数据按以下方式格式化:
名字 |地址 |现金报告 |报告年份 |持有人姓名
有时名称字段会溢出到地址字段中,在这种情况下,剩余的列将显示在下一行。
由于格式不规则,我一直在想办法解决这个问题。至少,任何人都可以为我指出用于此任务的 Ruby PDF 库吗?
更新:我不小心提供了错误的信息!该文件的实际大小为 300 MB,即 300,000 KB。我做了上面的更改以反射(reflect)这一点。
最佳答案
我假设当您的 PDF 在 Acrobat Reader 或其他 PDF 查看器中打开时,您可以毫无问题地复制'n'粘贴文本片段?
在尝试以编程方式从此类怪物文件中解析和提取文本之前(即使它只有 200 MByte——对于 huuuuge 表中的简单文本,除非你有 200000 页......),我会像这样进行:
- 首先尝试通过重新蒸馏来净化文件。
- 尝试使用不同的 CLI 工具将文本提取到 .txt 文件中。
这只是几分钟的事情。编写一个 Ruby 程序来执行此操作肯定需要数小时、数天或数周的时间(取决于您对 PDF 文件格式内部结构的了解……我怀疑您还没有太多这方面的经验)。
如果“2”。工作,你可能已经完成了一半。如果它有效,您也知道使用 Ruby 以编程方式完成它是一项原则上可以解决的工作。如果“2”。不起作用,您知道以编程方式实现可能非常困难。
清理“Monster.pdf”:
我建议使用 Ghostscript .如果您有权访问 Adobe 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-8
、UCS-2
)来调整编码。
如果这不是快速简单的方法(因为有时会发生,原始 PDF 中的某些字体使用“自定义编码矢量”),您应该提出一个新问题,描述您的发现的详细信息,以便远的。然后你需要诉诸更大的口径来解决这个问题。
关于ruby - 解析大型 PDF 文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3712556/