You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于关键词及格式获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:32:30