Как распечатать оглавление содержимого PDF?

Я не знаю, можно ли обработать своп, но Я предлагаю не трогать его, потому что в основном это связано с перегрузкой памяти, это как резервная копия памяти для вашей машины.

Я предлагаю удалить хром и установить его снова, возможно, у вас есть плагины и надстройки, которые вам не нужны, в противном случае проанализируйте этот лишний материал в своем Chrome и удалите все, что вам не нужно.

2
10.01.2019, 21:31
2 ответа

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 ). Вы можете отформатировать это в любой формат, который вы хотите для печати.

Вот сценарий Perl для печати в формате LaTeX, который затем можно передать, например, 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 -в -latex.pl
  2. Сделайте его исполняемым, запустив chmod +x /path/to/pdftoc-to-latex.plв терминале
  3. Установить Latex ::Кодировать 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. Скомпилируйте полученный tex-файл в pdf с помощью вашего любимого компилятора LaTeX (, например,cd /path/to/where/you/want/tex; pdflatex file.tex)
8
27.01.2020, 21:52

Подход, аналогичный описанному выше, но быстрый и грязный 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
0
14.02.2020, 14:00

Теги

Похожие вопросы