Seite 1 von 1

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

Verfasst: 27. Jul 2016, 17:53
von abgdf
Hallo,

oft möchte man Seiten in einer pdf-Datei umgruppieren.
pdftk kann zunächst eine pdf-Datei in ihre einzelnen Seiten aufspalten:

Code: Alles auswählen

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: Alles auswählen

#!/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: Alles auswählen

pdftk pg*.pdf cat output combined.pdf
Viel Spaß!