在reportlab中如何把TableOfContents() 生成的目录添加到MyDocTemplate生成文档的书签
时间: 2023-02-08 09:16:54 浏览: 302
在 ReportLab 中,可以使用 `TableOfContents` 类来生成目录。要将目录添加到文档的书签,需要在 `MyDocTemplate` 类中重写 `beforeFlowable` 方法,并在其中调用 `pdf.bookmarkPage` 方法将目录页添加到书签。
以下是一个简单的例子:
```python
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter, landscape
from reportlab.platypus import SimpleDocTemplate, TableOfContents, Paragraph
class MyDocTemplate(SimpleDocTemplate):
def __init__(self, filename, **kwargs):
super().__init__(filename, **kwargs)
self.addPageTemplates([
TableOfContents(self, depth=1)
])
def beforeFlowable(self, flowable):
"""Add the current page to the table of contents"""
if flowable.__class__.__name__ == 'Paragraph':
if flowable._text.startswith('Chapter'):
self.canv.bookmarkPage(flowable._text)
doc = MyDocTemplate("mydocument.pdf", pagesize=letter)
doc.build([Paragraph("Chapter 1", style=styles['Heading1']), Paragraph("Some text."),
Paragraph("Chapter 2", style=styles['Heading1']), Paragraph("More text."),
])
```
上面的例子中,MyDocTemplate类的初始化函数传入了一个TableOfContents并且设置了目录的深度。
beforeFlowable方法在每一个flowable被添加到页面之前被调用,这里判断如果这个 flowable 是 Paragraph并且文本的头部是Chapter ,那么就把当前页面加入到书签中。
重要的是,在使用 `MyDocTemplate` 类生成文档之前,需要定义样式,其中一个是 heading1 级别的样式,并在段落中使用。
阅读全文