如何基于关键词及格式获取PDF页码及指定区间?
问题解答
1. 基于关键词获取PDF页码数
你现有的代码已经实现了基础的关键词页码查找功能,这里提供优化后的实现,解决重复记录页码、页码起始值不符合阅读习惯的问题:
import fitz def fetch_keyword_pages(pdf_path, keyword): matched_pages = [] keyword_lower = keyword.lower() with fitz.open(pdf_path) as pdf: for page in pdf: page_text = page.get_text().lower() # 避免同一页码重复添加,同时转换为用户习惯的1起始页码 if keyword_lower in page_text and (page.number + 1) not in matched_pages: matched_pages.append(page.number + 1) if matched_pages: print(f"关键词「{keyword}」出现在以下页码:{matched_pages}") else: print(f"文档中未找到关键词「{keyword}」") # 调用示例 fetch_keyword_pages('example.pdf', 'keyword')
2. 基于关键词格式(粗体/斜体)获取页码范围
可以实现。PyMuPDF的page.get_text("words")方法能提取包含字体属性的文字块,通过检查字体flags属性中的fitz.TEXT_FONT_BOLD(粗体)或fitz.TEXT_FONT_ITALIC(斜体)标记,就能识别对应格式的内容,进而记录连续的页码范围。
以粗体为例的实现代码:
import fitz def get_formatted_text_page_ranges(pdf_path, format_type='bold'): format_flag_map = { 'bold': fitz.TEXT_FONT_BOLD, 'italic': fitz.TEXT_FONT_ITALIC } target_flag = format_flag_map.get(format_type.lower()) if not target_flag: print("仅支持'bold'(粗体)或'italic'(斜体)格式类型") return page_ranges = [] current_start = None with fitz.open(pdf_path) as pdf: total_pages = len(pdf) for page_idx, page in enumerate(pdf, start=1): has_target_format = False # 遍历文字块,检查字体格式标记 for word in page.get_text("words"): if word[5] & target_flag: has_target_format = True break # 记录连续的格式页码范围 if has_target_format and current_start is None: current_start = page_idx elif not has_target_format and current_start is not None: page_ranges.append((current_start, page_idx - 1)) current_start = None # 处理文档末尾仍有目标格式的情况 if current_start is not None: page_ranges.append((current_start, total_pages)) if page_ranges: print(f"格式「{format_type}」对应的页码范围:") for start, end in page_ranges: print(f"- 第{start}页 至 第{end}页") else: print(f"文档中未找到格式为「{format_type}」的内容") # 调用示例 get_formatted_text_page_ranges('example.pdf', 'bold')
注意:部分PDF可能存在自定义字体未正确标记粗体/斜体属性的情况,这种场景下无法准确识别格式。
内容的提问来源于stack exchange,提问作者user18486627
相关产品推荐
相关产品推荐

