使用 PYPDF2 折叠书签

Collapse Bookmarks using PYPDF2

当我使用PYPDF2 合并两个PDF 文档时,我将Page Mode 设置为/UseOutlines,以便PDF 在打开文档时显示书签窗格。

merger = PdfFileMerger()
merger.append(PdfFileReader(filename,'rb'),import_bookmarks=True)
merger.setPageMode('/UseOutlines')
merger.setPageLayout('/SinglePage')

但是,只要打开 PDF 文档,书签总是会展开。有没有我可以修改的 属性 以在打开文档时强制折叠书签?

PDF 中的打开大纲包含字典中的 /Count 键,指示大纲内的子项数量。要将大纲显示为 closed,应该删除此键或将其设置为 -1。但不幸的是,还没有办法在 PyPDF2 中指定它。

很晚了,但经过一些挖掘和@Eugene 的提示,我找到了解决方案。

您必须对源代码做一些小的调整: (测试版本 1.26.0)

PyPDF2/pdf.py:

将方法 addBookmark(~ 690 行)的定义更改为:

def addBookmark(self, title, pagenum, parent=None, color=None, bold=False, italic=False, fit='/Fit', collapse=False, *args):

(添加参数collapse=False)

然后在相同方法的末尾将行(~第 750 行)更改为:

parent.addChild(bookmarkRef, self, collapse)

(添加折叠)

PyPDF2/generic.py

现在我们必须调整 addChild 方法(~ 665 行):

def addChild(self, child, pdf, collapse=False):

(再次添加参数collapse=False

然后用同样的方法交换行(~第677行):

self[NameObject('/Count')] = NumberObject(self[NameObject('/Count')] + 1)

if collapse: self[NameObject('/Count')] = NumberObject(self[NameObject('/Count')] - 1)
else: self[NameObject('/Count')] = NumberObject(self[NameObject('/Count')] + 1)

就是这样!

用法

如果您现在使用参数 'collapse=True' 调用方法 'addBookmark()',所有书签都会关闭。

无需更改 PyPDF2 源代码即可实现:

from PyPDF2 import generic

def compressPicklist(mypdf, baseref=None):
    ## sets /Count to zero to compress bookmark picklist
    parent = baseref;
    if baseref == None: parent = mypdf.getOutlineRoot()
    parent = parent.getObject()
    parent[generic.NameObject('/Count')] = generic.NumberObject(0)

# call compressPickList after every call to addBookMark  
pdf_writer.addBookmark(item.title,n2,baseref)
compressPicklist(pdf_writer,baseref)