【问题标题】:Collapse Bookmarks using PYPDF2使用 PYPDF2 折叠书签
【发布时间】:2016-03-08 21:27:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: python pdf pypdf2


    【解决方案1】:

    很晚了,但经过一番挖掘并在@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()”,所有书签都将关闭。

    【讨论】:

    • 很棒的解决方案!但是用法,不应该是'collapse=T​​rue'吗? False 是默认值,打开。
    • @Mihail-CosminMunteanu 是的,谢谢 :-) 我编辑了它。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这在不改变 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)
      

      【讨论】:

        猜你喜欢
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 2012-12-30
        相关资源
        最近更新 更多