10

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

from PyPDF2 import PdfFileReader, PdfFileMerger

def main():

merger = PdfFileMerger()
pagenum = 0
firstOne = True
for file in ["a.pdf","b.pdf","c.pdf"]:
    print("next row")
    pdf = PdfFileReader(open(file,"rb"))
    merger.append(pdf)
    if firstOne:
        child = merger.addBookmark(title="blabla",pagenum=1)
        firstOne = 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 个书签指向同一页面。

4

1 回答 1

5

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

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

blabla
    blabla
        blabla

使用PdfFileWriter变通方法的代码:

from PyPDF2 import PdfFileReader, PdfFileWriter

def main():

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

    d = open("test.pdf", "wb")
    writer.write(d)        

if __name__ == "__main__":
   main()

或者,我尝试修改PyPDF2库来解决这个问题,虽然我在 python 方面不是很有经验,所以可能引入了新的/其他问题!已经向维护者提交了一个拉取请求,但在那之前你可以克隆我的 fork,然后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()。我已经针对上述情况对其进行了测试,但除此之外没有进行任何测试。

于 2017-03-24T03:52:20.540 回答