python - 具有相同名称的 PyPDF2 嵌套书签不起作用

标签 python pdf bookmarks pypdf pypdf2

当您尝试嵌套多个具有相同名称的书签时,PyPDF2 不会将其考虑在内。 下面是独立的 python 代码来测试我的意思(你需要在工作文件夹中有 3 个名为 a、b 和 c 的 pdf 文件来测试它)

from PyPDF2 import PdfFileReader, PdfFileMerger


def main():
    merger = PdfFileMerger()
    first_one = True
    for file in ["a.pdf", "b.pdf", "c.pdf"]:
        print("next row")
        reader = PdfFileReader(file)
        merger.append(reader)
        if first_one:
            child = merger.addBookmark(title="blabla", pagenum=1)
            first_one = False
        else:
            child = merger.addBookmark(title="blabla", pagenum=1, parent=child)

    merger.write("test.pdf")


if __name__ == "__main__":
    main()

我希望生成的 pdf 具有三层嵌套书签

blabla
    blabla
        blabla

但是我得到了

blabla
    blabla
    blabla

有什么办法可以确保这种情况不会发生吗?

编辑:我删除了 pagenum 变量,因为我希望这 3 个书签指向同一页。

最佳答案

这似乎是 PdfFileMerger.addBookmark() 方法的错误。有一些细节here

下面是使用 PdfFileWriter 及其 addBookmark() 方法的解决方法。使用这个我可以获得 3 个嵌套书签,名称相同,都在同一页面上:

blabla
    blabla
        blabla

使用 PdfFileWriter 变通方法的代码:

from PyPDF2 import PdfFileReader, PdfFileWriter


def main():
    writer = PdfFileWriter()
    pagenum = 0
    first_one = True
    for file in ["a.pdf", "b.pdf", "c.pdf"]:
        print("next row")
        reader = PdfFileReader(file)
        writer.appendPagesFromReader(reader)
        if first_one:
            child = writer.addBookmark(
                title="blabla", pagenum=pagenum, parent=None
            )
            first_one = False
        else:
            child = writer.addBookmark(
                title="blabla", pagenum=pagenum, parent=child
            )

    with open("test.pdf", "wb") as d:
        writer.write(d)


if __name__ == "__main__":
    main()

或者,我尝试修改 PyPDF2 库来解决这个问题,尽管我在 python 方面不是很有经验,所以可能引入了新的/其他问题!已向维护者提交拉取请求,但在此之前你可以克隆我的分支,并从那里安装 PyPDF2:

git clone https://github.com/khalida/PyPDF2.git
cd PyPDF2
python setup.py sdist
sudo -H pip uninstall -y PyPDF2
sudo -H pip install dist/PyPDF2-1.26.0.tar.gz

之后,您应该能够从 PdfFileMerger.addBookmark() 获得您想要的嵌套。我已经针对上述情况对其进行了测试,但除此之外没有进行任何测试。

关于python - 具有相同名称的 PyPDF2 嵌套书签不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941742/

相关文章:

VIM 标记和项目管理

python - 用不同列表中的项目递归替换列表中的项目

python - 如何只留下图像中最大的 Blob ?

ios - 如何从 UIWebView 中的 Base64 字符串加载 PDF

java - 输出流到字节[]

javascript - TamperMonkey 可以创建书签吗?

json - 解析 mozilla firefox json 文件的快速而肮脏的方法

python - 使用 pyglet 和 pymunk 使 Sprite 角色自然跳跃

python - 使用jsonify时可以设置cookie吗?

android - 根据 PDF 文档/ Canvas 大小使用 Android PDFDocument 设置文本大小