Python PDF/图像表重建选项
Posted
技术标签:
【中文标题】Python PDF/图像表重建选项【英文标题】:Python PDF/Image table reconstruction options 【发布时间】:2021-10-25 00:05:10 【问题描述】:我正在寻找 Python 中的包以将表格从 PDF 转换为 CSV。我在下面附上了这样一张表格的图片,而原始 PDF 可以从here 下载。
我尝试使用 Tabula,它似乎无法重新创建表格的格式,并且难以区分单元格(可以理解,因为源的边框最小)。使用 OCR 的有效选项(www.convertio.co 和 www.extracttable.com 是我尝试过的选项)。但是,这两种服务都是没有订阅模式的付费服务,因此由于我希望处理的文件量很大,因此在财务上对我来说是不现实的。
如果有人对任何可行的选择提出建议,那将非常有帮助。
【问题讨论】:
【参考方案1】:我能够从您与tabula
共享的页面中成功读取表格。理想情况下,您希望使用tabula
来执行此操作,因为它的性能也会更高,因为您是在提取文本而不是处理图像。我在一些项目中使用tabula
,可以在几秒钟内从数千个.pdf
页面中提取数据(它们必须是文本)。
您是否输入了列的坐标?如果列在多个页面上是一致的(通常是这样),这通常是最好的方法。这就是one page
的代码和输出的样子。我只能从该链接下载一页,而不是多页或整本书,因此我的代码将在 .pdf
上运行一页。
对于多个页面,它与下面的代码相同,但您执行双重pd.concat
。一个concat
是将concat
的series
列表放入数据框(如下所示)。在我的代码中没有显示的是另一个 concat
来汇集所有 页面。
from tabula import read_pdf
import pandas as pd
file = 'Documents/uc1-31210012879134-20-1629833207.pdf'
df = pd.concat(read_pdf(file, columns=([152.0, 193.0, 235.0, 272.0, 308.0, 352.0, 388.0, 460.0, 491.0, 527.0]),
pandas_options=('header': False),
pages='all',multiple_tables=True, stream=True, guess=False)).dropna()
df
Got stderr: Aug 24, 2021 1:04:28 PM org.apache.pdfbox.contentstream.PDFStreamEngine operatorException
SEVERE: Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed
Out[1]:
Unnamed: 0 .. Unnamed: 1 Unnamed: 2 \
0 Table 4. —Number of OA SDIben. e ficiarie.s. with .ben
6 State 72andcounty Total workers husbands
8 California , total 3,738,579 2,393,724 303,722
9 Alameda 157,320 99,635 11,865
10 Alpine . 100 60 5
11 Amador . . 6,780 4,630 665
12 Butte 39,645 25,920 3,450
13 Calaveras . 8,030 5,325 765
15 Colusa 2,675 1,610 245
16 Contra Costa 107,695 67,615 9,865
17 Del Norte 4,455 2,635 345
18 Eldorado 21,340 14,325 1,900
19 Fresno 90,325 54,095 7,390
20 Glenn 4,530 2,790 390
21 Humboldt 20,635 11,810 1,710
22 Imperial 17,925 9,810 1,555
23 Inyo 4,400 3,060 335
24 Kern 76,030 43,000 5,860 7
25 Kings 9,770 5,440 890
26 Lake 14,955 9,925 1,110
27 Lassen , 3,985 2,375 340
28 Los Angeles 94175,420 806142,40980090 70,665 0
29 Madera 15,225 8,945 1,455
30 Marin 32,080 22,170 2,930
32 Mendocino 14,745 8,945 1,260
33 Merced 21,915 12,780 1,905
36 Monterey 42,820 26,845 3,815
37 Napa 20,600 13,625 1,815
38 Nevada 16,730 11,400 1,685
39 Orange 255,760 170,195 21,380
40 Placer 27,215 17,660 2,435
41 Plumas 4,445 3,000 385
42 Riverside 190,995 129,380 14,980
43 Sacramento 138,230 83,465 11,360
44 San Benito 4,450 2,940 360
45 San Bernardino 165,735 100,005 12,315
46 San Diego 326,395 213,615 31,015
47 San Francisco 1059,495 73,615 6,675 0
48 San Joaquin 68,560 40,985 5,310
49 San Luis Obispo 37,625 25,170 3,495
50 San Mateo 90,130 61,700 7,4251
51 Santa Barbara 53,330 35,145 5,050
52 Santa Clara 145,405 94,760 12,140
53 Santa Cruz 30,260_ 19,695 2,610
54 Shasta 29,965 17,985 2,555
56 Siskiyou 10,050 6,250 925
57 Solano 35,270 20,825 2,920
58 Sonoma 62,965 41,070 5,405
59 Stanislaus 53,520 31,900 4,155
63 Tulare 47,655 27,325 3,820
65 Ventura 77,365 49,505 6,695
66 Yolo 17,205 10,520 1,560
67 Yuba 9,265 5,135 720
Unnamed: 3 Unnamed: 4 Unnamed: 5 Unnamed: 6 \
0 efi..t.s in c urrent -pay ment sta .tus , b.y..... type o..f b
6 Children widowers Children workers husbands Ch
8 41,245 442,674 160,627 295,295 18,844
9 1,685 19,030 6,720 13,935 675
10 0 15 5 15 0
11 40 745 190 385 30
12 305 4,315 1,195 3,210 260
13 45 800 240 610 50
15 30 360 105 230 25
16 875 13,905 4,085 8,300 465
17 25 510 155 550 55
18 150 2,010 790 1,570 115
19 1,335 11,385 5,130 7,745 620
20 55 595 200 315 45
21 155 2,685 920 2,405 210
22 640 2,100 1,250 1,760 195
23 15 505 130 265 20
24 0915 9,435 4,470 8,470 65 750
25 135 1,390 600 870 90
26 110 1,490 395 1,400 115
27 30 445 175 400 45
28 10,900 111,100 43,920 74,425 0 4,21025
29 200 1,830 750 1,390 140
30 255 3,895 730 1,760 50
32 160 1,815 680 1,375 90
33 275 2,870 1,225 1,930 85185
36 580 5,350 1,825 3,065 245
37 255 2,435 815 1,270
38 120 1,660 440 1,055 80
39 2,445 32,600 9,325 15,280 795
40 210 3,100 1,010 1,995 155
41 30 430 130 360 25
42 1,725 19,935 7,440 12,665 945
43 1,415 16,535 6,460 13,970 850
44 75 490 220 255 25
45 2,005 20,145 10,125 14,805 1,225
46 3,630 37,775 11,625 21,615 1,325
47 1,200 12,470 3,040 10,93055 5 245
48 1,040 8,165 3,695 6,620 505
49 290 4,125 1,000 2,645 200
50 7655 10,580 2,660 5,580 15205
51 595 6,255 1,750 3,360 230
52 1,635 17,210 6,230 10,320 500
53 280 3,760 1,090 2,120 140
54 240 3,545 1,170 3,175 300
56 65 1,125 320 955 75
57 380 4,415 1,985 3,230 290
58 735 7,780 2,320 4,325 220
59 585 6,575 2,640 5,450 450
63 1,010 5,730 3,010 4,590 445
65 960 9,110 3,310 5,555 435
66 175 2,080 760 1,560 95
67 110 1,075 485 1,200 105
Unnamed: 7 . ..1
0 enefit , .by sex o f ... ...
6 ildren Men Women
8 82,448 1,154,514 1,658,066
9 3,775 46,670 71,480
10 0 30 40
11 95 2,400 2,915
12 990 12,980 17,280
13 195 2,760 3,205
15 70 850 1,110
16 2,585 33,040 48,935
17 180 1,395 1,690
18 480 7,205 8,655
19 2,625 26,910 37,875
20 140 1,455 1,905
21 740 6,210 8,160
22 615 5,695 5,600
23 70 1,515 1,940
24 3,130 21,815 29,155
25 355 2,830 3,985
26 410 5,095 6,020
27 175 1.255 1,520
28 1157,805 289,635 428,460
29 515 4,780 5,880
30 290 10,655 15,770
32 420 4,620 6,025
33 745 6,655 8,725
36 1,095 13,230 18,665
37 330 6,855 9,500
38 290 5,810 7,135
39 3,740 79,175 122,680
40 650 8,700 11,895
41 85 1,540 1,745
42 3,925 63,005 83.820
43 4,175 39,815 59.235
44 85 1,515 1,810
45 5,110 47,785 68,420
46 5,795 105,260 147,030
47 151,320 33,800 51,465
48 2,240 20,580 27,970
49 700 12,545 16,840
50 1,215 29,260 43,220
51 945 17,130 24,825
52 2,610 44,620 66,405
53 565 9,335 14,240
54 995 9,215 12,020
56 335 3,265 3,960
57 1,225 10,090 14,555
58 1,110 19,690 29,635
59 1,765 15,600 22,310
63 1,725 13,800 18,705
65 1,795 23,720 34,655
66 455 5,325 7,400
67 435 2,720 3,315
【讨论】:
我确实尝试输入列位置,但不幸的是,即使这样,Tabula 似乎也难以区分单元格。例如,查看您提供的输出中的洛杉矶县与原始数据的比较。 是的,该文件可能有问题。我复制/粘贴到记事本/文本编辑器中,洛杉矶的行弄乱了底层文本。您可能必须尝试处理图像而不是凌乱的底层文本的解决方案。页面左侧有一张图片,从 los angeles 行开始,当文件处理为 .pdf 时,这可能会导致底层文本出现问题。 是的,不幸的是,这些表中的许多表都非常旧,所以格式问题是可以预料的。不过还是谢谢你。【参考方案2】:可用于 PDF/图像表重建的 Python 库之间的选项和比较:
pdfminer.six 为 pdfplumber 提供了基础。它主要是 专注于解析 PDF,分析 PDF 布局和对象 定位和提取文本。它不提供表格工具 提取或可视化调试。 pymupdf 比 pdfminer.six 快得多(因此也 pdfplumber) 并且可以生成和修改 PDF,但是库 需要安装非 Python 软件 (MuPDF)。它也可以 无法轻松访问形状对象(矩形、线条等), 并且不提供表格提取或可视化调试工具。 camelot、tabula-py、 和 pdftables 都主要专注于提取 表。在某些情况下,它们可能更适合特定的 您尝试提取的表。 PyPDF2 及其后续库似乎不再维护。 Pdfplumber - 已使用此库提取 pdf 中的表格,该表格没有矩形边界框从表格与普通文本分开pdf =pdfplumber.open(filepath)
for i in range(int(len(pdf.pages))):
df = pd.DataFrame()
table = pdf.pages[i].extract_table(table_settings="vertical_strategy": "text","horizontal_strategy": "text")
df = pd.DataFrame(table,columns=table)
df.to_csv(outfile, mode="a", index = False)
【讨论】:
以上是关于Python PDF/图像表重建选项的主要内容,如果未能解决你的问题,请参考以下文章
《python计算机视觉编程》高清中英PDF+源代码+数据 Learn together