1

When I use PYPDF2 to merge two PDF documents, I set the Page Mode to /UseOutlines so that the PDF will display the bookmark pane when the document is opened.

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

However, whenever the PDF document is opened the bookmarks are always expanded. Is there a property that I can modify to force the bookmarks to be collapsed when the document is opened?

4

3 回答 3

4

很晚了,但经过一番挖掘并在@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=T​​rue”调用方法“addBookmark()”,所有书签都将关闭。

于 2020-06-23T19:26:00.133 回答
1

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

于 2016-03-09T20:29:30.610 回答
0

这可以在不更改 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)
于 2022-02-04T01:36:44.687 回答