合并 PDF,同时保留自定义页码(也称为页面标签)和书签

2024-04-27

我正在尝试自动合并多个 PDF 文件,并且有两个要求:a) 现有书签和 b) 需要保留页面标签(自定义页码)。

默认情况下,PyPDF2 和 pdftk 会在合并时保留书签,但 pdfrw 不会。 PyPDF2、pdftk 或 pdfrw 中始终不保留页面标签。

经过大量搜索后,我猜测没有直接的方法可以做我想做的事情。如果我错了,那么我希望有人能指出这个简单的解决方案。但是,如果没有简单的解决方案,任何关于如何在 python 中实现这一点的提示将不胜感激!

一些示例代码:

1)使用PyPDF2

from PyPDF2 import PdfFileWriter, PdfFileMerger, PdfFileReader 
tmp1 = PdfFileReader('file1.pdf', 'rb')
tmp2 = PdfFileReader('file2.pdf', 'rb')
#extracting pagelabels is easy
pl1 = tmp1.trailer['/Root']['/PageLabels']
pl2 = tmp2.trailer['/Root']['/PageLabels']
#but PdfFileWriter or PdfFileMerger does not support writing from what I understand

所以我不知道如何从这里开始

2)使用 pdfrw (有更多希望)

from pdfrw import PdfReader, PdfWriter
writer = PdfWriter()
#read 1st file
tmp1 = PdfReader('file1')
#add the pages
writer.addpages(tmp1.pages)
#copy bookmarks to writer
writer.trailer.Root.Outlines = tmp1.Root.Outlines
#copy pagelabels to writer
writer.trailer.Root.PageLabels = tmp1.Root.PageLabels
#read second file
tmp2 = PdfReader('file2')
#append pages
writer.addpages(tmp2.pages)
# so far so good

第二个文件中的书签页码在添加之前需要偏移,但是在阅读大纲时我几乎总是得到 (IndirectObject, XXX) 而不是页码。目前还不清楚如何使用 pdfrw 获取每个标签和书签的页码。所以,我又陷入困境了

zp


正如我的评论中提到的,我发布了一个通用解决方案来合并在 PyPDF2 中工作的多个 pdf。除了初始化之外,不知道在 PyPDF2 中进行这项工作有什么不同ArrayObject()

from PyPDF2 import PdfFileWriter, PdfFileMerger, PdfFileReader
import PyPDF2.pdf as PDF

# pls holds all the pagelabels as we iterate through multiple pdfs
pls = PDF.ArrayObject()
# used to offset bookmarks 
pageCount = 0
cpdf = PdfFileMerger()
# pdffiles is a list of all files to be merged
for i in range(len(pdffiles)):
    tmppdf = PdfFileReader(pdffiles[i], 'rb')
    cpdf.append(tmppdf)
    # copy all the pagelabels which I assume is present in all files
    # you could use 'try' in case no pagelabels are present
    plstmp = tmppdf.trailer['/Root']['/PageLabels']['/Nums']
    # sometimes keys are indirect objects
    # so, iterate through each pagelabel and...
    for j in range(len(plstmp)):
        # ... get the actual values 
        plstmp[j] = plstmp[j].getObject()
        # offset pagenumbers by current count of pages
        if isinstance(plstmp[j], int): 
            plstmp[j] = PDF.NumberObject(plstmp[j] + pageCount) 
    # once all the pagelabels are processed I append to pls
    pls += plstmp
    #increment pageCount
    pageCount += tmppdf.getNumPages()

# rest follows KevinM's answer
pagenums = PDF.DictionaryObject()
pagenums.update({PDF.NameObject('/Nums') : pls})
pagelabels = PDF.DictionaryObject()
pagelabels.update({PDF.NameObject('/PageLabels') : pagenums})
cpdf.output._root_object.update(pagelabels)
cpdf.write("filename.pdf")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并 PDF,同时保留自定义页码(也称为页面标签)和书签 的相关文章

随机推荐

  • 查找游戏对象的子对象的子对象

    我在场景中有一个预制件 我想访问该预制件的子项 该预制件的结构如下 PauseMenu UI Resume TextField TextField2 UI Side Back lt I need this child UI Home tra
  • 如何 adb 提取 SD 卡中文件夹中的所有文件

    我的 SD 卡中有一个文件夹 mnt sdcard Folder1 Folder2 Folder3 jpg 文件夹 1 和文件夹 2 的名称保持不变 文件夹 2 内有文件夹 3 4 5 等 我想使用 adb 将所有 jpeg 文件而不是所有
  • 具有多个数据源的 Spring Boot + JNDI

    我尝试创建一个 Spring Boot 应用程序 它连接两个数据源 我能够通过遵循 Spring 文档来实现这一目标 但我面临的挑战是实现以下目标 通过使用 Spring Boot DataSourceAutoConfiguration 通
  • Baqend 中的关系和 ACL

    我试图弄清楚 baqend 是否可以做到这一点 或者甚至是正确的方法 我有很多用户 使用 Baqend 附带的默认用户帐户系统 其中一些用户将是公司的管理员 一家公司将拥有 1 到 5 名管理员用户 有一个单独的数据类 其中包含公司的记录和
  • 数据库连接未使用 jpaFlowExecutionListener 关闭

    我正在使用 Spring Web Flow 来构建应用程序 我正在利用Flow Managed Persistence Context因此实体管理器在流程执行期间保持打开状态 我可以访问延迟加载的属性 类似于OpenEntityManage
  • 创建 QT 应用程序作为 Windows 上现有基于控制台的应用程序的 GUI

    我正在尝试使用 Qt 为现有应用程序设置一个 GUI 该应用程序旨在在 Windows 命令行中运行 这不仅仅是运行应用程序system 命令 但我需要通过命令行与现有应用程序交互 The system 当我启动现有的可执行文件时 命令会阻
  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • 是否有一个排序的java集合可以处理重复项?

    我需要一个行为类似于 C multimap 的集合 但我还需要能够通过一系列键获取元素 你可以看看谷歌收藏 http code google com p google collections 它有多种实现MultiMap
  • 泛型和实体框架:如何根据列值返回不同的类型

    我们有一个人员表 其中存储不同类型的人员 买方 卖方 代理人等 我们的 ORM 是实体框架 CodeFirst CTP5 我们使用存储库模式来实现良好的 TDD 和模拟 在 PersonRepository 中 我想返回特定类型 这样我就可
  • 如何为 64 位 Windows 编译现有的 posix 代码?

    我可以使用 Cygwin 或 MinGW 但我需要最终得到 64 位代码 而不是 32 位 这是因为我将从 64 位托管 C 调用 DLL 我似乎找不到关于设置这些工具来创建 64 位二进制文 件的良好参考 另外 如果 GCC 是版本 4
  • 将 jQuery 单击事件分配给正文中除少数 div 及其子元素之外的所有内容

    当我按下页面上的 div 时 会出现一个弹出窗口 当您再次单击该 div 时 弹出窗口就会消失 当您单击 div 外部时 弹出窗口就会消失 到目前为止一切看起来都很好 问题是 当我单击弹出窗口时 我希望弹出窗口及其子窗口可以单击 它们是无序
  • 在外语版本的 Excel 中从 vba 调用工作表函数

    以下代码片段在英语版本的 Excel 中运行正常 但是当尝试在葡萄牙语版本的 Excel 中的同一工作簿中运行此代码时 会出错 Add color bars on every other row attempt to make list e
  • 分面搜索的后过滤器和全局聚合之间有什么区别?

    搜索界面中的一个常见问题是您想要返回结果的选择 但可能想返回有关所有文档的信息 例如 我想查看所有红色衬衫 但想知道什么 其他颜色可供选择 这有时被称为 多面结果 或者 多面导航 这Elasticsearch 参考中的示例 https ww
  • “形式参数“foo”与多个参数匹配”-如何在 R 中处理这个问题?

    有时 调用带有某些参数的函数会导致错误消息formal argument foo matched by multiple actual arguments 是否可以打印不明确的实际参数列表 我问这个问题的原因是目前的问题plot类对象的函数
  • 使用导航控制器更改弹出窗口内容大小

    我想显示一个具有自定义内容大小的弹出窗口 我可以这样做 UINavigationController popoverContent UINavigationController alloc init UIView popoverView U
  • php 的问题:读取文件名,生成 javascript 和 html

    UPDATE 再一次问好 我发现自己遇到了一个新问题 php代码在我的PC wamp服务器 上完美运行 但我现在已将其上传到免费的网络主机服务器上 虽然php部分运行完美 它生成数组 但javascript函数本身不起作用 因为没有照片在网
  • 科尔多瓦闹钟

    我构建了一个带有计时器的 Cordova 闹钟应用程序 一切都运行良好 除了我现在想通过视觉和音频警报通知用户时钟到时 我使用了以下插件来进行本地通知 https github com katzer cordova plugin local
  • Alamofire 的响应序列化失败

    import UIKit import Alamofire import SwiftyJSON class LoginViewController UIViewController IBOutlet weak var urlTextFile
  • Visual Studio 2015 数据库项目目录包含扩展名为 jfm 的文件

    假设我们有一个数据库项目名为MyDatabase然后是一个名为MyDatabase jfm出现在项目的根目录中 当项目在 Visual Studio 中打开时 它会被独占锁定 它是一个二进制文件 它最近才开始出现 过去几天 我已经进行了谷歌
  • 合并 PDF,同时保留自定义页码(也称为页面标签)和书签

    我正在尝试自动合并多个 PDF 文件 并且有两个要求 a 现有书签和 b 需要保留页面标签 自定义页码 默认情况下 PyPDF2 和 pdftk 会在合并时保留书签 但 pdfrw 不会 PyPDF2 pdftk 或 pdfrw 中始终不保