读取 PDF 文档中的所有书签,并使用书签的页码和标题创建字典

2023-12-12

我尝试使用 Python 和 PyPDF2 包来阅读 PDF 文档。目标是读取pdf中的所有书签,并构建一个以书签页码为键、书签标题为值的字典。

互联网上没有太多关于如何实现它的支持,除了this文章。其中发布的代码不起作用,我不是 python 专家来纠正它。 PyPDF2 的阅读器对象有一个名为outlines它为您提供了所有书签对象的列表,但没有书签的页码,并且遍历该列表并不困难,因为书签之间没有父/子关系。

我在下面分享我的代码来阅读 pdf 文档并检查outlines财产。

import PyPDF2

reader = PyPDF2.PdfFileReader('SomeDocument.pdf')

print(reader.numPages)
print(reader.outlines[1][1])

通过使列表彼此嵌套来保留父/子关系。此示例代码将以缩进的目录形式递归显示书签:

import PyPDF2


def show_tree(bookmark_list, indent=0):
    for item in bookmark_list:
        if isinstance(item, list):
            # recursive call with increased indentation
            show_tree(item, indent + 4)
        else:
            print(" " * indent + item.title)


reader = PyPDF2.PdfFileReader("[your filename]")

show_tree(reader.getOutlines())

我不知道如何检索页码。我尝试了一些文件,并且page的属性Destination对象始终是一个实例IndirectObject,其中似乎不包含任何有关页码的信息。

UPDATE:

有一个获取目标页码从中获取页码的方法Destination对象。修改代码以创建您想要的字典:

import PyPDF2


def bookmark_dict(bookmark_list):
    result = {}
    for item in bookmark_list:
        if isinstance(item, list):
            # recursive call
            result.update(bookmark_dict(item))
        else:
            result[reader.getDestinationPageNumber(item)] = item.title
    return result


reader = PyPDF2.PdfFileReader("[your filename]")

print(bookmark_dict(reader.getOutlines()))

但是,请注意,如果同一页面上有多个书签(字典键必须是唯一的),您将覆盖并丢失一些值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取 PDF 文档中的所有书签,并使用书签的页码和标题创建字典 的相关文章

随机推荐

  • 将本地文件推送到 github 存储库中的目录

    我的本地存储库中有一个文件 我想将其推送到我的 Github 存储库中的目录 我有以下文件 F Development Python Workspace StringCalculator py 我需要将此文件推送到我的存储库的以下路径 ht
  • 尽管存在显式实例化,但类模板的成员函数模板找不到定义。不链接

    Edit 这不是链接问题的重复 因为我使用的是显式实例化 并且只有特定类型的成员函数不链接 其他函数会链接 以下代码可以编译但无法链接 我不明白为什么 它显式实例化Vector类来限制可能的参数数量T因此隐藏了定义Vector
  • SQL Server 2008 Express 无法附加 mdf 文件

    这是消息 它出什么问题了 是安装问题吗 标题 Microsoft SQL Server Management Studio 无法显示请求的对话框 附加信息 参数名称 nColIndex 实际值为 1 微软 SqlServer GridCon
  • Powershell - 根据文件名创建文件夹,然后将该文件放入该文件夹中

    我有一个文件列表说 T123 Product 1 jpg T123 Product 2 jpg T123 Product 3 jpg T456 Product 1 jpg T456 Product 2 jpg T456 Product 3
  • 如何在循环中使用 mutate 和 ifelse?

    我所做的是创建虚拟变量来指示连续变量是超过某个阈值 1 还是低于该阈值 0 我通过几次重复的突变实现了这一点 我想用循环代替 load tidyverse library tidyverse create data data lt data
  • 覆盖 XML 序列化方法

    我在尝试自定义 DateTime 变量在我的对象中序列化的方式时遇到问题 我希望它输出为 2011 09 26T13 00 00Z 但是当我重写 GetObjectData 函数 我认为这是执行此操作的方法 时 根本不会为它们输出任何 XM
  • 带有动态选项组的下拉列表

    嗨 cakephp 专家 我正在寻求您对带有动态 optgroup 的动态下拉列表的帮助 假设我有两个表 countries id country name counties id county name country id 现在 我想显
  • Android-NavigationView从右到左

    我正在使用 Android Studio 1 5 的最新版本 我想使用抽屉布局制作一个菜单 用于定位其调用 GravityCompat 我正在尝试使用这个组件并修改它 将抽屉从右向左放置 这是我的代码 public class MainAc
  • iOS 8 中的 NSDateFormatter 日期格式问题

    我有一个 NSDateFormatter 用来将 NSDate 格式化为字符串 以下格式不起作用 ddMMyyyy hhmmss SSS 当我尝试格式化 NSDate 时 我得到以下输出 18092014 08 49 03 638 其中有一
  • Azure 搜索是否处理同义词

    Azure 搜索 可以根据同义词进行搜索吗 例如 如果我搜索 鞋类 系统应该获取以下结果 鞋类的同义词 如鞋子 凉鞋等 我进行了很多搜索 但未能找到有关它的适当文档 我能找到的最接近的是一个帖子说它还不支持 但这是一个旧帖子 https s
  • 从静态方法调用 startActivityForResult

    我有一个按钮监听器 当用户单击按钮时我想启动相机意图 目前我有这个 public class ButtonListener implements View OnClickListener private ArrayList
  • 在整个页面加载之前显示加载栏

    我想在加载整个页面之前显示一个加载栏 目前 我只是使用了一个小的延迟 document ready function page fadeIn 2000 该页面已使用 jQuery 注意 我已经尝试过这个 但它对我不起作用 脚本运行时加载栏
  • Python“for i in”+变量

    我有以下代码 Euler Problem 1 print We are going to solve Project Euler s Problem 1 euler number input What number do you want
  • 如何在Linux上指定时间运行脚本? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个包含特定日期和时间的文本文件 我希望能够在该文件中指定的时间运行脚本 你将如何实现这一目标 创建另一个在后台运行的脚本 类似于守护程序 并每秒检查当前时间是否与文件中的时间匹
  • 将电子邮件另存为 MSG 文件,无需使用 Outlook(COM 对象等)或第 3 方软件

    现在 我正在使用 Exchange Web 服务 API 和 PowerShell 从 Exchange 中提取特定电子邮件并将其保存为 EML 文件 这很好用 但是 用户 客户要求电子邮件采用 msg 格式 我见过有两种方法可以做到这一点
  • 录制时拍摄相机屏幕截图 - 就像 Galaxy S3 一样?

    我正在开发一个使用 SurfaceView 进行显示的相机应用程序 我可以截取 SurfaceView 的屏幕截图 并将其保存为位图 使用 getDrawingCache 在包装 SurfaceView 的布局上 还有canvas draw
  • VBA:等待 Bloomberg BDP 通话完成

    我有一个脚本将一些外部数据导入到工作表中 这反过来会影响一些 BDP 公式 最好 我想在复制数据后立即对 BDP 结果进行一些检查 Bloomberg Excel 插件异步更新 如何等待结果然后恢复脚本 似乎只有在 VBA 脚本完成后才会导
  • 为 Nitrogen6x 构建 Qt 5 时出现 libm 重定位错误

    我正在尝试在 Qt 5 上构建氮气6x板由 i MX6Q 供电 我已经安装了Debian 喘息在板上 我正在使用乌班图12 10交叉编译机 配置 Qt 就像一个魅力 但我陷入了 make 步骤 这是我运行的配置脚本 configure v
  • 如何设计一封安全且“自毁”的电子邮件?

    正如大多数人所知 电子邮件非常不安全 即使客户端和发送电子邮件的服务器之间有 SSL 安全连接 消息本身在 Internet 上的节点间跳跃时也将采用明文形式 从而容易被窃听 另一个考虑因素是 发件人可能不希望邮件在一段时间后或在被阅读一次
  • 读取 PDF 文档中的所有书签,并使用书签的页码和标题创建字典

    我尝试使用 Python 和 PyPDF2 包来阅读 PDF 文档 目标是读取pdf中的所有书签 并构建一个以书签页码为键 书签标题为值的字典 互联网上没有太多关于如何实现它的支持 除了this文章 其中发布的代码不起作用 我不是 pyth