pdfff.sh
von Huo- SNIPPET_DESC:
- Einfügen dünner Leerseiten in ein PDF mit expliziter Paginierung
- SNIPPET_CREATION_TIME:
- 06.04.2025 09:34:28
- SNIPPET_PRUNE_TIME:
- Unendlich
- SNIPPET_TEXT:
-
- #!/bin/bash
- # Dieses Skript fügt dünne Leerseiten in PDF-Dateien mit lückenhafter (expliziter) Paginierung ein,
- # um eine durchgehende lückenlose Paginierung zu erreichen
- # Vorausgesetzt: ghostscript, pdftk
- # Ausführen: pdfff.sh datei.pdf
- # Ausgegeben wird ein "aufgefülltes" PDF mit Namen datei_new.pdf
- PDF=$1
- # Ermittlung der Seitenbreite des Ursprung-PDFs:
- breite=$(pdftk $PDF dump_data | awk '/PageMediaDimensions/ { print $3 }' | head -1)
- # Erzeugen eines dünnen PDFs gleicher Breite
- echo "" | ps2pdf -dDEVICEWIDTHPOINTS=$breite -dDEVICEHEIGHTPOINTS=20 - /tmp/duenn.pdf
- #convert xc:none -page "$breite"x20 /tmp/duenn.pdf
- # Werte PageLabelStart und PageLabelNewIndex geben die "Sprünge" in der Paginierung an
- # und werden getrennt mit Hilfe von pdftk dump_data in zwei Arrays extrahiert.
- arraypls=(0) # Arrays wird Dummywert 0 vorangestellt, notwendig für Berechnungsschleife
- arraypln=(0)
- arraypls+=($(pdftk $PDF dump_data | grep 'PageLabelStart' | awk '{ print $2 }'))
- arraypln+=($(pdftk $PDF dump_data | grep 'PageLabelNewIndex' | awk '{ print $2 }'))
- # Rumpf des zu generierenden pdftk-Befehls zum Einfügen der Leerseiten
- cmd="pdftk A=$PDF B=/tmp/duenn.pdf cat"
- # Länge der beiden (gleichlangen) Arrays
- len=${#arraypln[@]}
- # Zusammensetzen des pdftk-Befehls
- for i in $(seq 1 $(( $len-1)) ); do
- if [[ "${arraypls[$i]}" -eq "1" ]]; then #Fall: Explizite Seitenzählung des PDFs beginnt mit "1"
- cmd="${cmd} A1-$(( ${arraypln[$i+1]}-1 ))"
- else
- cmd="${cmd} \$(printf 'B %.0s' {1..$(( ${arraypls[$i]}-${arraypls[$i-1]}+${arraypln[$i-1]}-${arraypln[$i]} ))})"
- if [[ "$i" -eq "$(( $len-1))" ]]; then
- cmd="${cmd} A${arraypln[i]}-end"
- else
- cmd="${cmd} A${arraypln[i]}-$(( ${arraypln[$i+1]} - 1 ))"
- fi
- fi
- done
- cmd="${cmd} output ${PDF%.*}_new.pdf"
- # Ausführung des fertigen pdftk-Befehls
- eval $cmd
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN