Jak mogę określić liczbę stron z pliku postscriptowego (wygenerowanego przez Operę)?

2

Nie znam języka postscriptowego.

Mam system emulacji drukowania dwustronnego napisany w bashu. Drukuje najpierw strony nieparzyste, a następnie strony parzyste. Musi wiedzieć, czy istnieje nieparzysta liczba stron, aby mogła wysunąć ostatnią nieparzystą stronę, która nie ma odpowiedniej parzystej strony. Wykorzystuje również liczbę stron do celów raportowania.

Nie wiedziałem, jak to zrobić poprawnie, więc napisałem kod, który wygląda na końcu i, jeśli to konieczne, początek pliku postscriptowego szukającego „%% stron”, po którym następuje liczba stron. Działa to na prawie wszystkich, z wyjątkiem plików drukowanych przez przeglądarkę Opera.

Czy ktoś może zasugerować inny sposób uzyskania tych informacji?

Pliki postscriptowe wydają się być dość duże z dużą ilością treści nieczytelnych dla ludzi, więc nie spędziłam jeszcze wiele czasu na tych, które pochodzą z Opery.

TIA

Aktualny kod jest pod adresem:

http://sourceforge.net/projects/duplexpr/

function ps_page_ct
Joe
źródło

Odpowiedzi:

5

Poniższe polecenie Ghostscript niezawodnie zlicza strony w pliku PostScript - ale może być dość powolne, ponieważ wymaga całkowitego zinterpretowania pliku (uruchomienia), ponieważ @afrazier stwierdził już w komentarzu:

gs \
 -o /dev/null \
 -sDEVICE=bbox \
  input.ps 2>&1 \
| grep HiResBoundingBox \
| wc -l
Kurt Pfeifle
źródło
Wreszcie! Sprawdzę to i wrócę tutaj. Dziękuję Ci.
Joe
To wydaje się działać, ale „raczej powolne” to niedopowiedzenie. W moim notebooku I3 trzy stronicowy dokument działa w nieco ponad dwie minuty. W najlepszym razie mogę dodać przełącznik (opcję) do mojego systemu, aby użyć tej metody w ostateczności. W międzyczasie zmieniłem swój kod, aby policzyć „HiResBoundingBox” zamiast „showpage”.
Joe
@Joe: Czy Twój kod powinien polegać po prostu na grep do HiResBoundingBox: to nie zadziała. To słowo nie musi być używane w plikach wejściowych - jego wygląd w strumieniu wyjściowym jest spowodowany przez Ghostscript interpretujący wszystkie dane wejściowe i destylujący ten fragment informacji.
Kurt Pfeifle
@Joe: Powodem, dla którego powiedziałem, że polecenie jest „raczej powolne”, jest to, że Ghostscript musi całkowicie zinterpretować i renderować plik PostScript (bez wyświetlania go) w celu niezawodnego wyodrębnienia informacji o numerze strony. To tyle samo, co całkowite wyświetlenie pliku na ekranie. Powodem tego jest to, że PostScript jest kompletnym językiem programowania Turinga i aby zobaczyć, co dzieje się w jednym miejscu, interpreter musi uruchamiać sekwencyjnie cały kod, który znajduje się przed tym miejscem .
Kurt Pfeifle
@Joe: Dwie minuty dla 3 stronicowego dokumentu są ekstremalne. Oznacza to, że ten dokument jest dość skomplikowaną bestią i że Ghostscript będzie musiał po prostu zrobić ten dokument na ekranie ...
Kurt Pfeifle
5

Niestety, nie ma prostego sposobu na znalezienie stron w surowym pliku Postscript. Dlatego %%Pages została utworzona konwencja (konwencje strukturalne Adobe Document).

Poleceniem do wydania strony jest showpage. W prostych przypadkach wystarczy je policzyć.

Ale to polecenie można osadzić w treści funkcji, a następnie potrzebujesz parsera Postscript.

mouviciel
źródło
+1 za ostateczną prawidłową odpowiedź. Postscript jest językiem kompletnym Turinga. Jeśli chcesz dokładnej odpowiedzi, interpretacja pliku to „jedna prawdziwa droga”. Zacznę poważnie patrzeć na dźwignię finansową Ghostscript jeśli naprawdę tego potrzebujesz.
afrazier
@afrazier: Czy kiedykolwiek porównałeś tę „jedną prawdziwą odpowiedź” z moją? W jaki sposób mój wskaźnik ocenia twoją prawdziwość?
Kurt Pfeifle
@KurtPfeifle: Nie widziałem twojej odpowiedzi, ale po jej przejrzeniu jest zdecydowanie wart +1. Po jakimś więcej Googlingu również opublikowałeś to Na tak. Jest także to komentarz od opiekuna GhostScript. Nie jestem pewien, czy będą szybsze niż to, które użyłeś powyżej.
afrazier
2

Znalazłem gdzieś ten mały fragment, przetworzy on dokument bardzo szybko i wydrukuje liczbę stron. Może to pomóc, jeśli exiftool nie wydrukuje informacji o metadanych, ponieważ dokument nie został prawidłowo wygenerowany:

gs -dNODISPLAY -dBATCH -dNOPAUSE -o /dev/null source|grep -P '^Page'|wc -l
j.berrisch
źródło
Próbowałem go na dwóch plikach testowych. Jeden dał 0 dla 3-stronicowego dokumentu, a drugi wygenerował komunikat o błędzie ghostscript.
Joe
Próbowałeś bez |grep ....? Jaki jest wynik? Używam go jako zapasowego, gdy dane exif nie zawierają „Licznika stron”. Czy istnieje link do używanych dokumentów? Jakiej wersji ghostscript używasz? Na jakim systemie operacyjnym?
j.berrisch
Oto jeden dokument: dl.dropboxusercontent.com/u/54584985/Opera01.ps . Robi 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps | grep -P' ^ Page '| wc -l 0' Oto bez 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. Wszelkie prawa zastrzeżone. To oprogramowanie jest dostarczane bez ŻADNEJ GWARANCJI: szczegółowe informacje można znaleźć w pliku PUBLIC. bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ 'Przepraszam za format.
Joe
Przepraszam, ale masz rację, testowałem tylko moje źle sformatowane pliki PDF, dla których działa dobrze. Być może Opera powinna coś naprawić, ponieważ wynik exiftool pokazuje właściwość „Strony”, ale z wartością przewodową „atend”.
j.berrisch