ファイルにメタデータとして目次を含む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スクリプトです。たとえば、pdflatex
PDFファイルを取得するために入力できます(以前は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
}
スクリプトの使用方法は次のとおりです。
- ダウンロードhttps://gitlab.com/derobert/random-toys/raw/master/pdf/pdftoc-to-latex?inline=falseそして別名で保存pdftoc-to-latex.pl
chmod +x /path/to/pdftoc-to-latex.pl
端末で実行して実行可能にします。- インストールするラテックス::エンコーディングパールパッケージ。 Debian Stretchではこれを実行できます
sudo apt install liblatex-encode-perl
。他のディストリビューションでは、別の作業を実行する必要があります。 - 次のようにスクリプトを実行します。
/path/to/pdftoc-to-latex.pl /path/to/pdf/file.pdf > /path/to/where/you/want/tex/file.tex
cd /path/to/where/you/want/tex; pdflatex file.tex
好みのLaTeXコンパイラ(例:)を使用して、結果のtexファイルをpdfにコンパイルします。