2017-03-22 32 views
8

当您试图嵌套多个具有相同名称的书签时,PyPdf2并未将其考虑在内。 下面自足的Python代码来测试我的意思(你需要有3个命名为A,B和C的工作文件夹中的PDF文件来测试它)具有相同名称的PyPdf2嵌套书签不起作用

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

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

以下是使用PdfFileWriter及其方法的解决方法。使用这个我可以得到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,所以可能引入了新的/其他的问题!提交一个拉请求维护者,但在那之前,你可以复制我的叉子,并从那里安装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()想要的嵌套。我已经针对上面的情况对它进行了测试,但除此之外没有做过任何测试。

+0

是的我打算让他们都在同一页面上。因此不会递增'pageNum'。您正在确认我得到的东西:似乎没有办法在PyPdf2中拥有无限数量的同名书签。但是,这是'pdf'格式还是库的一个特点? – Chapo

+0

啊,我的不好。我想不出为什么有人想要3个嵌套书签都指向同一个页面。据我所知,这是'PdfFileMerger.addBookmark()'方法中的一个错误。更多[这里](https://github.com/mstamy2/PyPDF2/issues/40)。我会用解决方法更新我的答案。 – kabdulla

+0

从你的链接'我宁愿在这个特定的应用程序中使用PdfFileMerger的原因是,PdfFileWriter似乎要求所有的源文件保持打开状态,直到输出文件被写入,这导致禁止性的内存使用。这种情况同样适用于我,但您的解决方案适用于我的问题,所以我会尽快进行验证。谢谢你的帮助。 – Chapo

相关问题