Donnerstag, 5. Dezember 2019

PrPages - Individuelle Erweiterungen... Alles ist möglich!

PrPages dient zur Ermittlung der farbigen und monochromen (b/w oder grau) Seiten eines PDF-Dokuments.
Dieses kann z.B. zur präziseren Kostenermittlung bei Kopier-Aufträgen dienen oder bei der Druckkosten-Ermittlung von Unternehmensteilen bzw. Abteilungen.

Wenn man nur die Entscheidung hat, ob es ein monochromer Ausdruck oder ein farbiger Ausdruck werden soll, kann eine einzige Farbseite in einem 30-seitigen PDF-Dokument aus einer - eigentlich - Schwarz/Weiß-Kopie eine sehr viel teurere Farbkopie machen. Das tut natürlich weh, wenn man rechnen muss ;-)
Nun wieder zu PRPages... Welche Seite hat farbige Elemente, welche ist komplett schwarz/weiß wissen wir. Das hilft bei der Kostenreduzierung im Druckbereich aber nur eventuell. Ideal wäre es doch, wenn man die u.U. wenigen Farbseiten extrahieren könnte und die paar extra Farbseiten getrennt drucken bzw. kopieren könnte.

Ein Interessent ist mit dieser Frage bzw. Problematik an mich herangetreten... ob ich dafür eine individuelle Lösung entwickeln könnte.

Nach einiger Überlegung ist mir das kostenlose Tool PDFtk wieder in den Sinn gekommen. Das Kommandozeilen-Tool PDFtk bietet u.a. Funktionen zum Verbinden einzelner PDF-Seiten zu einem neuen Dokument, zum Zerlegen von PDF-Dokumenten in einzelne Seiten, zum Verbinden einzelner Seiten nach Vorgabe zu einem neuen Dokument und vieles weitere.
PDFtk und der CMD-Befehlssatz von Microsoft zur Erstellung von BATchdateien (ja... die mit der Endung BAT) müssten eigentlich genügen, um die gewünschte individuelle Lösung kostenfrei realisieren zu können.

1. Schritt
PRPages erzeugt zu einem PDF-Dokument die entsprechende CSV-Datei mit einzelnen Angaben (Seite für Seite) zur Farbverwendung.

Eine BAT-Datei im gleichen Verzeichnis wie PrPages könnte dazu wie folgt aussehen:

@echo off
if "%~1"=="" goto eingabe1
set testvar1=%~1
IF EXIST zeilen.txt del zeilen.txt
IF EXIST zeilen.csv del zeilen.csv
prpages %testvar1% E 00 zeilen.csv
ren zeilen.csv zeilen.txt
goto ende
:eingabe1
echo Der 1. Parameter Eingabedatei (wie z.B.: "c:\temp\katalog.pdf") fehlt!
goto ende
:ende
 
Der variable Aufruf dieser BAT-Datei (wir nennen sie mal get_colors.bat) von der Kommandozeile aus könnte z.Bsp. wie folgt aussehen:

get_colors c:\temp\katalog.pdf



 
Im Ergebnis bekommen wir eine Datei zeilen.txt mit einem Inhalt ähnlich dem folgenden:

c:\temp\pdftk\tutorial.pdf;1;842;595;color; 
c:\temp\pdftk\tutorial.pdf;2;842;595;color; 
c:\temp\pdftk\tutorial.pdf;3;842;595;bw/gray; 
c:\temp\pdftk\tutorial.pdf;4;842;595;bw/gray; 
c:\temp\pdftk\tutorial.pdf;5;842;595;bw/gray; 

2. Die Farb- und Schwarz/Weiß-Seiten tatsächlich extrahieren und getrennt zu zwei neue PDF-Dateien zusammenfügen.

Hierzu bedienen wir uns PDFtk, dass u.a. Funktionalität zum Zusammenführen einzelner Dateien anbietet.
Das kann als Bsp. wie folgt aussehen:

pdftk c:\temp\katalog.pdf cat 2 5 8 9 12 output ausgabec.pdf









Wir müssen also aus der Datei zeilen.txt die Seitennummern für z.B. farbige Seiten herauslösen und daraus den String für den Seiten-Parameter von PDFtk aufbauen...

Die wichtige Zeile dazu in der BAT-Datei ist die folgende:
for /f "tokens=2 delims=;" %%i in ('findstr /C:";color;" %testvar2%') do echo %%i>>nur_color.txt
tokens=2 ... steht dafür für die zweite Spalte in der CSV-Datei zeilen.txt, in der die Seitenangabe steht.
delims=; ... steht für den verwendeten Spaltentrenner.
findstr ... ist ein interner CMD-Befehl zur String-Suche in Dateien.
;color; ... steht für den String, nach dem gesucht werden soll.
%testvar2% ... enthält den Parameter aus dem Aufruf der/dieser BAT-Datei (z.B. die csv-Datei zeilen.txt).
do echo %%i>>nur_color.txt ... die Ausgabe der Zeilennummern in Zeilen, die ";color;" enthalten erfolgt in nur_color.txt.

nur_color.txt enthält jetzt als Inhalt untereinander die Seitennummern.
Daraus müssen wir jetzt noch einen String bilden:


FOR /F %%i in (nur_color.txt) do call set "Myvar1=%%Myvar1%% %%i"
for ... steht für Schleifenverarbeitung.
%%i ... enthält als Variable den eingelesenen Zeileninhalt (die Seitennummern).
nur_color.txt ... ist unsere Datei mit den Seitennummern der farbigen Seiten.
Myvar1 ... steht namentlich für die Variable zum Aufbau des Seitennummernstrings.
%%Myvar1%% ... steht für den Inhalt der Variable Myvar1
Myvar1=%%Myvar1%% %%i ... steht also für Myvar1=bisheriger Inhalt von Myvar1 plus neuer Inhalt für Myvar1

Myvar1 enthält am Schluß der Schleifenverarbeitung einen String wie z.B. 2 5 8 9 12.
Die abschließende Zeile in der BAT-Datei kann dann wie folgt aussehen:
pdftk %testvar1% cat %Myvar1% output ausgabec.pdf
%testvar1% ... enthält die Angaben zum originalen PDF-Dokument.
cat ... ist eine Anweisung aus PDFtk zum Herauslösen von Seiten.
%Myvar1% ... enthält den String mit den Seitennummern aus Variable Myvar1.
output ... ist eine Anweisung aus PDFtk zum Wegschreiben der Seiten in eine neue Datei.
ausgabec.pdf ... enthält abschließend im Bsp. die Farbseiten 2, 5, 8, 9 und 12.

Abschließend dazu die ganze BAT-Datei mit einigen - hoffentlich selbsterklärenden - zusätzlichen Zeilen.
Um das Ganze komplett zu machen, ist darin auch die Aufbereitung der schwarz/weiß-Seiten enthalten:

@echo off
if "%~1"=="" goto eingabe1
set testvar1=%~1
if "%~2"=="" goto eingabe2
set testvar2=%~2
SET "Myvar1="
SET "Myvar2="
IF EXIST nur_color.txt del nur_color.txt
IF EXIST nur_bwgray.txt del nur_bwgray.txt
for /f "tokens=2 delims=;" %%i in ('findstr /C:";color;" %testvar2%') do echo %%i>>nur_color.txt
for /f "tokens=2 delims=;" %%i in ('findstr /C:";bw/gray;" %testvar2%') do echo %%i>>nur_bwgray.txt
FOR /F %%i in (nur_color.txt) do call set "Myvar1=%%Myvar1%% %%i"
for /f %%i in (nur_bwgray.txt) do call set "Myvar2=%%Myvar2%% %%i"
IF EXIST ausgabec.pdf del ausgabec.pdf
IF EXIST ausgabeb.pdf del ausgabeb.pdf
echo Colorseiten: %Myvar1%
pdftk %testvar1% cat %Myvar1% output ausgabec.pdf
echo BW-Gray: %Myvar2%
pdftk %testvar1% cat %Myvar2% output ausgabeb.pdf
goto ende
:eingabe1
echo Der 1. Parameter PDF-Eingabedatei (wie z.B.: "c:\temp\katalog.pdf") fehlt!
goto ende
:eingabe2
echo Der 2. Parameter CSV-Datei (mit Farbangaben) (wie z.B.: "c:\temp\zeilen.txt") fehlt!
:ende

Der variable Aufruf dieser BAT-Datei (wir nennen sie mal get_pages.bat) von der Kommandozeile aus könnte z.Bsp. wie folgt aussehen:

get_pages c:\temp\katalog.pdf c:\temp\zeilen.txt










Im Ergebnis bekommen wir aus der originalen Datei (die erhalten bleibt) zwei neue Dateien - eine mit farbigen PDF-Seiten, eine mit schwarz/weiß-Seiten, die dann zum Copyshop bzw. auf den Farb- oder Schwarz/Weiß-Laser gehen können.