PDFの目次を印刷する方法は?

PDFの目次を印刷する方法は?

ファイルにメタデータとして目次を含むPDFブックなどのファイルがありますが、ドキュメントのどのページにも表示されません。目次と一緒にファイルを印刷したい、または目次だけを印刷したいです。どうすればいいですか?

ベストアンサー1

pdftk「ブックマーク」をダンプすることが可能です。たとえば、pdftk file.pdf dump_data_utf8残りのメタデータの間に隠された多くのBookmark *エントリが取得されます。grepあなたは彼らに以下を与えることができます:

$ pdftk whatever.pdf dump_data_utf8 | grep ^Bookmark
BookmarkBegin
BookmarkTitle: Cover
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Agenda
BookmarkLevel: 1
BookmarkPageNumber: 2

「レベル」はインデントレベルです(したがって、レベル2はレベル1からインデントされます)。印刷したい形式でフォーマットできます。

これはLaTeX形式で印刷するためのPerlスクリプトです。たとえば、pdflatexPDFファイルを取得するために入力できます(以前はpdftkを使用して元のPDFに追加することもできます)。これは以下でも実行できます。https://gitlab.com/derobert/random-toys/blob/master/pdf/pdftoc-to-latex(改善したい場合は、ここにフルリクエストを送信することをお勧めします):

#!/usr/bin/perl
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: (.+)$/) {
        $bm->{title} = latex_encode($1);
    } elsif (/^BookmarkPageNumber: (\d+)$/a) {
        $bm->{page} = $1;
    } else {
        die "Unknown Bookmark tag in $_\n";
    }
}
add_latex_bm($bm) if $bm;

print <<LATEX;
\\documentclass{report}
\\begin{document}
${ \join('', @latex_bm) }
\\end{document}
LATEX

exit 0;

sub add_latex_bm {
    my $bm     = shift;
    my $level  = $levels[$bm->{level}];
    my $number = $bm->{number};
    my $title  = $bm->{title};
    my $page   = $bm->{page};

    push @latex_bm, <<LINE;
\\contentsline {$level}{\\numberline {$number}$title}{$page}%
LINE
}

スクリプトの使用方法は次のとおりです。

  1. ダウンロードhttps://gitlab.com/derobert/random-toys/raw/master/pdf/pdftoc-to-latex?inline=falseそして別名で保存pdftoc-to-latex.pl
  2. chmod +x /path/to/pdftoc-to-latex.pl端末で実行して実行可能にします。
  3. インストールするラテックス::エンコーディングパールパッケージ。 Debian Stretchではこれを実行できますsudo apt install liblatex-encode-perl。他のディストリビューションでは、別の作業を実行する必要があります。
  4. 次のようにスクリプトを実行します。/path/to/pdftoc-to-latex.pl /path/to/pdf/file.pdf > /path/to/where/you/want/tex/file.tex
  5. cd /path/to/where/you/want/tex; pdflatex file.tex好みのLaTeXコンパイラ(例:)を使用して、結果のtexファイルをpdfにコンパイルします。

おすすめ記事