先安装PyPDF2,据说这是目前最好的解析pdf的包
pip install PyPDF2
PDF文件分割、拼接
import os
from PyPDF2 import PdfFileWriter, PdfFileReader
def clear_dir(dir_path):
"""清空目录下的文件"""
names = os.listdir(dir_path)
for name in names:
file_path = os.path.join(dir_path, name)
cmd = 'del %s' % file_path #这个是windows命令
#cmd = 'rm -rf %s' % file_path #这个是Linux的命令
cmd = cmd.replace('/', '\\') #为啥要这个?因为windows命令不支持/所以需要替换,Linux命令没有遇见这个问题;
os.system(cmd) #可以通过返回值来判断是否执行成功:0成功,其他失败
def split_pdf(pdf, output_dir):
"""pdf按每页拆分"""
clear_dir(output_path)
# 获取 PdfFileReader 对象
reader = PdfFileReader(pdf_file)
pages_num = reader.getNumPages()
# writer = PdfFileWriter() 生成一个文件
for index in range(pages_num):
#可以通过对index判断分割想要的
writer = PdfFileWriter() #按照每页来分割pdf
pageObj = reader.getPage(index)
writer.addPage(pageObj)
# 添加完每页,再一起保存至文件中;如果要输出一个文件,后面这些放置到循环外即可
file_name = os.path.join(output_path, str(index) + '.pdf')
with open(file_name, 'wb') as fw:
writer.write(fw)
PDF文件抽取表格、文本
需要的包:pdfplumber,tabula,camelot
pdfplumber
①每页单独对象,支持文本、表格数据的抽取(亮点);
②文本抽取:保留了文本的格式,比如换行位置有空格,可以通过这个特点将一段的文本整合;
③表格数据抽取:不会被换行数据所干扰;
缺点:
①文本抽取:如果这页有表格数据,抽取到的文本数据中会包含表格数据(也可能是一个优点???)。
②表格数据抽取:对于有合并单元格的表格,无法还原表格结构。
③表格数据抽取:表格数据不能100%保证和原数据一致,可能少那么接个字,可能识别出错等。
④表格数据抽取(缺陷):最主要的还是对无边界的表格,效果很差,会丢失边缘的数据!!!
⑤表格数据抽取:会被流程图、柱状图干扰;
import pdfplumber
pdf = r'../data/text.pdf'
wookroot = pdfplumber.open(pdf)
pages = wookroot.pages
for page in pages:
text = page.extract_text()
tables = page.extract_tables()
print(text)
print(tables)
break
wookroot.close()
tablua
专门用于抽取PDF文件中表格数据的包
优点:
①抽取出来表格数据可以反向推导出表格的结构(亮点);
②不会换行数据干扰;
③可以指定页读取
缺点:
①无法保证表格数据100%准确;
②对于无边界表格支持不好,丢失数据;
import tablua
def get_tabula_tables(pdf_path):
dfs = tabula.read_pdf(pdf_path, pages='all', encoding='gbk')
tables = []
for df in dfs:
df = df.fillna('')
headers = df.keys().values.tolist()
lt = []
for header in headers:
if header.count('Unnamed'):
lt.append('')
continue
if header[-1].isdigit() and header.count('.'):
words = header.split('.')
line = '.'.join(words[:-1])
if headers.count(line):
lt.append(line)
continue
lt.append(header)
headers = lt
values = df.values.tolist()
lt = []
for words in values:
rows = []
for word in words:
if not isinstance(word, str):
word = str(word)
if word[-2:] == '.0':
word = word[:-2]
rows.append(word)
continue
rows.append(word)
lt.append(rows)
values = lt
values.insert(0, headers)
tables.append(values)
return tables
pdf_file = 'xxxx.pdf'
tables = get_tabula_tables(pdf_path)
读取表格中的整数,后面会带有“.0“。
PDF文件转docx
pdf提取困难,可以尝试先转换成文档。
pdf2docx
from pdf2docx import Converter
import logging
logging.disable(logging.INFO)
logging.disable(logging.DEBUG)
logging.disable(logging.WARNING)
pdf_file = 'xxx.pdf'
cv = Converter(pdf_file)
docx_file = 'xxx.docx'
cv.convert(docx_file)
cv.close()