使用Python将pdf表连接到一个excel表

问题描述

我正在使用tabula是为了在接下来的pdf fileconcat全部tables

成为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)

当前输出check

但是从页面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)

enter image description here

示例

from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf",pages='90-91',index=False)

在这里,我已经运行了两个代码90和91。

从第48行开始,您将看到区别here

您将在此处注意到将名称和地址放在一个单元格中的问题。而城市和州也可以一次通话

解决方法

我研究了源代码,它具有选项columns,您可以手动定义列边界。设置<v-text-field label="Search" v-model="search" @input="handleSearch" > </v-text-field> <v-treeview ref="tree" :items="tree" :search="search" :open.sync="open" open-on-click hoverable> </v-treeview> data(){ return{ search: '',open: [1],allOpened: false,lastOpen: [] } } handleSearch: function (val) { if (val) { if (!this.allOpened) { this.lastOpen = this.open; this.allOpened = true; this.$refs.tree.updateAll(true); } } else { this.$refs.tree.updateAll(false); this.allOpened = false; this.open = this.lastOpen; } } 时,您必须使用columns

guess=False使用程序tabula-java,在其文档中,我发现它需要以百分比或点(而非像素)为单位的值。因此,我使用程序inkscape来测量点的边界。

enter image description here

tabula-py

结果:

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,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(' ') ])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...