Es gibt ein in Java geschriebenes Befehlszeilentool namens Sejda, in dem Sie den splitbybookmarks
finden Befehl, der genau das tut, was Sie gefragt haben. Es ist Java, also läuft es unter Linux und da es sich um ein Befehlszeilentool handelt, können Sie dafür ein Skript schreiben.
Haftungsausschluss
Ich bin einer der Autoren
Sie haben Programme, die wie pdf-split gebaut sind und das für Sie erledigen können:
A-PDF Split ist ein sehr einfaches, blitzschnelles Desktop-Dienstprogramm, mit dem Sie jede Acrobat-PDF-Datei in kleinere PDF-Dateien aufteilen können. Es bietet vollständige Flexibilität und Benutzerkontrolle in Bezug darauf, wie Dateien geteilt werden und wie die geteilten Ausgabedateien eindeutig benannt werden. A-PDF Split bietet zahlreiche Alternativen für die Aufteilung Ihrer großen Dateien – nach Seiten, Lesezeichen und ungeraden/gerade Seiten. Sie können sogar einen Teil einer PDF-Datei extrahieren oder entfernen. A-PDF Split bietet auch erweiterte definierte Splits, die gespeichert und später für die Verwendung mit sich wiederholenden Aufgaben zum Teilen von Dateien importiert werden können. A-PDF Split stellt die ultimative Flexibilität beim Aufteilen von Dateien dar, um allen Anforderungen gerecht zu werden.
A-PDF Split arbeitet mit passwortgeschützten PDF-Dateien und kann verschiedene PDF-Sicherheitsfunktionen auf die geteilten Ausgabedateien anwenden. Bei Bedarf können Sie die generierten geteilten Dateien mit anderen PDF-Dateien mithilfe eines Dienstprogramms wie A-PDF Merger neu kombinieren, um neue zusammengesetzte PDF-Dateien zu erstellen.
A-PDF Split erfordert KEIN Adobe Acrobat und erstellt Dokumente, die mit Adobe Acrobat Reader Version 5 und höher kompatibel sind.
bearbeiten*
Hier finden Sie auch ein kostenloses Open-Source-Programm, wenn Sie nicht bezahlen möchten.
Hier ist ein kleines Perl-Programm, das ich für diese Aufgabe verwende. Perl ist nichts Besonderes; es ist nur ein Wrapper um pdftk, um dessen dump_data
zu interpretieren Ausgabe, um sie in Seitenzahlen umzuwandeln, die extrahiert werden sollen:
#!perl
use v5.24;
use warnings;
use Data::Dumper;
use File::Path qw(make_path);
use File::Spec::Functions qw(catfile);
my $pdftk = '/usr/local/bin/pdftk';
my $file = $ARGV[0];
my $split_dir = $ENV{PDF_SPLIT_DIR} // 'pdf_splits';
die "Can't find $ARGV[0]\n" unless -e $file;
# Read the data that pdftk spits out.
open my $pdftk_fh, '-|', $pdftk, $file, 'dump_data';
my @chapters;
while( <$pdftk_fh> ) {
state $chapter = 0;
next unless /\ABookmark/;
if( /\ABookmarkBegin/ ) {
my( $title ) = <$pdftk_fh> =~ /\ABookmarkTitle:\s+(.+)/;
my( $level ) = <$pdftk_fh> =~ /\ABookmarkLevel:\s+(.+)/;
my( $page_number ) = <$pdftk_fh> =~ /\BookmarkPageNumber:\s+(.+)/;
# I only want to split on chapters, so I skip higher
# level numbers (higher means more nesting, 1 is lowest).
next unless $level == 1;
# If you have front matter (preface, etc) then this numbering
# will be off. Chapter 1 might be called Chapter 3.
push @chapters, {
title => $title,
start_page => $page_number,
chapter => $chapter++,
};
}
}
# The end page for one chapter is one before the start page for
# the next chapter. There might be some blank pages at the end
# of the split for PDFs where the next chapter needs to start on
# an odd page.
foreach my $i ( 0 .. $#chapters - 1 ) {
my $last_page = $chapters[$i+1]->{start_page} - 1;
$chapters[$i]->{last_page} = $last_page;
}
$chapters[$#chapters]->{last_page} = 'end';
make_path $split_dir;
foreach my $chapter ( @chapters ) {
my( $start, $end ) = $chapter->@{qw(start_page last_page)};
# slugify the title so use it as a filename
my $title = lc( $chapter->{title} =~ s/[^a-z]+/-/gri );
my $path = catfile( $split_dir, "$title.pdf" );
say "Outputting $path";
# Use pdftk to extract that part of the PDF
system $pdftk, $file, 'cat', "$start-$end", 'output', $path;
}
pdftk kann verwendet werden, um die PDF-Datei aufzuteilen und die Seitenzahlen der Lesezeichen zu extrahieren.
Um die Seitenzahlen der Lesezeichen zu erhalten, tun Sie
pdftk in.pdf dump_data
und lassen Sie Ihr Skript die Seitenzahlen aus der Ausgabe lesen.
Verwenden Sie dann
pdftk in.pdf cat A-B output out_A-B.pdf
um die Seiten von A nach B in out_A-B.pdf zu bekommen.
Das Skript könnte in etwa so aussehen:
#!/bin/bash
infile=$1 # input pdf
outputprefix=$2
[ -e "$infile" -a -n "$outputprefix" ] || exit 1 # Invalid args
pagenumbers=( $(pdftk "$infile" dump_data | \
grep '^BookmarkPageNumber: ' | cut -f2 -d' ' | uniq)
end )
for ((i=0; i < ${#pagenumbers[@]} - 1; ++i)); do
a=${pagenumbers[i]} # start page number
b=${pagenumbers[i+1]} # end page number
[ "$b" = "end" ] || b=$[b-1]
pdftk "$infile" cat $a-$b output "${outputprefix}"_$a-$b.pdf
done