从pdf中提取列

时间:2016-03-26 23:06:28

标签: regex pdf pdftotext

我想从我的银行帐户对帐单中提取数据。

操作显示如pdf中的操作:

enter image description here

使用pdftotext,我得到这样的数据:

03/01/2011 03/01/2011 XXXXXX
0400262553990000000000713596003
03/01/2011 03/01/2011 PAIEMENT CB 0201 XXXX
XXXX
XXXXXXXX
04/01/2011 04/01/2011 PAIEMENT CB 0201 XXXXX
XXXXXXX
//some other operation in the same format

XXXXXX //my account balance
31,00
32,70
68,00
//some other amounts 

我希望能够以正确的数量可靠地识别所有操作。

所以:

  • 有pdftotext的替代品吗?
  • pdftotext中是否有任何可以帮助我的选项,例如正确格式化输出中的列?

使用一些正则表达式:

var operations= pdftext.match(/[0-9]{2}\/[0-9]{2}\/[0-9]{4}\ [0-9]{2}\/[0-9]{2}\/[0-9]{4}[^\n]*/g);
var amounts = pdftext.match(/\n[0-9]+\,[0-9]{2}\n/g);

我得到了更正结果但我看到了一些问题:

  • 我没有成功捕获次要线路。我必须告诉在新的约会之前停下来。
  • 我查看了所有语句的几个文本结果,但格式可能会随着时间的推移而发生变化。

1 个答案:

答案 0 :(得分:1)

正则表达式很棒,但我认为您拥有的所有报告都在页面上保持几乎相同的表和列位置。

所以我首先通过在pdftext命令行参数-x 10 -y 10 -W 100 -H 300中指定裁剪矩形来逐列(或者逐行)数据,因此它将仅从裁剪区域返回文本。请注意,这些命令行选项仅在poppler-utils版本中可用:

-x number
Specifies the x-coordinate of the crop area top left corner
-y number
Specifies the y-coordinate of the crop area top left corner
-W number
Specifies the width of crop area in pixels (default is 0)
-H number
Specifies the height of crop area in pixels (default is 0)

PDF分辨率为72每英寸点数,因此您可以通过按原样打印PDF并以英寸为单位并乘以72或通过设置PDF查看器以100%显示PDF来轻松找到列或行测量坐标缩放,制作屏幕截图并根据屏幕截图测量位置。

此外,还有一个跨平台开源Tabula项目,旨在从PDF文件中的表中提取数据,也许它可以更好地用于您的目的(尽管设置可能比{{1更复杂) }})