C'è uno strumento a riga di comando scritto in Java chiamato Sejda dove puoi trovare splitbybookmarks
comando che fa esattamente quello che hai chiesto. È Java, quindi funziona su Linux ed essendo uno strumento a riga di comando puoi scrivere uno script per farlo.
Disclaimer
Sono uno degli autori
hai programmi costruiti come pdf-split che possono farlo per te:
A-PDF Split è un programma di utilità desktop molto semplice e veloce che ti consente di dividere qualsiasi file pdf Acrobat in file pdf più piccoli. Fornisce completa flessibilità e controllo utente in termini di come i file vengono divisi e come i file di output divisi vengono denominati in modo univoco. A-PDF Split fornisce numerose alternative per dividere i tuoi file di grandi dimensioni - per pagine, per segnalibri e per pagina pari/dispari. Anche tu puoi estrarre o rimuovere parte di un file PDF. A-PDF Split offre anche divisioni definite avanzate che possono essere salvate e successivamente importate per l'uso con attività ripetitive di divisione dei file. A-PDF Split rappresenta il massimo in termini di flessibilità di suddivisione dei file per soddisfare ogni esigenza.
A-PDF Split funziona con file pdf protetti da password e può applicare varie funzioni di sicurezza pdf ai file di output divisi. Se necessario, puoi ricombinare i file divisi generati con altri file pdf utilizzando un'utilità come A-PDF Merger per formare nuovi file pdf compositi.
A-PDF Split NON richiede Adobe Acrobat e produce documenti compatibili con Adobe Acrobat Reader versione 5 e successive.
modifica*
anche trovato un programma open source gratuito Qui se non vuoi pagare.
Ecco un piccolo programma Perl che uso per questo compito. Perl non è speciale; è solo un wrapper attorno a pdftk per interpretare il suo dump_data
output per trasformarlo in numeri di pagina da estrarre:
#!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 può essere utilizzato per dividere il file PDF ed estrarre i numeri di pagina dei segnalibri.
Per ottenere i numeri di pagina dei segnalibri fai
pdftk in.pdf dump_data
e fai in modo che il tuo script legga i numeri di pagina dall'output.
Quindi usa
pdftk in.pdf cat A-B output out_A-B.pdf
per ottenere le pagine da A a B in out_A-B.pdf.
Lo script potrebbe essere qualcosa del genere:
#!/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