#!/usr/bin/perl # Script taken from https://gitlab.com/derobert/random-toys/blob/master/pdf/pdftoc-to-latex # Manually adapt for sphinxdoc generated pdf use 5.024; use strict; use warnings qw(all); use IPC::Run3; use LaTeX::Encode; use Encode qw(decode); my @levels = qw(chapter section subsection subsubsection paragraph subparagraph); my @counters; my ($data_enc, $data); run3 ['pdftk', $ARGV[0], 'dump_data_utf8'], undef, \$data_enc; $data = decode('UTF-8', $data_enc, Encode::FB_CROAK); my @latex_bm; my $bm; foreach (split(/\n/, $data)) { /^Bookmark/ or next; if (/^BookmarkBegin$/) { add_latex_bm($bm) if $bm; $bm = {}; } elsif (/^BookmarkLevel: (\d+)$/a) { ++$counters[$1 - 1]; $#counters = $1 - 1; $bm->{number} = join(q{.}, @counters); $bm->{level} = $1 - 1; } elsif (/^BookmarkTitle: (.+)$/) { # In Sphinx title include a utf-8 icon of a link, so remove it my $title = substr($1, 0, -1); $bm->{title} = latex_encode($title); } elsif (/^BookmarkPageNumber: (\d+)$/a) { $bm->{page} = $1; } else { die "Unknown Bookmark tag in $_\n"; } } add_latex_bm($bm) if $bm; print < 1 if ($bm->{level} > 1) { return; } my $level = $levels[$bm->{level}]; my $number = $bm->{number}; my $title = $bm->{title}; my $page = $bm->{page} + 2; push @latex_bm, <