使用 PyPdf2 更改 pdf 书签的顺序

2023-12-21

我创建了一个应用程序,将多个 pdf 与书签合并。如果原始pdf已经有书签,我想保留它们并在pdf的开头添加一个书签。我使用以下代码:titlepath代码中的内容来自用户输入。

from PyPDF2 import PdfFileReader, PdfFileMerger
from PyPDF2.utils import PdfReadError

merger = PdfFileMerger()
pages_total = 0
for path, title in zip(paths, titles):
    merger.append(path, import_bookmarks=True)
    with open(path, "rb") as file:
           pdf = PdfFileReader(file, "rb")
           pages_one = pdf.getNumPages()
           pages_total += pages_one

    merger.addBookmark(f"{title}", pages_total - pages_one, parent=None)

 save_path = input() + ".pdf"  
 merger.write(save_path)
 merger.close()

新的 pdf 包含所有书签,指向正确的页面。但是,整个 pdf 的书签出现在已存在的 pdf 之后。如何更改书签的显示顺序?

下图希望能澄清这个问题。最后一个书签已添加,并且应该位于列表中的第一个。


我找到了解决方案。首先,我创建一个带有 pdf 标题的父书签。然后我得到pdf中所有现有的书签pdf.getOutlines()并迭代输出:

parent = merger.addBookmark(f"{title}", pages_total - pages_one, parent=None)
for i in pdf.getOutlines():
     if isinstance(i, list):  # if nested bookmarks exists
         nested_boomarks(parent=child, bookmarks=i, merger=merger, pdf=pdf)
     else:
         child = merger.addBookmark(i["/Title"], pdf.getDestinationPageNumber(i), parent=parent)
                           

当书签内有书签时,我使用此递归函数。

def nested_boomarks(parent, bookmarks, merger, pdf):
        for i in bookmarks:
            if isinstance(i, list):
                nested_boomarks(child, i, merger, pdf)
            else:
                child = merger.addBookmark(i["/Title"], pdf.getDestinationPageNumber(i), parent=parent)

This way I get the following output: enter image description here

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

使用 PyPdf2 更改 pdf 书签的顺序 的相关文章

随机推荐

  • 使用堆算法生成排列

    我正在尝试使用我在维基百科中找到的堆算法生成数组的所有排列 这是我到目前为止所尝试的 n lt 3 A lt c 1 2 3 perm lt function n A if n 1 print perm for i in length A
  • AlertDialog setOnShowListener 从未调用过

    我使用稍微不同的方法 以便在按下按钮时保持对话框打开 AlertDialog Builder builder new AlertDialog Builder NewTableActivity this builder setTitle R
  • Delphi 10.2 for Win64 发布目标下的 FillChar 和 StringOfChar

    我有一个关于 Delphi 10 2 Pascal 编程语言中特定编程问题的问题 StringOfChar 和 FillChar 在 2012 年之前发布的 CPU 上的 Win64 版本构建下无法正常工作 FillChar 的预期结果只是
  • 使用bool(返回类型)来处理异常或将异常传递给客户端?

    我正在尝试找出处理异常的最佳方法 我的应用程序有多个层 并开始使用 BOOL 返回类型 即如果失败则返回 False 如果成功则返回 True 这在 SaveMyRecord somerecord 等方法中非常有效 因为我传入值并且不需要返
  • 如何在 Laravel 中从外键查看表字段

    我是 Laravel 的新手 不擅长语法 我想通过外键 该表的 ID 查看另一个表的值 https ibb co pXRFRHn https ibb co pXRFRHn你可以在这张图片中看到我在用户和类别下获得了 id 我想要与这些 id
  • LibGdx 如何对 HP Bar 进行编程?

    我目前正在尝试使用 LibGdx 编写游戏 我的游戏有很多结构部分 我现在正在寻求让游戏向玩家返回信息 我能想到的 UI 最简单的概念是 HP 条和弹药计数器 用于子弹 箭头等 这可以通过我的 GameScreen 类中的舞台和演员来完成吗
  • .NET Core 128kb 部署到 Azure 应用服务的文件大小限制

    我有一个在 Azure 应用服务实例上运行的 NET Core 2 0 Web 应用程序 当我尝试使用上传文件时file CopyToAsync 如果文件大于 128kB 则上传失败且没有诊断输出 某些照片类型 例如 png 即使大小有几
  • 如何将 List 的值而不是引用复制到另一个列表中?

    也就是说 在不引用同一对象的情况下 我需要将一个列表的元素值复制到另一个列表中 这些是列表 List
  • 编译期间的“Ignoring InnerClasses attribute”警告输出是什么?

    我是 Android 新手 正在使用Ical4j用于解析 ICS Outlook 日历 文件的库 但是 当我在 Eclipse 中构建应用程序时 控制台中多次出现以下警告 2010 07 22 15 58 31 Google 日历上传 警告
  • 排除重叠间隔

    我有两个间隔列表 我想从 list1 中删除 list2 中已存在的所有时间 例子 清单1 0 10 15 20 List2 2 3 5 6 Output 0 2 3 5 6 10 15 20 有什么提示吗 当时尝试删除一个间隔 但似乎我需
  • Python Flask 应用程序未随 sys exit 退出[重复]

    这个问题在这里已经有答案了 我希望能够使用如下 http 请求远程终止我的 Flask 应用程序 import flask import sys master flask Flask name master route shutdown d
  • Python 将 URL JSON 响应转换为 pandas 数据帧

    您好 我正在使用以下代码从 Python 调用 Web 服务 response urllib request urlopen req string response read decode utf 8 json obj json loads
  • MBCalendar套件框架如何添加到我的项目中

    I used MBCalendar套件框架 并成功添加到我的项目中 但问题是月份和日期无法显示模拟器 本周和今年的展会中只有一场顶级酒吧展会 我附上了我的输出快照 请找到它并在下面显示 我想在用户界面中成功显示日历 怎么可能请帮忙 impo
  • 如何在perl中动态加载模块并执行方法

    我正在跟进此事question https stackoverflow com questions 6336270关于 Perl Web 服务 我已经设法从主程序加载和执行模块 每个模块都是这样的 usr bin perl package
  • 带复制和赋值的 C++ Qt 反射

    As the QObject文档 http qt project org doc qt 4 8 qobject html no copy constructor or assignment operator和许多其他人解释说 QObject
  • 依赖 Aether 的 Maven mojo 可以兼容 Maven 3.0.x 和 3.1.x 吗?

    Maven 3 1 0 版本 http maven apache org docs 3 1 0 release notes html依赖于 Eclipse Aether org eclipse aether 而不是 Sonatype Aet
  • 随着鼠标滚动移动视频背景

    你看过凯蒂 佩里的网站吗 太棒了 我是认真的 没有垃圾邮件 它有一个移动的背景视频 我不明白他们是如何实现的 这是主页 http www katypeerry com http www katyperry com 当您开始向下滚动时 背景图
  • 页面上所有脚本完全加载后运行js函数

    当我的页面完全加载时 我试图运行一个简单的 JavaScript 函数 例如这个函数 我的页面有一个从外部 URL 检索的长时间加载 秒 脚本 该脚本呈现 html 正文中的主要内容 我正在使用 Bootstrap 其中我的主体部分base
  • 如何使用 glide 下载存储在 firebase 中的图像的缩略图

    我想从我的 firebase 存储中下载图像缩略图而不是整个图像 我正在使用 glide 来加载图像 但我不知道如何加载图像缩略图 因为它会更快且内存效率更高 您首先需要为图像创建缩略图 可能使用类似谷歌云功能 https cloud go
  • 使用 PyPdf2 更改 pdf 书签的顺序

    我创建了一个应用程序 将多个 pdf 与书签合并 如果原始pdf已经有书签 我想保留它们并在pdf的开头添加一个书签 我使用以下代码 title和path代码中的内容来自用户输入 from PyPDF2 import PdfFileRead