2010-07-28 10 views
6

Używam Ghostscript do rasteryzacji pierwszej strony pliku PDF do JPEG. Aby uniknąć tworzenia plików tymczasowych, dane PDF są przesyłane do wejścia standardowego Ghoscripts, a JPEG jest "drenażowany" na standardowe wyjście. Ten potok działa jak zaklęcie, dopóki GS nie otrzyma nieprawidłowych danych PDF: Zamiast zgłaszać wszystkie komunikaty o błędach na stderr, jak bym się spodziewał, w dalszym ciągu zapisuje niektóre z komunikatów do stdout stdout.Zapobiegaj pisaniu błędów przez Ghostscript na standardowym wyjściu

Aby odtworzyć:

$ echo "Not a PDF" >test.txt 
$ /usr/bin/gs -q -sDEVICE=jpeg -dBATCH -dNOPAUSE -dFirstPage=1 -dLastPage=1 \ 
    -r300 -sOutputFile=- - < test.txt 2>/dev/null 
Error: /undefined in Not 
Operand stack: 

Execution stack: 
... 

Zanotuj 2>/dev/null powyżej nie tłumić komunikaty o błędach. Dokumentacja Ghostscript ostrzegła już, że pisanie na standardowe wyjście wymaga flagi -q do tłumienia wiadomości na standardowe wyjście, ale nadal wydaje mi się, że czegoś tu brakuje.

Odpowiedz

11

Jeśli chcesz naprawdę ciszy Ghostscript, modyfikować swój wiersz poleceń tak:

/usr/bin/gs -q  \ 
    -sstdout=%stderr \ 
    -sDEVICE=jpeg \ 
    -dBATCH   \ 
    -dNOPAUSE  \ 
    -dLastPage=1  \ 
    -r300   \ 
    -sOutputFile=- \ 
    - < test.txt 2>/dev/null 

Dodanie -sstdout=%stderr pozwala Postscript stdout zostać przekierowany, jednocześnie umożliwiając kierowcy pisać na standardowe wyjście. (Ta łatka jest w Ghostscript od ~ 2001, 22 września)

+2

Dzięki, pipitas - dokładnie tego szukałem. Musiałem jednak wyraźnie określić '-sstdout =/dev/null', ponieważ'% sstderr' utworzyłby plik o tej samej nazwie w bieżącym katalogu. Na przyszłość, tutaj jest oryginalny wątek z listą dyskusyjną omawiającą łatkę: http://www.ghostscript.com/pipermail/gs-code-review/2001-March/000273.html –

+1

Jest tam literówka. Powinien być '% stderr' bez podwójnego s –

+0

Thx, @EdwardB, masz rację. Naprawiłem to. –