使用pdfminer提取PDF指定字号文本并批量处理生成pandas数据表
代码问题诊断
- 类型匹配错误:
character.size返回的是浮点型数值,你用它和字符串'10.000000000000057'做等值判断,结果永远为False,过滤逻辑完全失效 - 追加逻辑位置错误:
Extract_Data.append(element.get_text())写在了字号判断的循环外,不管字号是否符合要求,都会把当前文本块的内容加入结果列表,最终返回所有文本 - 浮点数精度问题:PDF渲染时的计算误差会导致字号出现大量小数位,直接用
==做等值判断稳定性极差,应该用误差范围近似匹配
单PDF指定字号提取修正代码
from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer, LTChar # 定义目标字号、允许的误差范围 TARGET_SIZES = [9.800000000000068, 10.000000000000057] TOLERANCE = 1e-6 Extract_Data = [] for page_layout in extract_pages(path): for element in page_layout: if isinstance(element, LTTextContainer): # 标记当前文本块是否包含符合字号要求的字符 is_target = False for text_line in element: for character in text_line: if isinstance(character, LTChar): # 近似匹配字号 for size in TARGET_SIZES: if abs(character.size - size) < TOLERANCE: is_target = True break if is_target: break if is_target: break if is_target: Extract_Data.append(element.get_text()) Data = ''.join(Extract_Data)
批量处理PDF生成pandas DataFrame完整代码
import os import pandas as pd import io from pdfminer.layout import LTTextContainer, LTChar, LAParams from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument, PDFTextExtractionNotAllowed from pdfminer.converter import PDFPageAggregator directory = 'C:/Users/Sample/' TARGET_SIZES = [9.800000000000068, 10.000000000000057] TOLERANCE = 1e-6 # 存储所有PDF的提取结果,每个元素对应一份PDF的内容 all_pdf_content = [] for file in os.listdir(directory): if not file.endswith(".pdf"): continue file_path = os.path.join(directory, file) # 存储单份PDF的符合要求文本 single_pdf_text = [] resource_manager = PDFResourceManager() params = LAParams(detect_vertical=True, all_texts=True) device = PDFPageAggregator(resource_manager, laparams=params) interpreter = PDFPageInterpreter(resource_manager, device) with open(file_path, 'rb') as fh: parser = PDFParser(fh) document = PDFDocument(parser, '') if not document.is_extractable: raise PDFTextExtractionNotAllowed for page in PDFPage.create_pages(document): interpreter.process_page(page) page_layout = device.get_result() for element in page_layout: if isinstance(element, LTTextContainer): is_target = False for text_line in element: for character in text_line: if isinstance(character, LTChar): for size in TARGET_SIZES: if abs(character.size - size) < TOLERANCE: is_target = True break if is_target: break if is_target: break if is_target: break if is_target: single_pdf_text.append(element.get_text()) # 合并单份PDF的所有符合要求文本,存入总列表 all_pdf_content.append([''.join(single_pdf_text)]) # 生成每行对应一份PDF内容的DataFrame df = pd.DataFrame(all_pdf_content, columns=['提取内容'])
内容的提问来源于stack exchange,提问作者id345678
相关产品推荐
相关产品推荐

