Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

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

Alles rund um Büroanwendungen, Bildungsprogramme und Spiele unter Linux

Moderator: Moderatoren

Antworten
abgdf
Guru
Guru
Beiträge: 3170
Registriert: 13. Apr 2004, 21:15

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

Beitrag von abgdf » 27. Jul 2016, 17:53

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ß!

Werbung:
Antworten