すべてreportlabで組版した場合の目次生成方法は公式サンプルがありますが、手元のpdfファイルをベースに(ページ番号決め打ちで)目次を生成するサンプルは見つけられなかった。TableOfContentsのソースを読んだ限りでは以下のようなやり方でできるらしい。table_of_contents.beforeBuild()とかいう明らかに内部向けっぽい関数を呼ぶのがポイントです。
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.lib.pagesizes import A4
doc = SimpleDocTemplate('toc.pdf', pagesize=A4)
fontname_g = 'HeiseiMin-W3'
pdfmetrics.registerFont(UnicodeCIDFont(fontname_g))
elements = []
style=ParagraphStyle(
name='Normal',
fontName=fontname_g,
fontSize=10,
)
elements.append(Paragraph("header", style))
elements.append(Spacer(10,10))
table_of_contents = TableOfContents()
table_of_contents.dotsMinLevel = 0
table_of_contents.levelStyles = [style]
#
table_of_contents.addEntry(0, 'chapter1', 1, key=None)
table_of_contents.addEntry(0, 'chapter2', 11, key=None)
table_of_contents.beforeBuild()
elements.append(table_of_contents)
doc.build(elements)
勿論、「手元のpdf」にページ番号を振らないと本末転倒なのでご注意を…。https://qiita.com/achiwa912/items/9d82484183e3b6c9da3c のようなやり方でできます。