Il existe un outil de ligne de commande écrit en Java appelé Sejda où vous pouvez trouver le splitbybookmarks
commande qui fait exactement ce que vous avez demandé. C'est Java donc il fonctionne sous Linux et étant un outil de ligne de commande, vous pouvez écrire un script pour le faire.
Clause de non-responsabilité
Je suis l'un des auteurs
vous avez des programmes construits comme pdf-split qui peuvent le faire pour vous :
A-PDF Split est un programme utilitaire de bureau très simple et ultra-rapide qui vous permet de diviser n'importe quel fichier pdf Acrobat en fichiers pdf plus petits. Il offre une flexibilité totale et un contrôle utilisateur en termes de fractionnement des fichiers et de nommage unique des fichiers de sortie fractionnés. A-PDF Split offre de nombreuses alternatives pour diviser vos fichiers volumineux - par pages, par signets et par page paire/impaire. Même vous pouvez extraire ou supprimer une partie d'un fichier PDF. A-PDF Split propose également des fractionnements définis avancés qui peuvent être enregistrés et importés ultérieurement pour être utilisés avec des tâches répétitives de fractionnement de fichiers. A-PDF Split représente le nec plus ultra en matière de flexibilité de fractionnement de fichiers pour répondre à tous les besoins.
A-PDF Split fonctionne avec des fichiers pdf protégés par mot de passe et peut appliquer diverses fonctions de sécurité pdf aux fichiers de sortie fractionnés. Si nécessaire, vous pouvez recombiner les fichiers fractionnés générés avec d'autres fichiers pdf à l'aide d'un utilitaire tel que A-PDF Merger pour former de nouveaux fichiers pdf composites.
A-PDF Split ne nécessite PAS Adobe Acrobat et produit des documents compatibles avec Adobe Acrobat Reader version 5 et supérieure.
modifier*
également trouvé un programme open source gratuit ici si vous ne voulez pas payer.
Voici un petit programme Perl que j'utilise pour la tâche. Perl n'est pas spécial; c'est juste un wrapper autour de pdftk pour interpréter son dump_data
output pour le transformer en numéros de page à extraire :
#!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 peut être utilisé pour diviser le fichier PDF et extraire les numéros de page des signets.
Pour obtenir les numéros de page des signets, faites
pdftk in.pdf dump_data
et faites en sorte que votre script lise les numéros de page de la sortie.
Utilisez ensuite
pdftk in.pdf cat A-B output out_A-B.pdf
pour obtenir les pages de A à B dans out_A-B.pdf.
Le script pourrait ressembler à ceci :
#!/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