88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
# 读取PDF
|
||
import PyPDF2
|
||
# 分析PDF的layout,提取文本
|
||
from pdfminer.high_level import extract_pages
|
||
from pdfminer.layout import LTTextContainer, LTRect
|
||
import pdfplumber
|
||
|
||
import os
|
||
|
||
'''
|
||
已知发现问题:
|
||
1.表格和文本提取错误,表格和文本内容在同一页,文本在前表格在后的,文本数据提取不出来
|
||
2.大模型抽取错,抽取2023年营业收入:主营业务收入、分产品的营业收入、变动比例被错误抽取
|
||
'''
|
||
|
||
# 查找PDF路径
|
||
pdf_path = '/Users/zhengfei/Desktop/科润智控.pdf'
|
||
page_obj = []
|
||
|
||
# 我们从PDF中提取页面
|
||
for pagenum, page in enumerate(extract_pages(pdf_path)):
|
||
page_text = ''
|
||
text_obj = {}
|
||
# 初始化检查表的数量
|
||
table_num = 0
|
||
first_element= True
|
||
table_extraction_flag= False
|
||
# # 打开pdf文件
|
||
pdf = pdfplumber.open(pdf_path)
|
||
# 查找已检查的页面
|
||
page_tables = pdf.pages[pagenum]
|
||
# 找出本页上的表格数目
|
||
tables = page_tables.find_tables()
|
||
|
||
# 找到所有的元素
|
||
page_elements = [(element.y1, element) for element in page._objs]
|
||
# 对页面中出现的所有元素进行排序
|
||
page_elements.sort(key=lambda a: a[0], reverse=True)
|
||
|
||
# 查找组成页面的元素
|
||
for i,component in enumerate(page_elements):
|
||
# 提取PDF中元素顶部的位置
|
||
pos= component[0]
|
||
# 提取页面布局的元素
|
||
element = component[1]
|
||
|
||
# 检查该元素是否为文本元素
|
||
if isinstance(element, LTTextContainer):
|
||
# 检查文本是否出现在表中
|
||
|
||
if table_extraction_flag == False:
|
||
# 使用该函数提取每个文本元素的文本和格式
|
||
line_text = element.get_text().replace('\s+', '').replace('\n', '').replace('\r', '')
|
||
# 将每行的文本追加到页文本
|
||
if len(line_text) > 5:
|
||
page_text += line_text
|
||
|
||
# 附加每一行包含文本的格式
|
||
else:
|
||
# 省略表中出现的文本
|
||
pass
|
||
|
||
# 检查表的元素
|
||
if isinstance(element, LTRect):
|
||
# 如果第一个矩形元素
|
||
if first_element == True and (table_num+1) <= len(tables):
|
||
# 找到表格的边界框
|
||
lower_side = page.bbox[3] - tables[table_num].bbox[3]
|
||
upper_side = element.y1
|
||
# 将标志设置为True以再次避免该内容
|
||
table_extraction_flag = True
|
||
# 让它成为另一个元素
|
||
first_element = False
|
||
|
||
# 检查我们是否已经从页面中提取了表
|
||
if element.y0 >= lower_side and element.y1 <= upper_side:
|
||
pass
|
||
elif not isinstance(page_elements[i+1][1], LTRect):
|
||
table_extraction_flag = False
|
||
first_element = True
|
||
table_num+=1
|
||
|
||
text_obj['page_num'] = pagenum
|
||
text_obj['text'] = page_text
|
||
print("pagenum:",pagenum," text:",page_text)
|
||
|
||
# 打印提取的文本
|
||
# print(page_obj) |