GNU/Linux >> Tutoriels Linux >  >> Linux

Diviser un PDF par signets ?

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

Linux
  1. Renommer les fichiers dans le répertoire ?

  2. Comment Redimensionner Les Pages D'un Pdf ?

  3. Comment diviser une chaîne dans un script bash

  4. Master PDF Editor - Un éditeur PDF multifonctionnel multiplateforme

  5. visualiseur pdf CLI pour Linux

Créez des signets pour votre PDF avec pdftk

PDF Split And Merge 'PDFSAM' fait exactement ce qu'il dit

Comment convertir une page Web en PDF sous Linux

Comment ouvrir un PDF dans un terminal Linux

Réduire la taille du fichier PDF sous Linux

Commande split Linux avec exemples