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

作者:

文章目录
  • 在日常学习或工作中,我们经常会遇到需要整理大量 PDF 文件的情况。PDF 文件中的书签(也称为大纲或目录)是快速导航的重要工具,但有时我们需要将这些书签提取出来单独保存以便查看或编辑。本文将介绍一个基于 Python 的工具,它可以批量处理指定目录下的 PDF 文件,提取其中的书签并保存为文本文件。无论你是技术爱好者还是需要处理文档的专业人士,这个工具都能帮到你!
  • PDF 文件的书签通常嵌套在文档的元数据中,手动复制粘贴既费时又容易出错。如果需要处理多个 PDF 文件,这种重复劳动更是让人头疼。好在 Python 提供了强大的库,比如 PyPDF2,可以帮助我们轻松访问 PDF 的内部结构。通过编写一个自动化脚本,我们可以一次性处理多个文件,提取书签并按层级保存。 这个工具的目标是: 遍历指定目录下的所有 PDF 文件。 提取每个 PDF 的书签(包括嵌套层级)。 将书签保存为格式化的文本文件。 提供友好的交互式界面,支持批量处理。
  • 脚本包含以下几个核心功能: 递归提取书签:支持多层嵌套的书签结构。 批量处理:自动扫描目录中的 PDF 文件并逐一处理。 错误处理:对无效文件或缺少书签的情况进行提示。 交互式界面:用户可以输入目录路径并选择是否继续处理。 接下来,我们将深入探讨代码的实现细节。
  • 假设你有一个文件夹,里面存放了多本电子书的 PDF 文件,每本都有详细的书签。你可以使用这个工具: 运行脚本,输入文件夹路径。 脚本自动扫描并生成每个 PDF 的书签文本文件。 你可以将这些书签导入笔记软件,或用于快速检索内容。 例如: 输入目录:D:/Books 输出结果:D:/Books/book1_bookmarks.txt, D:/Books/book2_bookmarks.txt 输出文件可能如下: – Chapter 1 – Section 1.1 – Section 1.2 – Chapter 2
  • 确保安装了 Python 和 PyPDF2。 将脚本保存为 pdf_bookmark_extractor.py。 在终端运行: python pdf_bookmark_extractor.py 按照提示输入目录路径即可。
  • 脚本依赖 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书签的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python对PDF书签进行添加,修改提取和删除操作 使用Python给PDF添加目录书签的实现方法 Python生成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书签的资料请关注风君子博客其它相关文章!

              您可能感兴趣的文章:

              • Python对PDF书签进行添加,修改提取和删除操作
              • 使用Python给PDF添加目录书签的实现方法
              • Python生成pdf目录书签的实例方法

              站内搜索