vheliotech-guide-de-montage/pdftoc-to-latex
Youen 995daaeff9 Mise en forme PDF
Numérotation des titres (niveaux 1 et 2)
L'avant propos n'est pas numéroté (et n'apparait pas dans la table des matières)
Le titre principal du document n'est pas un niveau de titre normal
Mise en forme de la première page
2023-05-11 02:09:29 +02:00

72 lines
1.6 KiB
Perl
Executable file

#!/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 <<LATEX;
\\documentclass{report}
\\title{Guide de montage Vhéliotech v1.0}
\\renewcommand{\\familydefault}{\\sfdefault}
\\setcounter{page}{2}
\\begin{document}
${ \join('', @latex_bm) }
\\end{document}
LATEX
exit 0;
sub add_latex_bm {
my $bm = shift;
# Don't extract subtitle with level > 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, <<LINE;
\\contentsline {$level}{\\numberline {$number}$title}{$page}%
LINE
}