Hay una herramienta de línea de comandos escrita en Java llamada Sejda donde puedes encontrar el splitbybookmarks
comando que hace exactamente lo que pediste. Es Java, por lo que se ejecuta en Linux y, al ser una herramienta de línea de comandos, puede escribir un script para hacerlo.
Descargo de responsabilidad
Soy uno de los autores
tienes programas que están construidos como pdf-split que pueden hacer eso por ti:
A-PDF Split es un programa de utilidad de escritorio muy simple y ultrarrápido que le permite dividir cualquier archivo pdf de Acrobat en archivos pdf más pequeños. Proporciona total flexibilidad y control del usuario en términos de cómo se dividen los archivos y cómo se nombran de manera única los archivos de salida divididos. A-PDF Split ofrece numerosas alternativas para dividir archivos grandes:por páginas, por marcadores y por páginas pares/impares. Incluso puede extraer o eliminar parte de un archivo PDF. A-PDF Split también ofrece divisiones definidas avanzadas que se pueden guardar y luego importar para usar con tareas repetitivas de división de archivos. A-PDF Split representa lo último en flexibilidad de división de archivos para satisfacer todas las necesidades.
A-PDF Split funciona con archivos pdf protegidos con contraseña y puede aplicar varias funciones de seguridad pdf a los archivos de salida divididos. Si es necesario, puede volver a combinar los archivos divididos generados con otros archivos pdf usando una utilidad como A-PDF Merger para formar nuevos archivos pdf compuestos.
A-PDF Split NO requiere Adobe Acrobat y produce documentos compatibles con Adobe Acrobat Reader versión 5 y superior.
editar*
También encontré un programa gratuito de código abierto aquí si no quieres pagar.
Aquí hay un pequeño programa Perl que uso para la tarea. Perl no es especial; es solo un contenedor alrededor de pdftk para interpretar su dump_data
salida para convertirlo en números de página para extraer:
#!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 se puede usar para dividir el archivo PDF y extraer los números de página de los marcadores.
Para obtener los números de página de los marcadores, haga
pdftk in.pdf dump_data
y haga que su secuencia de comandos lea los números de página de la salida.
Entonces usa
pdftk in.pdf cat A-B output out_A-B.pdf
para pasar las páginas de A a B a out_A-B.pdf.
El guión podría ser algo como esto:
#!/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