91 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| # 读取PDF
 | ||
| import PyPDF2
 | ||
| # 分析PDF的layout,提取文本
 | ||
| from pdfminer.high_level import extract_pages
 | ||
| from pdfminer.layout import LTTextContainer, LTRect
 | ||
| import pdfplumber
 | ||
| import logging
 | ||
| 
 | ||
| log = logging.getLogger(__name__)
 | ||
| 
 | ||
| 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
 | ||
|     log.info("pagenum: %s  text: %s", pagenum, page_text)
 | ||
| 
 | ||
| # 打印提取的文本
 | ||
| # log.info(page_obj) |