Grafika v UNIXu - řešení problémů s PostScriptem

29. 10. 2001
Doba čtení: 8 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
Z minulých dílů bychom mohli mít pocit, že vše kolem PostScriptu a PDF dokonale funguje. To je však velký omyl. Hledání chyb a neslučitelností nám často zabere spoustu drahocenného času. Uživatelé proprietárního softwaru otvírají různé tajemné tabulky a náhodně mění zajímavě vypadající položky. Ti ostatní zasednou nad otevřeným zdrojovým kódem a budou bádat, proč to nefunguje. Anebo si přečtou tento článek…

Přestože by všechny postscriptové interprety měly být shodné, až nepříjemně často se stane, že něco selže. Předkládám vám zde neúplný seznam problémů, se kterými jsem se během několika let setkal. Zmíním se o spolupráci s komerčními programy (neznám osvitovou jednotku, která by byla zcela otevřeně kódová, i když v některých možná najdeme Artifex Ghostscript). Některé postscriptové interprety neumějí věci, které jsou v PostScript Language Reference Manual zmíněny, jiné dělají cosi navíc, co pro změnu není popsáno.

Při důsledném používání otevřeně kódových programů jsme však vůči těmto problémům méně bezmocní než uživatelé proprietárních systémů. Pokud najdu chybu v otevřeném programu, mohu přičítat jen sobě, že si ji neumím opravit nebo alespoň obejít.

Kdysi jsem pracoval ve studiu s několika proprietárními programy. Nezřídka se musela několikrát náhodně převrstvovat sazba, aby program vygeneroval korektní PostScript pro všechny pláty (na třetí pokus se to opravdu povedlo). To ovšem nebylo nic proti postscriptovému výstupu z MS-Wordu, který byl vskutku sázkou do loterie (Proč to místo strany 9 vytisklo na tu drahou fólii chybové hlášení? Proč to tady není tučné? Proč jde tenhle nápis do kopce? Proč se tady přelomila sazba? Kde je ten zubatý rámeček?). Asi se nebudete divit, že některá studia si platí písařku, která přepisuje texty od solventních zákazníků z proprietárních programů pro Windows do proprietárních programů pod MacOS (text si ale nechávají vytisknout, neopisují ho z monitoru…).


Není vidět náhled

Nejedná se o chybu. Běžné otevřeně kódové aplikace EPS náhled negenerují, komerční jej však většinou používají.

Řešení: Vložit náhled do souboru pomocí programu epstool:

epstool -tg -ztiff24nc soubor_bez_náhledu.eps >soubor_s_náhledem.eps


EPS nelze vložit do TEXu

Opět většinou nejde o chybu. Může to mít dvě příčiny:

TEX sám o sobě neumí vkládat soubory s náhledem.

Řešení: Odstranit náhled ze souboru pomocí programu epstool:

epstool -p soubor_s_náhledem.eps >soubor_bez_náhledu.eps

TEX neumí vkládat EPS soubory s jiným zakončením řádků, než má daná platforma.

Řešení: Pokud se nejedná o EPS s binárními daty, převedeme jej pomocí tr. Například pro převod Mac → Unix to bude tr ‚\r‘ ‚\n‘ <mac.eps >unix.eps. Totéž umí např. i Emacs (verze 20 a novější). Pokud soubor obsahuje binární data, můžeme provést převod pouze na hlavičku souboru (dál TEX nejde).


Aplikace při vkládání EPS hlásí, že nemá písmo, přestože v EPS souboru písmo je

Opět se může jednat o dva různé problémy:

Některé programy nerozumějí starému stylu DSC komentářů ve verzi 2.0, a pak se tváří, že EPS soubor neobsahuje správné písmo. Naneštěstí populární TEXový program dvips generuje DSC-2.0 doposud.

Řešení: Prohnat EPS soubor přes následující sed skript:

1,30s/DocumentFonts/DocumentSuppliedFonts/

Jiné programy pak vyžadují, aby písmo použité v EPS bylo nainstalováno i v systému.

Řešení: Pokud nemůžeme písmo nainstalovat, můžeme informaci o písmu z DSC zcela smazat. Aplikace se nedozví, že EPS soubor takové písmo používá, a soubor vloží bez reptání. Jedná se o řádky poblíž začátku souboru začínající řetězci %%DocumentFonts nebo %%DocumentSup­pliedFonts (s případnými následujícími řádky začínajícími %%+). Pokud se vyskytne řádka začínající %%DocumentNee­dedFonts, zřejmě písma opravdu v souboru nejsou.


Obrázky TIFF s kompresí CCITT G3/G4 nefungují

Opět jsou dvě možné příčiny:

V implementacích firmy Adobe se z neznámého důvodu chovají CCITT filtry jinak než ostatní filtry – uzavřou se po každém datovém bloku a je nutné je opět otevřít.

Řešení: Aktualizovat balík libtiff, jehož program tiff2ps měl tuto chybu, nebo generovat EPS soubor jinak (např. pomocí convert). Upozorňuji však, že i poslední verze tiff2ps stále ještě občas generuje špatný PostScript.

Doposud žádná běžná komerční aplikace nevyužívá možnosti generovat PostScript z bitmapy čárové grafiky s velmi silnou kompresí CCITT (G3 a G4) a v některých interpretech při jejím použití můžeme narazit na neodhalené chyby.

Řešení: Rozloučit se s úsporným formátem a použít soubor bez komprese, případně s kompresí lzw.


Převod RGB–CMYK je nepřesný

Pro obrazovkový PostScript se používá grafický prostor RGB, pro tisk CMYK. Jejich převod byl ve staré verzi PostScriptu definován zcela nevyhovujícím způsobem. Výsledek převodu se na různých zařízeních navíc výrazně liší podle toho, zda CMYK zařízení používá RGB prostor bez gama korekce, s gama korekcí nebo je nastaveno na sRGB. Teprve při správném použití LL3 funkce UseCIEColor lze dosáhnout lepších výsledků.

Řešení: Použít správný barevný prostor nebo správně inicializovaný nezávislý barevný systém.


Nesprávná délka hlavičky filtru s obrazovými daty

Toto není chyba PostScriptu. Podle definice jazyka je zcela v pořádku, uzavře-li se čtený řetězec v okamžiku, kdy má dostatek dat pro nakreslení obrázku. Jinak tomu může být při převodu do jiných vysokoúrovňových jazyků, kde takové triky nejsou povoleny (PDF, PXL). Tam je možné spatřit pruh pod obrázkem či vykousnutý pravý dolní roh.

Řešení: Nepoužívat tiff2ps s volbou pro PostScript Level 2.

Problémy v Ghostscriptu s tímto spojené budou zřejmě vyřešeny v Ghostscriptu 7­.03.


Příkaz nastavení stránky

Starší zařízení používala k nastavení velikosti stránky příkaz setpage, který se však nestal oficiální součástí PostScriptu. Nová používají setpagedevice. Většina zařízení rozumí oběma definicím, ovšem ne všechna.

Řešení: Podívat se do PPD souboru a opravit hlavičku.


Progresivní jpeg dct

Přesto, že to nikde v referenční příručce není uvedeno, většina postscriptových interpretů nezpracuje progresivní JPEG DCT kompresi. Ghostscript má tuto funkci zablokovanou (hledejte v souboru gsjmorec.h).

Řešení: Nepoužívat tiff2ps s volbou pro PostScript Level 2 na progresivně JPEG DCT komprimované obrázky. Před použitím jpeg2ps progresivní JPEG „odprogresivnit“ příkazem jpegtran.


Postscriptové soubory mají po spojení špatná písma

Máte-li vytvořené dva soubory (např. z dvips), pak ze stejných písem jsou v každém z nich použité jiné znaky. Ze strukturovaných komentářů některých programů (dvips) však není patrné, že se jedná jen o podmnožinu písma, a ani v kódu nemají různá jména. Spojovací program si s takovýmí soubory neporadí.

Řešení: V případě dvips použít spojení ještě na úrovni dvi (dvidvi, dvitodvi). Opravit zdrojový kód a ke jménu podmnožiny písma přidat náhodný řetězec.


Špatná informace v DSC

Pokud vytváříme soubor v programu, který nepodporuje zamýšlený výstupní formát zcela (např. v TEXu připravujeme separovaný PostScript), může některá aplikace získat z DSC nesprávné informace. Na jejich základě pak může zrušit naše nastavení z hlavičkové části souboru (úhly, rastry).

Řešení: Opravit aplikaci. Vyhnout se meziaplikaci. Nelze-li, vložit nastavovací informace do PostScriptu na začátek každé stránky a nespoléhat se na to, že informace z hlavičky budou použity.


Falešný strukturovaný PostScript

Některé soubory mají vytvořenou DSC strukturu, ale postscriptový kód není strukturovaný (např. výstup z MS-Wordu). Po některých operacích pak vznikne chybný kód.

Řešení: Nepoužívat DSC analyzátory nebo tyto aplikace. Nelze-li a je-li nutné přestránkovat, provést to až po interpretaci souboru v Ghostscriptu (soubor ovšem velmi naroste).

Pozor: Při použití některých hackerských konstrukcí v TEXu můžeme takový PostScript nechtěně vyrobit sami! Pokud to o souboru víte, odstraňte z něj strukturované komentáře (volby dvips -K1 -N1).


Interpolace nefunguje

V popisu jazyka PostScript je možné u obrázků zapnout funkci Interpolate, která by měla obrázek s nízkým rozlišením vykreslit lépe. Některé postscriptové interprety toto nastavení zcela ignorují, jiné interpolují obrázky jen v některých polohách.

Řešení: Nespoléhat na správnou funkci Interpolate a obrázek si zvětšit předem v běžném bitmapovém editoru.


PDF nejde vytisknout

Z důvodu neznámé chyby nejde výstup ghostscriptového převodníku ps2pdf vytisknout nebo nasvítit z některých verzí Adobe Acrobat Readeru. Zobrazuje se bez problémů. Příčina mi zatím není známá.

Řešení: Aktualizovat Adobe Acrobat Reader. Stejný soubor lze bez problémů zanalyzovat a vytisknout některými komerčními vektorovými editory (je zde ovšem riziko v nepřesnosti těchto programů).


Obrázek i písmo jsou kvalitní na obrazovce, ale ne při tisku

Jak již bylo dříve řečeno, pro tisk rozměrnější jemné grafiky vyžaduje Ghostscript větší množství paměti osazené v tiskárně (za minimum lze považovat 4 MB pro A4/600 DPI a 16 MB pro A4/1200 DPI). Pokud tiskárně dojde paměť, přistoupí k podvzorkování a výsledky bývají žalostné.

Řešení: Dokoupit paměť do tiskárny nebo tisknout pouze menší obrázky. Může též pomoci použití PXL místo PCL.


Porušení podmínek operátoru seac

Tento problém je v podstatě chybou referenčních příruček. Nebudu-li zacházet do detailů – referenční ukázka pro změnu kódování písma má jednu chybu – pokud písmo obsahuje operátor seac (pro práci s akcenty), generuje ukázka PostScript, který je v rozporu s referenční příručkou Type 1. Navíc referenční příručka Type 1 neumožňuje s použitím seac vytvořit korektní postscriptové písmo v kódování např. Latin-2.

Doposud mi není znám žádný PostScriptový interpret, kterému by tento rozpor vadil. Jinak je tomu u převodníků. Problém měly některé verze ps2pdf z Ghostscriptu (podařilo se mi vývojářům vysvětlit, že takové „vadné“ soubory v Čechách potřebujeme) a dvips z balíku Web2C (zde pomáhala volba -j0).

Řešení: Ověřit si tisk všech akcentovaných znaků nanečisto. Firma Adobe si je tohoto problému vědoma a operátor seac nedoporučuje tvůrcům písem používat.


Písmo spadlo, v Ghostscriptu přitom funguje

V některých písmech se občas vyskytnou podivné operátory. Není mi známo, zda se jedná o „tajné“ operátory, či spíše o chybu editoru písem. Ghostscript je vůči těmto podivným operátorům v písmech poměrně imunní, ale některé jiné interprety nikoliv.

Řešení: Není-li možné soubor zpracovat jinde, můžeme sáhnout po t1utils, písmo dekryptovat, nalézt operátory error nebo UNKNOWN_číslo, z písma je odstranit, a vše opět zakryptovat.

Mé poděkování za přímou či nepřímou pomoc při řešení popsaných probémů patří těmto lidem: L. Peter Deutsch, Petr Macháček, Bruce A. Mallett, Tom Lane.

Autor článku