Wie kann ich die Seitenzahl aus einer Postscript-Datei (erstellt von Opera) ermitteln?

5009
Joe

Ich kenne die Postscript-Sprache nicht.

Ich habe ein Duplex-Druck-Emulationssystem, das in bash geschrieben ist. Es werden zuerst die ungeraden Seiten und dann die geraden Seiten gedruckt. Es muss wissen, ob es eine ungerade Seitenzahl gibt, damit die letzte ungerade Seite ausgeworfen werden kann, die keine entsprechende gerade Seite hat. Es verwendet außerdem Seitenzahlen für Berichtszwecke.

Ich wusste nicht, wie man dies richtig macht, also schrieb ich Code, der am Ende und ggf. am Anfang der Postscript-Datei nach "%% Pages:" sucht, auf die eine Seitenzahl folgt. Dies funktioniert bei fast allen Dateien außer den vom Opera-Browser gedruckten Dateien.

Kann jemand einen anderen Weg vorschlagen, um diese Informationen zu erhalten?

Postscript-Dateien sind in der Regel ziemlich umfangreich und enthalten nicht für Menschen lesbare Inhalte. Daher habe ich noch nicht viel Zeit darauf verwendet, die Dateien aus Opera herauszugeben.

TIA

Der aktuelle Code lautet:

http://sourceforge.net/projects/duplexpr/  function ps_page_ct 
2

3 Antworten auf die Frage

5
mouviciel

Unfortunately, there is no simple way of finding pages in a raw Postscript file. That is why %%Pages convention has been created (Adobe Document Structuring Conventions).

The command for issuing a page is showpage. In simple cases, you just have to count them.

But this command can be embedded in the body of a function and then you need a Postscript parser.

+1 für das, was letztendlich die richtige Antwort ist. Postscript ist eine Turing-vollständige Sprache. Wenn Sie eine genaue Antwort wünschen, ist das Interpretieren der Datei "One True Way". Ich würde ernsthaft nach [Ghostscript] (http://www.ghostscript.com/) suchen, wenn Sie das wirklich brauchen. afrazier vor 12 Jahren 0
@afrazier: Hast du diese "eine wahre Antwort" jemals mit meiner verglichen? Wie ist mein Wert dann auf Ihrer Richtigkeitsskala? Kurt Pfeifle vor 11 Jahren 0
@KurtPfeifle: Ich habe deine Antwort nicht gesehen, aber nachdem ich sie überprüft habe, ist sie definitiv ein +1 wert. Nach mehr Googeln haben Sie [this] (http://stackoverflow.com/a/4829240/320333) auf SO gepostet. Es gibt auch [this] (http://sourceforge.net/projects/ghostscript/forums/forum/5451/topic/1050031) vom GhostScript-Betreuer. Ich bin mir jedoch nicht sicher, ob sie schneller sind als zuvor. afrazier vor 11 Jahren 0
5
Kurt Pfeifle

Mit dem folgenden Ghostscript-Befehl werden die Seiten in Ihrer PostScript-Datei zuverlässig gezählt. Dies kann jedoch sehr langsam sein, da die Datei vollständig interpretiert (ausgeführt) werden muss, wie @afrazier bereits in einem Kommentar feststellt:

gs \ -o /dev/null \ -sDEVICE=bbox \ input.ps 2>&1 \ | grep HiResBoundingBox \ | wc -l 
Endlich! Ich werde es überprüfen und wieder hierher kommen. Vielen Dank. Joe vor 11 Jahren 0
Das scheint zu funktionieren, aber "eher langsam" ist eine Untertreibung. Auf meinem I3-Notebook läuft ein dreiseitiges Dokument in etwas mehr als zwei Minuten. Im besten Fall kann ich meinem System einen Schalter hinzufügen, um diese Methode als letzten Ausweg zu verwenden. In der Zwischenzeit habe ich meinen Code geändert, um "HiResBoundingBox" anstelle von "showpage" zu zählen. Joe vor 11 Jahren 0
@Joe: Sollte sich dein Code einfach auf `grep`-ping für` HiResBoundingBox` verlassen, wird es nicht funktionieren. Dieses Wort muss in Eingabedateien überhaupt nicht verwendet werden - sein Erscheinen im Ausgabestrom wird dadurch verursacht, dass Ghostscript die gesamte Eingabe interpretiert und dieses Info-Snippet für Sie destilliert. Kurt Pfeifle vor 11 Jahren 0
@Joe: Der Grund, warum ich sagte, dass der Befehl "eher langsam" ist, ist folgender: Ghostscript muss die PostScript-Datei vollständig interpretieren und rendern (ohne sie anzuzeigen), um die Seitennummerninformationen zuverlässig zu extrahieren. Es ist genauso viel Arbeit wie die vollständige Anzeige der Datei auf dem Bildschirm. Der Grund dafür ist, dass PostScript eine Turing-vollständige Programmiersprache ist. Um zu sehen, was an einer Stelle passiert, muss der Interpreter den Code, der sich vor dieser Stelle befindet, sequentiell ausführen. Kurt Pfeifle vor 11 Jahren 0
@ Joe: Zwei Minuten für ein 3-seitiges Dokument sind extrem. Das bedeutet, dass dieses Dokument ein ziemlich komplexes Tier ist und Ghostscript genauso lange brauchen würde, um dieses Dokument einfach auf dem Bildschirm anzuzeigen ... Kurt Pfeifle vor 11 Jahren 0
Vielen Dank. Ich ändere den Code wieder auf "showpage" (sobald er %% Pages nicht findet). Ich weiß, dass es nicht garantiert funktioniert, aber das tut es oft. Schließlich füge ich einen Schalter hinzu, um optional den richtigen Weg für Dateien zu finden, die nicht funktionieren. Joe vor 11 Jahren 0
Nun, da ich damit fertig bin, haben sie PostScript 1.4, 1.5 und 1.6 herausgebracht. Ich habe mir eine Heuristik ausgedacht, die manchmal mit 1.4 und 1.5 funktioniert. Ich habe in der von mir untersuchten 1.6-Datei nichts gesehen, das so aussah, als würde es funktionieren. Wird Ihre brute force-Methode mit diesen neueren Versionen noch funktionieren? Joe vor 11 Jahren 0
@ Joe: Es gibt keine "PostScript 1.4, 1.5 und 1.6". PostScript gibt die Stufen 1, 2 und 3 an. Sind Sie sicher, dass Sie tatsächlich PostScript gemeint haben? Die von Ihnen genannten Versionen sind für PDF und nicht für PostScript verfügbar. Kurt Pfeifle vor 11 Jahren 0
Hoppla. Ich arbeite gleichzeitig an beiden und verwirre sie. Dies sind PDF-Versionen und sollten in einer separaten Frage stehen. Danke fürs bemerken. Joe vor 11 Jahren 0
2
j.berrisch

I found this little snippet somewhere, it will process the document very fast and print out the page count. This can help if exiftool do not print this meta-data information because the document was not generated correctly:

gs -dNODISPLAY -dBATCH -dNOPAUSE -o /dev/null source|grep -P '^Page'|wc -l 
Habe es an zwei Testdateien versucht. Einer gab 0 für ein 3-seitiges Dokument und der andere erzeugte eine Ghostscript-Fehlermeldung. Joe vor 11 Jahren 0
Did you try without the `|grep ....`? What's the output? I use it as fallback when exif data does not contain 'Page Count'. Is there a link to the documents you are using? Which version of ghostscript are you using? On which OS? j.berrisch vor 11 Jahren 0
Hier ist ein Dokument: https://dl.dropboxusercontent.com/u/54584985/Opera01.ps. Es macht 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps | grep -P' ^ Seite '| wc -l 0' Hier ist es ohne grep 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps GPL Ghostscript 9.05 (2012-02-08) Copyright (C) 2010 Artifex Software, Inc. Alle Rechte vorbehalten. Diese Software wird mit keiner Garantie geliefert: Einzelheiten finden Sie in der Datei PUBLIC. bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ 'Entschuldigung wegen des Formats. Joe vor 11 Jahren 0
Tut mir leid, aber Sie haben recht, ich habe nur meine schlecht formatierten PDFs getestet, für die es gut funktioniert. Vielleicht sollte Opera etwas korrigieren, da das Exiftool-Ergebnis eine "Pages" -Eigenschaft zeigt, jedoch mit einem verkabelten Wert "atend". j.berrisch vor 10 Jahren 0