pdf相关模块介绍与安装 Python提取PDF文字

pdf相关模块简介与安装

pypdf2模块

它可以读取、写入、分割、合并PDF文件,需要单独安装,不包含在Python标准模块里,官网:https://pythonhosted.org/PyPDF2/

pdfplumber模块

它可以更好地读取PDF文件内容,可以提取PDF中的表格,也是需要单独安装,不包含在Python标准模块里,官网:https://github.com/jsvine/pdfplumber/

发挥你的想象力!节约你的时间!有好多PDF要合并到同一个PDF里?从一堆财报中找到关键的呢些数据?批量加密PDF?把某些页面旋转一下?批量添加水印?……

直接使用pip命令安装PyPDF2和pdfplumber即可,鳄鱼君这里直接在pycharm的setting里面安装的,应该不会出现问题!

pdfplumber提取文字

利用pdfplumber提取文字,使用pdfplumber.open(PDF路径)打开PDF文件,pdf.pages[页数]获取页数,page.extract_text()获取文本内容

import pdfplumber
with pdfplumber.open('1.pdf') as pdf:
   for page in pdf.pages:
       print(page.extract_text())
   # first_page=pdf.pages[0]
   # print(first_page.extract_text())

pdfplumber提取表格

提取简单的表格

import pdfplumber
with pdfplumber.open('1.pdf') as pdf:
   table_page=pdf.pages[0]
   table=table_page.extract_table()
   print(table)

提取多个简单表格

import pdfplumber
with pdfplumber.open('1.pdf') as pdf:
   table_page=pdf.pages[0]
   for table in table_page.extract_tables():
       print(table)

extract_tables()方法接收table_settings参数,该参数是一个字典,可以规定表格的信息,可以查看官方文档,这里不详细介绍!

{
    "vertical_strategy": "lines", 
    "horizontal_strategy": "lines",
    "explicit_vertical_lines": [],
    "explicit_horizontal_lines": [],
    "snap_tolerance": 3,
    "join_tolerance": 3,
    "edge_min_length": 3,
    "min_words_vertical": 3,
    "min_words_horizontal": 1,
    "keep_blank_chars": False,
    "text_tolerance": 3,
    "text_x_tolerance": None,
    "text_y_tolerance": None,
    "intersection_tolerance": 3,
    "intersection_x_tolerance": None,
    "intersection_y_tolerance": None,
}

PDF写入Excel表格

将pdf中提取到的table写入到Excel表格中

from openpyxl import Workbook
workbook=Workbook()
sheet=workbook.active
for row in table:
    sheet.append(row)
workbook.save(filename='./new_book.xlsx')

对于不规整的PD表格,在提取的过程可能会出现空行和单词切分的问题,这里需要进行判断。对于空行,需要判断,非空行的才写入Excel表格,将列表中每个元素都连成一个字符串,如果还是一个空字符串那么就肯定是空行:

new_table=[]
for row in table:
    if not ''.join([str(item) for item in row]) =='':
        sheet.append(row)

合并单词,这里假设Excel表格中的前3列表示PDF中的1列数据,需要将Excel中的前3列合并:

new_row=[]
ner_row.append(''.join([str(item) if item else '' for item in row[:3]]))
new_row=row[3:]
new_table.append(new_row)

将前3列非None的内容合并为一个字符串,然后再添加到列表中。行内条件判断,就是一行代码完成条件判断:

x=5
y=x*2 if x<10 else 20
print(y)

如果x小于10,y值为x*2,否则y值为20,就这么理解!

发表评论