当前位置: 代码网 > it编程>前端脚本>Python > 基于Python开发批量提取PDF书签的实用工具

基于Python开发批量提取PDF书签的实用工具

2025年08月05日 Python 我要评论
引言在日常学习或工作中,我们经常会遇到需要整理大量 pdf 文件的情况。pdf 文件中的书签(也称为大纲或目录)是快速导航的重要工具,但有时我们需要将这些书签提取出来单独保存以便查看或编辑。本文将介绍

引言

在日常学习或工作中,我们经常会遇到需要整理大量 pdf 文件的情况。pdf 文件中的书签(也称为大纲或目录)是快速导航的重要工具,但有时我们需要将这些书签提取出来单独保存以便查看或编辑。本文将介绍一个基于 python 的工具,它可以批量处理指定目录下的 pdf 文件,提取其中的书签并保存为文本文件。无论你是技术爱好者还是需要处理文档的专业人士,这个工具都能帮到你!

背景与需求

pdf 文件的书签通常嵌套在文档的元数据中,手动复制粘贴既费时又容易出错。如果需要处理多个 pdf 文件,这种重复劳动更是让人头疼。好在 python 提供了强大的库,比如 pypdf2,可以帮助我们轻松访问 pdf 的内部结构。通过编写一个自动化脚本,我们可以一次性处理多个文件,提取书签并按层级保存。

这个工具的目标是:

  1. 遍历指定目录下的所有 pdf 文件。
  2. 提取每个 pdf 的书签(包括嵌套层级)。
  3. 将书签保存为格式化的文本文件。
  4. 提供友好的交互式界面,支持批量处理。

功能概览

脚本包含以下几个核心功能:

  • 递归提取书签:支持多层嵌套的书签结构。
  • 批量处理:自动扫描目录中的 pdf 文件并逐一处理。
  • 错误处理:对无效文件或缺少书签的情况进行提示。
  • 交互式界面:用户可以输入目录路径并选择是否继续处理。

接下来,我们将深入探讨代码的实现细节。

技术实现

依赖库

脚本依赖以下两个库:

  • os:用于文件和目录操作。
  • pypdf2:用于读取 pdf 文件并提取书签。

安装 pypdf2 的命令如下:

pip install pypdf2

核心函数解析

extract_bookmarks(outline, level=0, bookmarks_list=none)

  • 功能:递归提取 pdf 的书签(outline),支持嵌套结构。
  • 逻辑
    • 如果传入的 outline 为空,直接返回。
    • 遍历每个书签项,检查其类型:
      • 如果是字典(dict),提取标题并记录层级(通过缩进表示)。
      • 如果是列表(list),递归调用自身处理子节点。
      • 对未识别的类型打印调试信息。
  • 返回值:包含所有书签的列表,每项前面带有缩进以反映层级。

save_bookmarks_to_file(bookmarks, output_file)

  • 功能:将提取的书签保存到指定文本文件中。
  • 细节:使用 utf-8 编码写入,确保支持多语言字符。

process_pdfs_in_directory(input_dir, output_dir)

  • 功能:处理指定目录中的所有 pdf 文件。
  • 步骤
    • 检查并创建输出目录。
    • 扫描 .pdf 文件并逐一处理。
    • 使用 pdfreader 读取 pdf,提取 outline
    • 调用 extract_bookmarks 获取书签列表。
    • 将结果保存为 {文件名}_bookmarks.txt

main()

  • 功能:提供交互式入口。
  • 流程
    • 提示用户输入 pdf 文件目录和输出目录。
    • 调用 process_pdfs_in_directory 处理文件。
    • 支持循环操作,直到用户选择退出。

代码亮点

  • 递归设计extract_bookmarks 使用递归优雅地处理嵌套书签。
  • 健壮性:通过异常捕获和条件检查,避免程序因文件损坏或缺少书签而崩溃。
  • 用户友好:交互式界面让非技术用户也能轻松使用。

使用场景

假设你有一个文件夹,里面存放了多本电子书的 pdf 文件,每本都有详细的书签。你可以使用这个工具:

  1. 运行脚本,输入文件夹路径。
  2. 脚本自动扫描并生成每个 pdf 的书签文本文件。
  3. 你可以将这些书签导入笔记软件,或用于快速检索内容。

例如:

  • 输入目录:d:/books
  • 输出结果:d:/books/book1_bookmarks.txt, d:/books/book2_bookmarks.txt

输出文件可能如下:

- chapter 1
  - section 1.1
  - section 1.2
- chapter 2

如何运行

  1. 确保安装了 python 和 pypdf2
  2. 将脚本保存为 pdf_bookmark_extractor.py
  3. 在终端运行:
python pdf_bookmark_extractor.py
  1. 按照提示输入目录路径即可。

注意事项

  • 脚本依赖 pdf 文件的书签数据。如果 pdf 未嵌入书签,程序会提示并跳过。
  • 对于复杂或损坏的 pdf 文件,可能会出现提取失败的情况,此时会显示错误信息。

完整代码

以下是完整的 python 脚本:

import os
from pypdf2 import pdfreader

def extract_bookmarks(outline, level=0, bookmarks_list=none):
    """递归提取所有层级的书签内容"""
    if bookmarks_list is none:
        bookmarks_list = []
    
    if not outline:
        return bookmarks_list
    
    for item in outline:
        if isinstance(item, dict):
            title = item.get('/title', 'unnamed')
            bookmarks_list.append("  " * level + f"- {title}")
            if '/kids' in item or 'kids' in item:
                kids = item.get('/kids', item.get('kids', []))
                extract_bookmarks(kids, level + 1, bookmarks_list)
        elif isinstance(item, list):
            extract_bookmarks(item, level + 1, bookmarks_list)
        else:
            print(f"未识别的书签项类型: {type(item)} - {item}")
    
    return bookmarks_list

def save_bookmarks_to_file(bookmarks, output_file):
    """将书签保存到文件中"""
    with open(output_file, 'w', encoding='utf-8') as f:
        for line in bookmarks:
            f.write(line + "\n")
    print(f"书签已保存到: {output_file}")

def process_pdfs_in_directory(input_dir, output_dir):
    """处理指定目录下的所有 pdf 文件"""
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"已创建输出目录: {output_dir}")

    pdf_files = [f for f in os.listdir(input_dir) if f.lower().endswith('.pdf')]
    
    if not pdf_files:
        print("指定目录中没有找到 pdf 文件!")
        return

    print(f"找到 {len(pdf_files)} 个 pdf 文件,开始处理...")
    
    for pdf_file in pdf_files:
        pdf_path = os.path.join(input_dir, pdf_file)
        print(f"\n正在处理: {pdf_file}")
        
        try:
            pdf = pdfreader(pdf_path)
            outline = pdf.outline
            
            if not outline:
                print(f"{pdf_file} 没有书签,跳过。")
                continue
            
            bookmarks = extract_bookmarks(outline)
            if not bookmarks:
                print(f"{pdf_file} 未提取到任何书签,可能结构复杂。")
                continue
            
            print("提取到的书签:")
            for idx, bookmark in enumerate(bookmarks, 1):
                print(f"{idx}. {bookmark}")
            
            output_filename = os.path.splitext(pdf_file)[0] + "_bookmarks.txt"
            output_path = os.path.join(output_dir, output_filename)
            save_bookmarks_to_file(bookmarks, output_path)
        
        except exception as e:
            print(f"处理 {pdf_file} 时出错:{e}")

def main():
    """主程序:交互式选择目录并提取所有 pdf 的书签"""
    print("欢迎使用 pdf 书签批量提取工具!")
    
    while true:
        input_dir = input("请输入包含 pdf 文件的目录路径(或输入 'q' 退出):").strip()
        
        if input_dir.lower() == 'q':
            print("退出程序。")
            break
        
        if not os.path.isdir(input_dir):
            print("目录不存在,请重新输入!")
            continue
        
        output_dir = input("请输入保存书签的输出目录路径(默认与输入目录相同):").strip()
        if not output_dir:
            output_dir = input_dir
        
        process_pdfs_in_directory(input_dir, output_dir)
        
        continue_choice = input("\n是否继续处理其他目录?(y/n): ").strip().lower()
        if continue_choice != 'y':
            print("退出程序。")
            break

if __name__ == "__main__":
    main()

总结

这款工具展示了 python 在文件处理和自动化任务中的强大能力。通过几行代码,我们实现了一个实用的小程序,不仅节省时间,还能轻松扩展功能(比如支持其他格式或添加图形界面)。希望这篇文章能激发你对 python 的兴趣,也欢迎根据自己的需求改进这个脚本!

以上就是基于python开发批量提取pdf书签的实用工具的详细内容,更多关于python批量提取pdf书签的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com