파일에 메타데이터로 목차가 있는 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로 컴파일합니다.
답변2
위의 방법과 비슷하지만 bash 스크립팅은 빠르고 지저분합니다. pdftk
패키지 에 따라 다릅니다 . pdf/
, tmp/
및 디렉토리를 가정합니다 toc/
.
#!/bin/bash
#usage: bash src/pdf-toc-txt.sh pdf/Del-2-200214.pdf "DEL 2"
fn="${1##*/}"
echo "processing: $fn"
rm -Rf tmp/*
#init toc file
echo "$2" > toc/$fn.txt
#pdf metadata
pdftk pdf/$fn dump_data_utf8 > tmp/$fn.txt
#build toc
cd tmp/
csplit -k $fn.txt '/^BookmarkBegin/' {*}
for i in xx*; do
s=$(grep 'BookmarkTitle' "$i");
l=$(grep 'BookmarkLevel' "$i");
p=$(grep 'BookmarkPageNumber' "$i");
sl=${#s};
let "dl = 100 - $sl";
#if output toc in html format
#echo "<h$l>$s" $(printf %"$dl"s | tr " " ".") $p"</h$l>";
#else use text format
echo "$s" $(printf %"$dl"s | tr " " ".") "$p";
done | sed 's/Bookmark\(.\)\{5,10\}: //g' >> ../toc/$fn.txt
#resume
cd ..
PDF에 북마크 메타데이터가 포함되어 있는 경우 텍스트 출력은 다음과 같습니다.
DEL 2
...............................................
6 Introduktion (I) [10 sidor] ................ 4
6.1 Forskningsfrågor ......................... 5
6.1.1 Planering av forskningsfrågor ......... 7
6.1.2 Rapportering av forskningsfrågor ....... 7
6.2 Operationalisering ....................... 8
6.2.1 Rapportering av operationalisering ..... 11
6.3 Hypoteser ................................ 12
6.3.1 Rapportering av hypoteser .............. 13
7 Metod (M) [60 sidor] ....................... 15