• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Umgruppieren von Seiten in einer pdf-Datei (mein Perl-Skript dazu)

abgdf

Guru
Hallo,

oft möchte man Seiten in einer pdf-Datei umgruppieren.
pdftk kann zunächst eine pdf-Datei in ihre einzelnen Seiten aufspalten:
Code:
pdftk file.pdf burst
Jetzt hat man für jede Seite eine eigene pdf-Datei im Verzeichnis. Diese Dateien heißen "pg_0001.pdf", "pg_0002.pdf", .... "pg_0150.pdf", usw..
Wenn man umgruppieren will, möchte man z.B., daß diese Dateien erst mit "pg_0005.pdf" anfangen (und dann mit "pg_0006.pdf", .... "pg_0154.pdf" fortgesetzt werden).
Mag sein, daß pdftk das irgendwie selbst kann (pdfchain kann das wohl), aber da ich das nicht gefunden hab', hab' ich halt ein Perl-Skript dazu geschrieben.
Man gibt ihm einfach eine einzelne Zahl mit (die auch negativ sein kann), daraufhin kopiert es die Dateien in ein Verzeichnis "results" im aktuellen Verzeichnis und benenne die Dateien dort entsprechend um. Hier ist es:
Code:
#!/usr/bin/perl

use warnings;
use strict;

# addtopdf.pl, abgdf@gmx.net, (C) 2016, GNU GPL V2.

use File::Copy;

my $resdir = "results";

if ($#ARGV < 0 || $#ARGV >= 1) {
    print "\nThis script needs exactly one argument. Aborting.\n\n";
    exit();
}
my $neg = 0;
my $num = $ARGV[0];
if ($num =~ /^\-/) {
    $neg = 1;
    $num = substr($num, 1);
}
if($num =~ /\D/ || $num eq "") {
    print "\nThe argument must be a number. Aborting.\n\n";
    exit();
}

my @a = <"pg*pdf">;
if($#a < 0) {
    print "\nThere aren't any suitable files, like for example 'pg_0001.pdf', in this directroy. Aborting.\n\n";
    exit();
}
my $i;
my %h;
my @b;
my $c;

foreach $i (@a) {
    @b = split("_", $i);
    $c = $b[1];
    @b = split(/\./, $c);
    $c = $b[0];
    if ($neg == 1) {
        if ($num >= $c) {
            print "\nError: Argument '-$num' is too low for file '$i'. Nothing done.\n\n";
            exit;
        }
        $c -= $num;
    } else {
        $c += $num;
    }
    $c = sprintf("%04d", $c);
    $h{$i} = "pg_$c.pdf";
}

if (-e $resdir) {
    print "\nPrevious version of '$resdir' exists. Nothing done.\n\n";
    exit;
} else {
    mkdir($resdir);
}

print "\nRenaming and copying to directory '$resdir':\n";
for $i (sort(keys(%h))) {
    print "$i -> ./$resdir/$h{$i}\n";
    copy($i, "./$resdir/$h{$i}");
}
print "\nFinished.\n\n";
Am Ende fügt man die vielen "pg_0...pdf"-Dateien mit folgendem Befehl zu einer Datei "combined.pdf" wieder zusammen:
Code:
pdftk pg*.pdf cat output combined.pdf
Viel Spaß!
 
Oben