Bash GhostScript soll die Breite der Seiten einer PDF-Datei anpassen, ohne ihre Orientierung zu ändern

Photon

Rear Admiral Pro
🎅Rätsel-Elite ’24
Registriert
Apr. 2006
Beiträge
5.332
Hallo Community,

ich habe vor einigen Jahre mal ein kleines Bash-Script gebastelt, das Folgendes tat: Ein Ordner, der Schülerlösungen in verschiedensten Formaten (PDF oder auch Grafik-Formate aller Art) enthält, wird eingelesen. Die Bilder werden mit feh geöffnet, damit ich sie händisch durchgehen und die Orientierung anpassen kann, für den Fall dass ein Bild mal auf der Seite oder auf dem Kopf steht. Dann werden die Bilder zu PDF-Dateien zusammengefügt. Als Zwischenergebnis gibt es dann PDF-Dateien, deren Seiten schon die gewünschte Orientierung haben.

Dann nutze ich Ghostscript, um alle Seiten auf eine gemeinsame Breite und Auflösung zu bringen, damit ich danach mit einem Annotationsprogramm (Xournal++) in sie reinschreiben kann. Die gemeinsame Breite und Auflösung ist wichtig, da sonst beim Beschriften die Stiftdicke bei hochauflösenden Dateien viel kleiner aussieht, als bei niedrigauflösenden.

Das hat vor einigen Jahren auch super funktioniert. Aber nun habe ich das alte Skript wieder nutzen wollen und habe folgendes Problem damit: GhostScript verändert nun nicht nur die Größe und Auflösung der PDF-Seiten sondern auch ihre Orientierung, sodass bei manchen Dateien nun alles auf der Seite liegt. Ich konnte das Problem auf die Option "-dPDFFitPage" eingrenzen. Ohne diese Option wird die Orientierung nicht angetastet, aber leider auch die Anpassungen von Breite und Auflösung nicht vorgenommen, sodass ich in Xournal++ super dünn schreibe.

So sieht das Skript insgesamt aus (relevant ist Zeile 24 mit dem "gs" Aufruf):

Code:
#!/bin/bash

SCREENWIDTH=1920
SCREENHEIGHT=1050

feh --recursive --edit --scale-down --auto-zoom --auto-rotate --geometry ${SCREENWIDTH}x${SCREENHEIGHT} "$1"

cd "$1"

for FOLDER in "$1"/*/; do

    cd "$FOLDER"
    NAME=$(basename "$FOLDER" | cut -f1 -d "_")
   
    if [[ $(ls) == *"pdf"* ]]; then
        pdfunite *.pdf ../tmp.pdf
    else
        for filename in ./*; do
            exiv2 rm "filename"
        done
        convert * ../tmp.pdf
    fi

    gs -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dDEVICEWIDTHPOINTS=${SCREENWIDTH} -dCompatibilityLevel=1.4 -dDownsampleColorImages=true -dColorImageResolution=150 -dPDFFitPage -dNOPAUSE -dQUIET -dBATCH -sOutputFile=../"$NAME".pdf ../tmp.pdf
    rm -r "$FOLDER"

done

rm ../tmp.pdf

Ich habe es schon mit "-dAutoRotatePages=/None" versucht, aber leider ohne Erfolg. Und nun weiß ich nicht weiter...

Danke für alle Tipps!

Viele Grüße
Photon
 
[[ $(ls) == "pdf" ]] verstehe ich ehrlich gesagt nicht. wenn du auf datei endung prüfen willst ist das eig verkehrt

aber du benutzt da so viele tools (feh, poppler, magick, ...) das es mich wundert das der schritt mit gs überhaupt noch nötig ist

schau dir vielleicht mal pdfjam an das erzeugt PDF über LaTeX und laut Doku """All pages in an output file from pdfjam will have the same size and orientation.""" klingt nach deiner Anforderung?
 
kieleich schrieb:
[[ $(ls) == "pdf" ]] verstehe ich ehrlich gesagt nicht. wenn du auf datei endung prüfen willst ist das eig verkehrt
Die Ordnerstruktur ist so, dass einem Schüler ein Unterordner entspricht, in dem dessen Dateien liegen. Manche Schüler reichen eine oder mehrere PDF-Dateien ein, andere aber eine oder mehrere Bilder. Die Abfrage überprüft, ob die Ausgabe von "ls" in einem Unterordner den String "pdf" enthält. Wenn ja, dann enthält der Ordner PDF-Dateien (oder auch nur eine PDF-Datei), die dann mit pdfunite zusammengefügt werden. Wenn nicht, dann sind in dem Ordner Bild-Dateien, die dann mit convert zu einem PDF konvertiert bzw. zusammengefügt werden.

Das kann natürlich schief gehen, wenn jemand Bilder hochlädt, die das Stichwort "pdf" im Dateinamen enthalten, aber bisher ist das immer gut gegangen.

kieleich schrieb:
aber du benutzt da so viele tools (feh, poppler, magick, ...) das es mich wundert das der schritt mit gs überhaupt noch nötig ist
Tatsächlich schon, damit die Seiten alle dieselbe Auflösung und Breite haben. Sonst haben manche Seiten mehr Breite als andere und das bringt Xournal++ durcheinander. Außerdem ist die Stiftdicke in Pixeln und wenn eine Datei 3000px Breite hat, dann ist der Stift zweimal dünner, wie bei einer Datei mit 1500px, wenn man die Seite auf volle Bildschirmbreite zoomt.

kieleich schrieb:
schau dir vielleicht mal pdfjam an das erzeugt PDF über LaTeX und laut Doku """All pages in an output file from pdfjam will have the same size and orientation.""" klingt nach deiner Anforderung?
Das mit der Orientierung klingt gut, aber ich will ja nicht dieselbe Größe sondern umgekehrt, ich nutze GhostScript, um die Größe zu verändern und einheitlich zu machen.

PS: Also einheitliche Größe über mehrere Dokumente hinweg, nicht nur innerhalb eines Dokuments. Deswegen muss ich sie auf einen festen Wert setzen.
 
Zuletzt bearbeitet:
pixel sollten bei PDF, an sich keine rolle spielen. das ist ein vektor format

da kannst du 1x1 pixel bild einbetten oder 10000x10000, ob das auf ein A4 blatt passt, hängt allein davon ab welche dimension das PDF behauptet zu haben. skalierung findet hier innerhalb des PDF statt

bei convert kann man bei PDF als Ausgabe Format daher auch die Dimension, DPI usw angeben

kenne xournalpp nicht aber damit das dort auswirkungen hat müsste xournal entweder die papiergröße ignorieren oder vorher stimmt schon was nicht mit dem PDF selbst

stecke da leider auch nicht so drin (habe schon mit postscript gearbeitet aber lang lang ist her) und müsste mir das wieder neu erarbeiten

hast du vielleicht beispiel dateien zum teilen die das problem demonstrieren?
 
Nun, da die PDF-Dateien auf verschiedenste Arten entstanden sind, haben ihre Seiten vor dem Aufruf von GhostScript unterschiedlichste Abmessungen. Ich habe hier zum Beispiel eine Datei mit der Seitengröße 770 × 1089 mm und eine mit 210 × 297 mm. Bei der kleineren Datei hat Xournal++ eine angemessene Stiftdicke, bei der anderen aber eine sehr dünne, kaum sichtbar.

Hier hätte ich ein Beispiel für das ursprüngliche Problem mit der FitSize Option:

Input (Datei vor dem Anwenden von GhostScript): drive.google.com/file/d/1EZqQcWDo1IzAGcxsBP80Avs5lr7HafGW/view
Output (Datei vor dem Anwenden von GhostScript): drive.google.com/file/d/1GRYdFp7cR7UGaDJqki2MZIc4rLgsPPss/view
 

Ähnliche Themen

Zurück
Oben