使用 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)
当我使用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)