Pdf
如何列印pdf的目錄?
我有一個 pdf kinda-book 文件,其中有一個目錄作為文件中的元數據,但它們沒有列在文件的任何頁面上。我想列印帶有目錄的文件,或者單獨列印目錄。我怎樣才能做到這一點?
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
通過在終端中執行使其可執行- 安裝Latex::Encode perl 包。在 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
- 使用您最喜歡的 LaTeX 編譯器(例如,
cd /path/to/where/you/want/tex; pdflatex file.tex
)將生成的 tex 文件編譯為 pdf