• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Seitenanzahl einer Postscript-Datei ermitteln

OsunSeyi

Hacker
Hi,
Hab gedacht, dies ließe sich leicht ergooglen... habs aber nicht rausgefunden:
Wie lässt sich die Seitenzahl einer ps-Datei ermitteln?
Es würde schon reichen herauszufinden, ob sie überhaupt mehrseitig ist.

Ein Weg wäre, sie mit 'ps2pdf' zu konvertieren und mit 'pdfino' weiterzumachen.
Jaja, das Script würde dann die Pdf-Datei wieder löschen, aber doch ein bisschen umständlich :D

...kann das nicht 'gs' ??
 

RME

Advanced Hacker
Hallo,

Code:
pdfinfo xyz.pdf
Code:
pdfinfo xyz.pdf |egrep Pages
poppler-tools (PDF Rendering Library Tools) muss installiert sein.

Gruss,
Roland
 
OP
OsunSeyi

OsunSeyi

Hacker
Du hast mich falsch verstanden, dann müsste ich das Postscript doch konvertieren und eine temporäres Pdf erstellen, nur um die Seitenzahl herauszufinden... Das will ich ja gerade nicht, sondern lieber direkt aus dem Ps!
 

RME

Advanced Hacker
Du hast mich falsch verstanden...
...stimmt.

PS Dateien müssen keine Seiten spezifizieren -- der Parameter showpage ist optional (sonst wäre Seitenzahl = Anzahl dieses Parameters).

Du kannst gs anwenden (was auch beim Drucken geschieht), z.B.

Code:
echo irgendetwas | gs xyz.ps  2>&1 | grep showpage | wc -l
nicht schön (weil ein Fenster geöffnet wird), aber es sollte funktionieren.

Gruss,
Roland
 
OP
OsunSeyi

OsunSeyi

Hacker
Ja, es funktioniert (und ist unschön).
Mein Englisch ist nicht so super, darum stehe ich im Krieg mit den Manpages..
Danke!
 

RME

Advanced Hacker
Sofern enthalten:
Code:
grep '%%Pages' xyz.ps
...aber nur wenn "%%Pages: 2" oder grösser.
Wenn = 0 dann ist die Datei ein EPS, wenn = 1 dann möglicherweise ebenfalls (aber nicht wenn >= 2).

-----
Nebenbei: vielleicht gibt es Möglichkeiten (via gs Parameter?) die "unschöne" Variante zu verschönern... Hier wäre ein solches Beispiel:
Code:
gs -dNOPAUSE -dBATCH -sDEVICE=bbox xyz.ps 2>&1 | grep '%%BoundingBox' | wc -l
...ist aber untauglich weil vieeeel zu zeitaufwendig -- mehrere Minuten pro (grösseres) Dukument :D

-/-
 
OP
OsunSeyi

OsunSeyi

Hacker
Naja, 'ps2pdf' braucht nicht lange...und die Vorgehensweise mit 'pdfinfo' ist sicher.
Ein bisschen bescheuert, aber würde halt gehen.
 
OP
OsunSeyi

OsunSeyi

Hacker
Code:
#!/bin/sh
#      der geschätzte Name: pspages [file.ps]
#      siehe: "Seitenanzahl einer Postscript-Datei ermitteln"
#                (http://www.linux-club.de/viewtopic.php?f=21&t=116586)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	TMP=pspages.tmp

	ps2pdf  $1 $TMP
	pdfinfo $TMP | grep 'Pages:' | sed 's|^Pages:[[:space:]]*||g'
	rm      $TMP
:irre:
 

RME

Advanced Hacker
Was passiert da genau?
Code:
ps2pdf xyz.ps - 2>&- | pdfinfo - | grep Pages
  ^              ^   ^    ^      ^   ^
  1              2   3    4      2   5
Code:
-1- ps2pdf   >>> Konvertiert PostScript zu PDF unter Anwendung von ghostscript.

                 Aufruf generell:
                   ps2pdf [Optionen] input.ps output.pdf

                   output.pdf kann weggelassen werden; dann wird Output = input.pdf

                   Sowohl Input wie auch Output können von 'stdin'  bzw. 'stdout' gelesen
                   oder ausgegeben werden -- heisst generell: von/via der Konsole. Dies
                   wird mit '-' angezeigt, also:

                     ps2pdf - output.pdf   (input von 'stdin')
                     ps2pdf input.pdf -    (output auf 'stdout')
                     ps2pdf - -            (input sowie output via 'stdin' bzw. 'stdout')
(in unserem Fall also "ps2pdf input.pdf -")

Code:
-2- '2>&-'   >>> closes (schliesst) standard error (file descriptor 2) für den nachfolgenden
                 Befehl (d.h. 'pdfinfo')

                 '2'  heisst "standard error" = 'stderr' = file descriptor 2
                 '>'  = umleiten nach...
                 '&-' = close

                  "standard input"  = 'stdin'  = file descriptor 0
                  "standard output" = 'stdout' = file descriptor 1
                  "standard error"  = 'stderr' = file descriptor 2
(in unserem Fall kann ps2pdf Meldungen ausgeben welche wir unterdrücken wollen -- z.B.
GPL Ghostscript 9.00: Error: Font Renderer Plugin ( FreeType ) return code = -1
welche Font Render Probleme melden (Schriftart kann nicht 1-zu-1 umgesetzt werden). Dies kann zumeist ignoriert werden)

Code:
-3- '|'      >>> eine 'pipe' -- leitet die Ausgabe des vorangehenden Befehls weiter zum
                 nachfolgenden Befehl.
(in unserem Fall also die Ausgabe des 'ps2pdf' Befehls, d.h. output.pdf via 'stdout' nach 'pdfinfo')

Code:
-4- pdfinfo  >>> Liest (extract) PDF Document Informationen -- Ausgabe auf Konsole ('stdout').

                 Aufruf generell:
                   pdfinfo [Optionen] input.pdf

                   Input (input.pdf) kann von 'stdin' gelesen werden -- heisst generell: von
                   der Konsole. Dies wird mit '-' angezeigt, also:

                     pdfinfo -   (input von 'stdin')
(Output ist in jedem Fall auf 'stdout' (die Konsole))

Code:
-5- grep     >>> (auch 'egrep' und 'fgrep') per default: print Zeilen einer Datei welche ein
                 spezifiziertes Muster (= regular expression = search pattern) enthalten.

                 Aufruf generell:
                   grep [Optionen] pattern input

                   Input (input) kann von 'stdin' gelesen werden -- heisst generell: von
                   der Konsole. Dies wird mit '-' angezeigt, also:

                     grep pattern -   (input von 'stdin')
                   oder
                     cat input | grep pattern
(in unserem Fall wird die Ausgabe von 'pdfinfo' -- Ausgabe auf 'stdout' aber umgeleitet nach 'grep' -- nach einer Zeile welche "Pages" enthält abgesucht und, falls gefunden, auf 'stdout' ausgegeben)

Gruss,
Roland
 
OP
OsunSeyi

OsunSeyi

Hacker
Also, ich versuch mal nachzuvollziehen:

ps2pdf xyz.ps - Hier ersetzt das '-' die (normalerweise anzugebende) Ausgabedatei durch die Standardausgabe

2>&- Entspricht '2>/dev/null', unterdrückt also den Standardfehlerkanal

| Die Pipe macht aus der Standardausgabe (in der sich unsere Ps-Datei "befindet") die Standardeingabe für 'pdfinfo'

pdfinfo - Hier ersetzt das '-' die (normalerweise anzugebende) Eingabegabedatei durch die Standardeingabe

| grep Pages Sucht die gesuchte Zeile in der Ausgabe von 'pdfinfo'

Also passiert im Prinzip das gleiche wie bei obigen Script 'pspages', man kommt aber ohne das Anlegen einer Datei aus, weil die Daten, die normalerweise in die Datei gespeichert würden, direkt an das nächste Programm weitergeleitet werden.
Mir war die Bedeutung von '-' nicht klar.
Die Bedeutung von '&-' ist mir noch nicht deutlich: Es entspricht doch nicht wirklich '/dev/null'?
 

RME

Advanced Hacker
Hast Du sehr gut interpretiert :thumbs:
Die Bedeutung von '&-' ist mir noch nicht deutlich: Es entspricht doch nicht wirklich '/dev/null'?
Die Ausgabe wird nicht umgeleitet (nach '/dev/null') sondern verhindert. In unserem Beispiel funktioniert jedoch beides. Du kannst mit 'n&-' irgend ein File (Datei) schliessen (also auch n = 2 = 'stderr').

- Du kannst (in einem script) eine Datei öffnen, 'File'
- dieser Datei ein file descriptor (fd) zuordnen, z.B. 7 (exec 7<> File)
- ...
- ... irgend etwas in die Datei schreiben und/oder davon lesen
- ...
- die Datei wieder schliessen (exec 7>&-)

Closing File Descriptors
Code:
n<&-
   Close input file descriptor n.

0<&-, <&-
   Close stdin.

n>&-
   Close output file descriptor n.

1>&-, >&-
   Close stdout.
Child Prozesse 'erben' offene file descriptors. Dies ist warum 'pipes' funktionieren. Um die Weitergabe eines file descriptors zu verhindern (wie in meinem Beispiel): den fd schliessen.

-/-
 
OP
OsunSeyi

OsunSeyi

Hacker
Hab's nicht kapiert, was fehlt sind die Grundlagen. Bin zZt einfach überfordert, und die Zeit am PC ist limitiert.
Was bedeutet 'exec()'?
Warum muss ich einer Datei einen Filedescriptor zuordnen, wenn man doch mit "echo 'abc' > Datei" in eine Datei schreiben kann?
Was ist ein Filedescriptor?
Möchte aber (quasi zum Trost) ein paar Links schicken, die sich mit dem Thema beschäftigen (auch andere könnten hier lesen):

Linuxfibel - Die Bash - Prozesskontrolle
Unixboard: stderr in stdout und Datei leiten
rantanplan.org: bash in the beginning
archlinux-wiki: Umleitungen

Vielen Dank für Deine Mühe, der gesuchte Befehl (um zum Ausgangsthema zurückzukommen) ist hier längst im Einsatz.
Es ist Bestandteil von einem Script zum Ausdrucken von in Postscriptdateien fest angelegten Dokumenten.
Wenn eine Postscriptdatei mehrseitig ist (darum ging es), wird sie mit 'psselect' in Vorder- und Rückseiten zerlegt.
Das Script schickt die Rückseiten (in der richtigen Reihenfolge) an den Drucker, öffnet ein Xdialog-"Yes-No-Box" "bitte wenden",
nach bestätigen werden die Vorderseiten gedruckt und voila, ein Mehrseitiges Dokument wurde erstellt. Klappt super.
Handelt es sich um ein einseitiges Postscript, geht es direkt an 'lpr' (ohne vorher zerlegt zu werden).

Danke, Tom
 
Oben