NoPaste

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:
  1. #!/bin/bash
  2.  
  3. # Dieses Skript fügt dünne Leerseiten in PDF-Dateien mit lückenhafter (expliziter) Paginierung ein,
  4. # um eine durchgehende lückenlose Paginierung zu erreichen
  5. # Vorausgesetzt: ghostscript, pdftk
  6. # Ausführen: pdfff.sh datei.pdf
  7. # Ausgegeben wird ein "aufgefülltes" PDF mit Namen datei_new.pdf
  8.  
  9. PDF=$1
  10.  
  11. # Ermittlung der Seitenbreite des Ursprung-PDFs:
  12. breite=$(pdftk $PDF dump_data | awk '/PageMediaDimensions/ { print $3 }' | head -1)
  13.  
  14. # Erzeugen eines dünnen PDFs gleicher Breite
  15. echo "" | ps2pdf -dDEVICEWIDTHPOINTS=$breite -dDEVICEHEIGHTPOINTS=20 - /tmp/duenn.pdf
  16. #convert xc:none -page "$breite"x20 /tmp/duenn.pdf
  17.  
  18. # Werte PageLabelStart und PageLabelNewIndex geben die "Sprünge" in der Paginierung an
  19. # und werden getrennt mit Hilfe von pdftk dump_data in zwei Arrays extrahiert.
  20. arraypls=(0)   # Arrays wird Dummywert 0 vorangestellt, notwendig für Berechnungsschleife
  21. arraypln=(0)
  22. arraypls+=($(pdftk $PDF dump_data | grep 'PageLabelStart' | awk '{ print $2 }'))
  23. arraypln+=($(pdftk $PDF dump_data | grep 'PageLabelNewIndex' | awk '{ print $2 }'))
  24.  
  25. # Rumpf des zu generierenden pdftk-Befehls zum Einfügen der Leerseiten
  26. cmd="pdftk A=$PDF B=/tmp/duenn.pdf cat"
  27.  
  28. # Länge der beiden (gleichlangen) Arrays
  29. len=${#arraypln[@]}
  30.  
  31. # Zusammensetzen des pdftk-Befehls
  32. for i in $(seq 1 $(( $len-1)) ); do
  33.     if [[ "${arraypls[$i]}" -eq "1" ]]; then  #Fall: Explizite Seitenzählung des PDFs beginnt mit "1"
  34.        cmd="${cmd} A1-$(( ${arraypln[$i+1]}-1 ))"
  35.     else
  36.        cmd="${cmd} \$(printf 'B %.0s' {1..$(( ${arraypls[$i]}-${arraypls[$i-1]}+${arraypln[$i-1]}-${arraypln[$i]} ))})"
  37.        if [[ "$i" -eq "$(( $len-1))" ]]; then
  38.            cmd="${cmd} A${arraypln[i]}-end"
  39.        else
  40.            cmd="${cmd} A${arraypln[i]}-$(( ${arraypln[$i+1]} - 1 ))"
  41.        fi
  42.     fi
  43. done
  44.  
  45. cmd="${cmd} output ${PDF%.*}_new.pdf"
  46.  
  47. # Ausführung des fertigen pdftk-Befehls
  48. eval $cmd

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN