繁体   English   中英

使用python将pdf表连接到一个excel表中

[英]concat pdf tables into one excel table using python

我使用tabula为了concat所有tables在下面的PDF文件

成为excel格式的一张表。

这是我的代码:

from tabula import read_pdf
import pandas as pd

allin = []
for page in range(1, 115):
    table = read_pdf("goal.pdf", pages=page,
                     pandas_options={'header': None})[0]
    allin.append(table)


new = pd.concat(allin)

new.to_excel("out.xlsx", index=False)

我也尝试了以下方法:

from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf", pages='all', pandas_options={'header': None})

new = pd.concat(table, ignore_index=True)

new.to_excel("out.xlsx", index=False)

电流输出: 检查

但是从第91页开始面临的问题我开始看到excel文件中的数据格式不正确。

我已经单独调试了页面,但我无法弄清楚为什么它的格式错误,尤其是它的格式相同。

from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf", pages='91', pandas_options={'header': None})[0]


print(table)

在此处输入图片说明

示例

from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf", pages='90-91', pandas_options={'header': None})

new = pd.concat(table, ignore_index=True)

new.to_excel("out.xlsx", index=False)

我在这里运行了两个页面 90 和 91 的代码。

从第 48 行开始,您将在这里看到不同之

您会注意到将姓名和地址放在一个单元格中的问题。 城市和州也被置于一个电话中

我挖掘了源代码,它有选项,您可以手动定义列边界。 当您设置columns您必须使用guess=False

tabula-py使用程序tabula-java并且在其文档中我发现它需要以百分比或点(而不是像素)为单位的值。 所以我使用程序inkscape来测量点的边界。

在此处输入图片说明

from tabula import read_pdf
import pandas as pd

# display all columns in dataframe
pd.set_option('display.width', None)

columns = [210, 350, 420, 450]  # boundaries in points
#columns = ['210,350,420,450']   # boundaries in points

pages =  '90-92'
#pages = [90,91,92]
#pages = list(range(90,93))
#pages = 'all'  # read all pages 

tables = read_pdf("goal.pdf",
                  pages=pages,
                  pandas_options={'header': None},
                  columns=columns,
                  guess=False)

df = pd.concat(tables).reset_index(drop=True)
#df.rename(columns=df.iloc[0], inplace=True)  # convert first row to headers
#df.drop(df.index[0], inplace=True)           # remove first row with headers 

# display

#for x in range(0, len(df), 20):
#    print(df.iloc[x:x+20])
#    print('----------')

print(df.iloc[45:50])

#df.to_csv('output-pdf.csv')

#print(df[ df['State'].str.contains(' ') ])
#print(df[ df.iloc[:,3].str.contains(' ') ])

结果:

                                      0                         1       2   3               4
45                        JARRARD, GARY      930 FORT WORTH DRIVE  DENTON  TX  (940) 565-6548
46                        JARRARD, GARY        2219 COLORADO BLVD  DENTON  TX  (940) 380-1661
47  MASON HARRISON, RATLIFF ENTERPRISES  1815 W. UNIVERSITY DRIVE  DENTON  TX  (940) 387-5431
48  MASON HARRISON, RATLIFF ENTERPRISES          109 N. LOOP #288  DENTON  TX  (940) 484-2904
49  MASON HARRISON, RATLIFF ENTERPRISES      930 FORT WORTH DRIVE  DENTON  TX  (940) 565-6548

编辑:

它可能还需要选项area (也以点为单位)来跳过标题。 或者您必须删除第一页的第一行。

我没有检查所有行,但可能需要对列边界进行一些更改。


编辑:

很少有行会出现问题 - 可能是因为City文本太长。

col3 = df.iloc[:,3]

print(df[ col3.str.contains(' ') ])

结果:

                              0                       1                 2         3                 4
1941  UMSTATTD RESTAURANTS, LLC  120 WEST US HIGHWAY 54  EL DORADO SPRING      MS O    (417) 876-5755
2079               SIMONS, GARY         1412 BURLINGTON  NORTH KANSAS CIT      MY O    (816) 421-5941
2763       GRISHAM, ROBERT (RB)   403 WEST COURT STREET    WASHINGTON COU  ORTH HOU  S(E740) 335-7830
2764            STAUFFER, JACOB   403 WEST COURT STREET    WASHINGTON COU  ORTH HOU  S(E740) 335-7830

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM