GNU/Linux >> Linux Esercitazione >  >> Linux

Dividere un PDF in base ai segnalibri?

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

Linux
  1. Come Grep nei file Pdf?

  2. Come ridimensionare le pagine di un PDF?

  3. Lettore PDF che supporta i segnalibri?

  4. Converti Pdf in Immagini in Pdf?

  5. Come dividere una stringa nello script Bash

Crea segnalibri per il tuo PDF con pdftk

PDF Dividi e unisci "PDFSAM" fa esattamente quello che dice

Come convertire una pagina Web in PDF in Linux

Come aprire un PDF in un terminale Linux

Riduci le dimensioni del file PDF in Linux

Comando diviso Linux con esempi