Pdf

如何列印pdf的目錄?

  • February 14, 2020

我有一個 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
}

以下是如何使用此腳本:

  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. 安裝Latex::Encode perl 包。在 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. 使用您最喜歡的 LaTeX 編譯器(例如,cd /path/to/where/you/want/tex; pdflatex file.tex)將生成的 tex 文件編譯為 pdf

引用自:https://unix.stackexchange.com/questions/493799