GNU/Linux >> Tutoriales Linux >  >> Linux

¿Dividir un PDF por marcadores?

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

Linux
  1. ¿Cómo hacer Grep en archivos PDF?

  2. ¿Dividir el monitor en dos?

  3. Master PDF Editor:un editor de PDF multifuncional multiplataforma

  4. CLI visor de pdf para linux

  5. Convertidor de versión PDF de Linux

Crea marcadores para tu PDF con pdftk

PDF Split and Merge 'PDFSAM' hace exactamente lo que dice

Cómo convertir una página web a PDF en Linux

Cómo abrir un PDF en la terminal de Linux

Reducir el tamaño del archivo PDF en Linux

Comando dividido de Linux con ejemplos