讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

使用PyPDF进行PDF文本提取:选择性页面处理与内容过滤

雨辰大大_2640

雨辰大大_2640

发布时间:2025-12-14 08:56:19

|

758人浏览过

|

来源于php中文网

原创

使用PyPDF进行PDF文本提取:选择性页面处理与内容过滤

本教程详细介绍了如何使用python的`pypdf`库从pdf文档中高效提取文本,并重点讲解了在提取过程中处理不需要内容(如页码或特定页面)的两种主要策略。文章将通过代码示例,演示如何根据页码选择性地跳过整个页面,以及如何通过字符串处理技术从已提取的页面文本中过滤掉嵌入的特定内容,从而生成更干净、更符合需求的文本输出。

PDF文本提取基础与常见挑战

在使用Python处理PDF文档时,pypdf库是一个强大且常用的工具,可以方便地读取PDF内容并提取文本。然而,在实际应用中,我们常常会遇到需要对提取的文本进行清洗的情况。例如,PDF页面中可能包含页码、页眉、页脚、水印或其他非内容性信息,这些元素在文本提取后可能会干扰后续的数据处理或分析。

以下是使用pypdf进行基本文本提取的示例:

from pypdf import PdfReader

# 假设我们有一个名为 "pdf-examples/kurdish-sample-2.pdf" 的PDF文件
reader = PdfReader("pdf-examples/kurdish-sample-2.pdf")
full_text = ""

for page in reader.pages:
    full_text += page.extract_text() + "\n"

print(full_text)

在某些情况下,上述代码的输出可能包含不希望出现的页码,例如:

5 دوارۆژی ئەم منداڵه بکەنەوە کە چۆن و چی بەسەر دێت و دووچاری

这里的数字“5”即为页面内容的一部分,而非我们希望提取的实际文本。为了解决这个问题,我们可以采用不同的策略。

策略一:根据页码跳过特定页面

如果某个页面包含的绝大部分内容都是不相关的(例如,仅有页码、版权信息或空白页),或者我们确定某个页面的文本完全不需要,最直接的方法是完全跳过该页面的文本提取。这可以通过在遍历页面时引入一个计数器并进行条件判断来实现。

实现方法:

  1. 初始化一个页面计数器。
  2. 在循环中,每次迭代时递增计数器。
  3. 使用条件语句(if)检查当前页码是否为需要跳过的页码。
  4. 如果匹配,则使用pass语句跳过当前页面的文本提取;否则,将页面文本添加到总文本中。

以下是实现这一策略的示例代码:

from pypdf import PdfReader

def extract_text_excluding_pages(pdf_path, pages_to_exclude=None):
    """
    从PDF中提取文本,并跳过指定的页面。

    Args:
        pdf_path (str): PDF文件的路径。
        pages_to_exclude (list or int, optional): 一个整数或整数列表,表示要跳过的页面索引(从1开始)。
                                                  如果为None,则提取所有页面。
    Returns:
        str: 提取到的所有页面的合并文本。
    """
    reader = PdfReader(pdf_path)
    extracted_text = ""

    # 确保 pages_to_exclude 是一个列表,方便处理单个或多个页面
    if isinstance(pages_to_exclude, int):
        pages_to_exclude = [pages_to_exclude]
    elif pages_to_exclude is None:
        pages_to_exclude = []

    for i, page in enumerate(reader.pages, start=1): # enumerate从1开始计数,与实际页码对应
        if i in pages_to_exclude:
            # 如果当前页码在排除列表中,则跳过该页
            pass
        else:
            # 否则,提取并添加页面文本
            extracted_text += page.extract_text() + "\n"

    return extracted_text

# 示例用法:跳过第5页
pdf_file = "pdf-examples/kurdish-sample-2.pdf"
filtered_text = extract_text_excluding_pages(pdf_file, pages_to_exclude=5)
print(filtered_text)

# 示例用法:跳过第1页和第3页
# filtered_text_multiple = extract_text_excluding_pages(pdf_file, pages_to_exclude=[1, 3])
# print(filtered_text_multiple)

注意事项:

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
  • enumerate(reader.pages, start=1) 确保页面计数器i从1开始,与PDF的实际页码习惯保持一致。
  • pages_to_exclude 参数可以是一个整数(跳过单页)或一个整数列表(跳过多页),提高了灵活性。
  • 此方法是跳过整个页面的文本提取,而不是从页面文本中移除某个特定元素。

策略二:从页面文本中过滤特定内容

如果页码或不需要的字符是页面实际文本的一部分,并且我们仍然需要该页面的其他内容,那么仅仅跳过整个页面是不够的。在这种情况下,我们需要在提取页面文本后,对其进行字符串处理,以移除或替换特定的模式。

实现方法:

  1. 正常提取每个页面的文本。
  2. 对提取到的文本应用字符串操作,例如:
    • lstrip(): 移除字符串开头的特定字符(例如,数字和空格)。
    • replace(): 替换字符串中的特定子串。
    • 正则表达式 (re模块): 针对更复杂的模式进行匹配和替换。

以下是使用lstrip()和正则表达式移除页码的示例:

import re
from pypdf import PdfReader

def extract_text_and_filter_content(pdf_path):
    """
    从PDF中提取文本,并尝试从每页文本的开头移除页码。

    Args:
        pdf_path (str): PDF文件的路径。

    Returns:
        str: 提取并过滤后的所有页面的合并文本。
    """
    reader = PdfReader(pdf_path)
    extracted_text = ""

    for i, page in enumerate(reader.pages, start=1):
        page_text = page.extract_text()
        if page_text:
            # 尝试移除开头的数字和空格,假设页码在开头
            # 例如 "5 دوارۆژی..." -> "دوارۆژی..."
            # 使用正则表达式匹配开头的数字和可能的空格
            # r"^\s*\d+\s*" 匹配字符串开头(^)的零个或多个空格(\s*),
            # 跟着一个或多个数字(\d+),再跟着零个或多个空格。
            filtered_page_text = re.sub(r"^\s*\d+\s*", "", page_text, 1) # 替换一次

            # 如果页码不总是在开头,或者格式更复杂,可能需要更复杂的正则表达式
            # 例如,移除所有单独的数字行或者页脚中的特定模式
            # 示例:移除所有只有数字的行 (假设每行以\n结尾)
            # filtered_page_text = "\n".join([line for line in filtered_page_text.split('\n') if not re.fullmatch(r'\s*\d+\s*', line)])

            extracted_text += filtered_page_text + "\n"

    return extracted_text

# 示例用法:
pdf_file = "pdf-examples/kurdish-sample-2.pdf"
filtered_content_text = extract_text_and_filter_content(pdf_file)
print(filtered_content_text)

注意事项:

  • re.sub(r"^\s*\d+\s*", "", page_text, 1):这个正则表达式会匹配字符串开头(^)的任意空白字符(\s*),接着是一个或多个数字(\d+),再接着任意空白字符,并将其替换为空字符串。1表示只替换第一次匹配到的。
  • 这种方法需要对页码出现的模式有一定了解。如果页码格式不固定,或者页码可能出现在文本的中间,则需要更复杂的正则表达式或更精细的文本解析逻辑。
  • 过度或不准确的过滤可能会误删实际内容。在应用此策略时,务必进行充分的测试。

综合考量与最佳实践

在选择上述两种策略时,应根据具体需求和PDF文档的特点进行判断:

  • 选择跳过页面 (策略一):当整个页面内容不重要,或者页码/不相关信息占据了页面大部分内容时,此方法最有效且性能开销最小。
  • 选择过滤内容 (策略二):当页面的核心内容仍然需要,但其中混入了需要剔除的特定元素(如页码、页眉/页脚文本)时,此方法更为适用。

更复杂的场景:

  • 页码位置不固定:如果页码可能在页眉、页脚或页面的其他位置,并且格式不统一,可能需要结合pypdf的几何信息(如page.cropbox、page.mediabox)来判断文本的相对位置,从而更准确地识别和移除页码。
  • 性能优化:对于非常大的PDF文件,频繁的字符串操作或复杂的正则表达式可能会影响性能。在这种情况下,可以考虑在提取文本时就进行初步过滤,或者使用更高效的文本处理库。

总结

pypdf库为Python用户提供了强大的PDF文本提取能力。通过结合页面迭代计数器进行条件判断,我们可以灵活地选择性地跳过不需要的页面。而当需要从页面文本中移除嵌入的特定元素时,Python强大的字符串处理功能和正则表达式则能提供精确的控制。理解并熟练运用这些策略,将有助于我们更高效、更准确地从PDF文档中获取所需的文本数据。

相关文章

极轻PDF
极轻PDF

专业的在线PDF工具,支持PDF编辑、转换、合并、压缩等多种功能,操作简单,处理高效,满足日常办公与学习中的PDF处理需求。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4976

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

3421

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9582

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

832

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

540

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

406

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

739

2023.12.06

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn