基于PDFminer按页获取文本字号并提取PDF每页标题的实现问题
代码修改方案
你原来的代码是把全文档所有文本块的数据都存入同一个一维列表,要实现按页拆分,只需要在遍历每页时单独创建当前页的临时存储列表即可,修改后代码如下:
from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer, LTChar import os path=r'cov.pdf' # 总数据是嵌套列表,每个子元素对应单页的所有[字号, 文本]数据 Extract_Data=[] for page_layout in extract_pages(path): # 每一页开始时初始化当前页的空列表 page_data = [] for element in page_layout: if isinstance(element, LTTextContainer): Font_size = 0 for text_line in element: for character in text_line: if isinstance(character, LTChar): # 若要提升准确性可改为取当前文本块的最大字号:Font_size = max(Font_size, character.size) Font_size = character.size # 把当前文本块数据加入当前页列表,过滤无有效字符的空块 if Font_size > 0: page_data.append([Font_size, element.get_text()]) # 当前页处理完成,加入总数据 Extract_Data.append(page_data)
结果使用说明
- 要获取指定页的数据直接按索引取值即可,你需要的第8页对应
Extract_Data[7](pdfminer遍历页码从0开始计数),结构和你给出的预期输出完全一致。 - 提取每页标题可以直接对单页列表按字号降序排序,取第一个非空文本的内容即可,示例逻辑如下:
for page_idx, page_data in enumerate(Extract_Data): # 按字号从大到小排序 page_data_sorted = sorted(page_data, key=lambda x: -x[0]) # 过滤纯空格/换行的空文本 for item in page_data_sorted: title = item[1].strip() if title: print(f"第{page_idx+1}页标题:{title}") break
补充说明
你原代码中是取文本块最后一个字符的字号作为整个文本块的字号,如果存在单个文本块内有多种字号的场景,可以把字号赋值逻辑替换为取当前文本块的最大字号,结果会更准确。
内容的提问来源于stack exchange,提问作者MTALY
相关产品推荐
相关产品推荐

