在 Python 中获取、更新和展开 PDF 书签

获取书签

文档 对象的 OutlineCollection collection 包含 PDF 文件的所有书签。本篇文章解释了如何从 PDF 文件获取书签,以及如何获取特定书签所在的页面。

要获取书签,遍历 OutlineCollection 集合,并在 OutlineItemCollection 中获取每个书签。 OutlineItemCollection 提供访问所有书签属性的功能。以下代码片段展示了如何从 PDF 文件中获取书签。

from os import path
import sys
import aspose.pdf as ap

def get_bookmarks(input_pdf):
    document = ap.Document(input_pdf)
    for i in range(len(document.outlines)):
        outline_item = document.outlines[i + 1]
        print(outline_item.title)
        print(outline_item.italic)
        print(outline_item.bold)
        print(outline_item.color)

获取书签的页面编号

添加书签后,您可以通过获取与 Bookmark 对象关联的目标 PageNumber 来确定它所在的页码。

from os import path
import sys
import aspose.pdf as ap

def get_bookmark_page_number(input_pdf):
    # Create PdfBookmarkEditor
    bookmark_editor = ap.facades.PdfBookmarkEditor()
    # Open PDF file
    bookmark_editor.bind_pdf(input_pdf)
    # Extract bookmarks
    bookmarks = bookmark_editor.extract_bookmarks()
    for bookmark in bookmarks:
        str_level_separator = ""
        for i in range(bookmark.level):
            str_level_separator += "----"

        print(str_level_separator, "Title:", bookmark.title)
        print(str_level_separator, "Page Number:", bookmark.page_number)
        print(str_level_separator, "Page Action:", bookmark.action)

从 PDF 文档获取子书签

书签可以以层次结构组织,拥有父级和子级。要获取所有书签,遍历 Document 对象的 Outlines 集合。然而,要同时获取子书签,还需遍历每个在第一次循环中获得的对象的所有书签。 OutlineItemCollection 在第一次循环中获取的对象。以下代码片段展示了如何从 PDF 文档中获取子书签。

from os import path
import sys
import aspose.pdf as ap

def get_child_bookmarks(input_pdf):
    document = ap.Document(input_pdf)
    for i in range(len(document.outlines)):
        outline_item = document.outlines[i + 1]
        print(outline_item.title)
        print(outline_item.italic)
        print(outline_item.bold)
        print(outline_item.color)
        count = len(outline_item)
        if count > 0:
            print("Child Bookmarks")
            # There are child bookmarks then loop through that as well
            for j in range(len(outline_item)):
                child_outline_item = outline_item[j + 1]
                print(child_outline_item.title)
                print(child_outline_item.italic)
                print(child_outline_item.bold)
                print(child_outline_item.color)

在 PDF 文档中更新书签

要更新 PDF 文件中的书签,首先通过指定书签的索引,从 Document 对象的 OutlineColletion 集合中获取特定书签。检索到书签后,将其 OutlineItemCollection 对象后,您可以更新其属性,然后使用 Save 方法保存更新后的 PDF 文件。以下代码片段展示了如何在 PDF 文档中更新书签。

from os import path
import sys
import aspose.pdf as ap

def update_bookmarks(input_pdf, output_pdf):
    # Open document
    document = ap.Document(input_pdf)

    # Get a bookmark object
    outline = document.outlines[1]

    # Get child bookmark object
    child_outline = outline[1]
    child_outline.title = "Updated Outline"
    child_outline.italic = True
    child_outline.bold = True

    # Save output
    document.save(output_pdf)

在查看文档时展开书签

书签存放在 Document 对象的 OutlineItemCollection 集合本身在 OutlineCollection 集合。不过,我们可能需要在查看 PDF 文件时将所有书签展开。

为了实现此需求,我们可以将每个大纲/书签项的打开状态设置为 Open。下面的代码片段展示了如何在 PDF 文档中将每个书签的打开状态设置为展开。

from os import path
import sys
import aspose.pdf as ap

def expanded_bookmarks(input_pdf, output_pdf):
    document = ap.Document(input_pdf)
    document.page_mode = ap.PageMode.USE_OUTLINES
    for i in range(len(document.outlines)):
        item = document.outlines[i + 1]
        item.open = True
    document.save(output_pdf)

相关书签主题