@@ -29,6 +29,7 @@ var fontName = flag.String("font-name", "", "Font name ID; e.g 'Helvetica-1251'"
2929var themeArg = flag .String ("theme" , "light" , "[light | dark | /path/to/custom/theme.json]" )
3030var hrAsNewPage = flag .Bool ("new-page-on-hr" , false , "Interpret HR as a new page; useful for presentations" )
3131var printFooter = flag .Bool ("with-footer" , false , "Print doc footer (<author> <title> <page number>)" )
32+ var generateTOC = flag .Bool ("generate-toc" , false , "Auto Generate TOC" )
3233var pageSize = flag .String ("page-size" , "A4" , "[A3 | A4 | A5]" )
3334var orientation = flag .String ("orientation" , "portrait" , "[portrait | landscape]" )
3435var logFile = flag .String ("log-file" , "" , "Path to log file" )
@@ -174,6 +175,42 @@ func main() {
174175 }
175176
176177 pf := mdtopdf .NewPdfRenderer (params )
178+
179+ if * generateTOC == true {
180+ // we need to generate the TOC for `content`
181+ headers , err := mdtopdf .GetTOCEntries (content )
182+ if err != nil {
183+ log .Fatal (err )
184+ }
185+ headerLinks := make (map [string ]* int )
186+ for _ , header := range headers {
187+ linkID := pf .Pdf .AddLink ()
188+ headerLinks [header .Title ] = & linkID
189+
190+ // debug
191+ // log.Printf("Header: '%s' (Level %d) -> Link ID: %d\n",
192+ // header.Title, header.Level, linkID)
193+ }
194+
195+ pf .SetTOCLinks (headerLinks )
196+ pf .Pdf .SetFont ("Arial" , "B" , 24 )
197+
198+ // Add a table of contents with clickable links
199+ pf .Pdf .Cell (40 , 10 , "Table of Contents" )
200+ pf .Pdf .Ln (30 )
201+
202+ for _ , header := range headers {
203+ if linkPtr , exists := headerLinks [header .Title ]; exists {
204+ link := * linkPtr
205+ pf .Pdf .SetFont ("Arial" , "" , 12 )
206+ tr := pf .Pdf .UnicodeTranslatorFromDescriptor ("" )
207+ pf .Pdf .WriteLinkID (8 , fmt .Sprintf ("%s %s" , tr ("•" ), header .Title ), link )
208+ pf .Pdf .Ln (15 )
209+ }
210+ }
211+ pf .Pdf .AddPage ()
212+ }
213+
177214 if inputBaseURL != "" {
178215 pf .InputBaseURL = inputBaseURL
179216 }
0 commit comments