Tabula按区域坐标提取表格

时间:2017-08-02 09:36:19

标签: python pdf tabula

我们可以选择通过指定PDF坐标来从PDF文档中提取表格。对于Windows用户,为了获取坐标,您必须将PDF文件上传到Tabula网页并导出包含坐标的脚本,然后将坐标输入到您的代码中。对于Mac用户,您只需使用预览应用程序和裁剪检查器。我只是想知道是否有任何第三方程序或插件为Windows用户提供此功能?我认为在下列情况下这会很方便:

  1. 当您无法访问互联网时。
  2. 我认为预览应用会更准确,因为我遇到了Tabula网页产生的不准确的坐标。
  3. 如果有人能指出我能找到这样的东西,我将不胜感激。非常感谢。

5 个答案:

答案 0 :(得分:5)

Tabula需要以PDF单位指定区域,其定义为1/72英寸。如果使用Acrobat Reader DC,则可以使用“测量”工具并将其读数乘以72.

Tabula需要将区域指定为 top left bottom right 距离。要获得它们,您可以测量从页面的顶部到表格开头的距离,依此类推。

enter image description here

答案 1 :(得分:2)

“顶部+高度” (如果您愿意,可以将其称为底部)在此处被接受,但是,这不是从页面底部到表格的距离,而是从页面顶部到表格底部 的距离。

所有必要的细节都在Wiki here中进行了概述,但这是相关的:

注意left,top,height和width参数并计算以下内容:

y1 =顶部

x1 =左

y2 =顶部+高度

x2 =左+宽度

..那么它们的顺序是:y1,x1,y2,x2

可以提供一些完成工作的实用技巧。.我的pdf查看器无法测量,我尝试了linux程序'screenruler'(sudo apt install screenruler),但这有点麻烦,还需要校准如here

所述

最后,使用旧式方法获得了最准确的结果。在A4纸上打印一张带有表格的页面,用透明尺子进行所有测量,直到估计的毫米量级,所有尺寸的标尺线。好吧,直尺的另一边仅下降到了十六分之一英寸,与公制面相比没有那么细的颗粒,用袖珍计算器将厘米乘以28.346456693即可得到pdf单位。也许您身边有一个直尺,直尺下降到六分之一英寸;)

所有列的度量都是从页面的左侧开始的,只有列之间的内部分隔线,不包括表格最左侧或最右侧的行。

对于非常压缩的列,您可能会发现必须猜测一列字符溢出到下一列的较小尺寸。在这种情况下,您可以调整列的尺寸并进行迭代,直到正确为止。

答案 2 :(得分:0)

Tabula可以以“点”的形式理解坐标数据。

在Windows中,您可以使用Adobe Acrobat DC和Acrobat Reader DC测量区域坐标

如果您具有Adobe Acrobat DC-     工具>>编辑PDF >>选择您的区域,然后按Enter >>将单位更改为点

Top               100       pt = A
Left              50        pt = B
Cropped page size 370 x 225 pt = C x D

如果您具有Adobe Acrobat DC或Acrobat Reader DC-     编辑>>首选项>>单位>>将页面单位更改为点>>确定>>     工具>>测量

Top           = A = 100
Left          = B = 50
Areas  Width  = C = 370
Areas  Length = D = 225

您必须进行此计算

area=[A,B,A+D,B+C]
area=[100,50,100+225,50+370]

用代码

df=read_pdf(folder,area=[[100,50,325,420]] ,output_format="xlsx")

答案 3 :(得分:0)

阅读器仅在PDF创建者允许的情况下才允许测量。 找到了这个  https://graphicdesign.stackexchange.com/a/81666

简要步骤:

  1. 下载SumatraPDF。它也可以zip格式下载,无需安装 需要。
  2. 使用Sumatra阅读器打开PDF。
  3. 按'm'-此 在左上角显示光标位置。
  4. 将表格与 选项-p表示页面,-a表示区域。 (顶部,左侧,底部,右侧)

答案 4 :(得分:0)

我遇到了同样的问题,代码似乎忽略了区域标注。通过在命令行中包含“ guess = False”来修复此问题。像这样(注意我正在使用1.2.1版):

df = tabula.read_pdf(file_folder + file_name, 
                     guess=False, pages=1, stream=True , encoding="utf-8", 
                     area = (200.8125,64.6425,352.2825,496.1025), 
                     columns = (65.3,196.86,294.96,351.81,388.21,429.77))