Sziasztok, CUPS-ban jártasak segítségét kérném. Van egy ősrégi ERP szoftverünk, ami CP-852 kódolást használ. A host, amin fut HU_hu a locale. Feltelepítettem a CUPS-PDF-et, dolgozik is szépen, de az ERP-ből érkező nyomtatásokkal nem tud mit kezdeni, ott nem jelennek meg az ékezetes karakterek. Utánaolvasva készítettem egy egyszerű filtert, aminek a nevét beletettem a cups-pdf ppd leírójába. Maga a filter meghívódik, de üres pdf a kimenet. Többféle verzióban is kipróbáltam a filtert, de az istennek sem akar sikerülni. Hogyan lehetne ezt működésre bírni?
A filter program:
...
echo "DEBUG: texttops argv[$#] = $@" >&2
echo "DEBUG: PPD: $PPD" >&2
if [ $# -lt 5 -o $# -gt 6 ]; then
echo "ERROR: $0 job-id user title copies options [file]" >&2
exit 1
fi
# Read from given file.
FILENAME=$(basename $6)
DIRNAMES=$(dirname $6)
echo "DEBUG: sending data $FILENAME to $DIRNAMES ..." 1>&2
if [ -n "$6" ]; then
# Ez működik. A mentésre kerülő file jó ékezetes karaktereket tartalmaz
iconv -s -c --from-code=CSPC850MULTILINGUAL --to-code=WINDOWS-1252 --output=/tmp/$FILENAME $6
# Ez nem működik. Üres PDF a kimenet.
cat - | iconv -s -c --from-code=CSPC850MULTILINGUAL --to-code=WINDOWS-1252 $6
exec <$6
fi
Az is egy lehetséges megoldás lehetne, ha a MIME típus alapján hívódna meg a filter, sőt még jobb is lenne, hiszen csak akkor hívódna meg, ha ténylegesen tartalmazza a nyomtatás az elfuserált ékezetes betűket, de ott is egy működő filter kellene. Ötletek? Köszönöm előre is a segítséget!
Hozzászólások
Az iconv alapból stdin-ről stdout-ra dolgozik. Minek a cat? És minek az exec?
A példa programban volt. Értelmét én sem látom, de így volt közzétéve. Az sem világos, hogy az összes alprogram $1, $2, $3, $4, $5, $6 paraméterrel hívódik meg, ahol az $6 (az argv[6]) a forrás txt path-ja, de a gs meghívásakor már a gs összes paramétere van benne.
...de gyorsan kipróbáltam így is:
az eredmény ugyanúgy üres pdf
Nem néztem meg a paraméterezést, de ha a $6-ban van a fájlnév, akkor nem stdin-ről kell olvasni, nem?
A fentiek alapján a $6 opcionális. Ha filterként fut, akkor gondolom nincs $6, hanem stdin-ről jön az áldás... akkor viszont az if ágad nem fut le.
Erre gondolok:
Ezt már ugyan korábban próbáltam, de most újra lefuttattam, az eredmény ugyanúgy üres pdf.
Korábban azt is próbáltam, hogy felülírjam az eredeti kimeneti file-t, a konvertálttal, de azt meg nem engedi írni.
Szerintem utólag már nem lehet egy pdf kódolását megváltoztatni. Azt a pdf létrehozása előtt kéne.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
Bocs, nem vettem észre a beírásod. Ez egy filter, ami még a pfd generálása előtt lefut, gyakorlatilag elsőként, és így lehet vele módosítani a tartalmat, vagy a kódolást.
Ettől még nem biztosan működik, mert sokszor a nyomtatóra kimenő adathalmaz sem csak plain text, hanem sokszor valami másik, bináris, félbináris formátum, és azokhoz szintén nem lehet már iconv-val hozzányúlni.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
Bocs, elfelejtettem írni rá. Ezzel sem működik. :-(
Nem tudom, korábban miért hozott hibát.
Most ezzel így működik!!!
Mondjuk azt most se értem, hogy az iconv miért nem az STDIN-ről veszi az adatokat, de bánja a fene, ha végül jó :-)
Akkor örülünk Vincent? :)
Lehet hogy közben volt egy cups restart?
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com
Egy?!?!?! Legalább 1000! :-) ...de igen, lehet, hogy az akkor pont kimaradt. Szombattól harcoltam vele...
A PDF bináris fájlformátum, először valami szövegessé kellene alakítani. (PostScript?)
A filter programok lényege pont az, hogy még a tényleges nyomtatás előtt lefut(nak), vagyis itt még csak szöveges állományról beszélünk. Ezeknek a futtatása után hívódna meg a gs a generált paraméterekkel.
Újra nekifutottam, de minden próbálkozás vakvágány.
A kapott paraméterek:
Ahhoz képest, hogy az argv[3] azt mondja, hogy STDIN, sem a cat - > /tmp/from_std sem a cat > /tmp/from_std nem ad semmilyen kimenetet. Az iconv ugyanúgy semmit nem olvas az STDIN-ről, tehát ez az út nem járható, marad a argv[6] file. A megadott forrás file konvertálása sikeres, de ezzel nem lehet felülírni a forrás file-t, mert az acces denied, pedig valahogy tudatni kéne a következő lépésben lefutó gs-sel, hogy ne az eredeti forrást használja, hanem a konvertáltat. Ha záró lépésként a cat-tal kiküldöm az STDOUT-ra a konvertált file tartalmát, arról sem vesz tudomást a gs. Egyenlőre kifogytam az ötletekből...
PDF generálás előtti iconv használat?
Nálam a probléma pont fordítva van/volt. UTF8 a bemenet és Latin2 a kimenet, mert azt kezelte jól a htmldoc. (Ezt elég rég csináltam, lehet ma már az UTF8 nem gond neki és felesleges az iconv használat).
Esetleg kelet-európai módon?
Nem a konvertálással van a baj, hanem a feldolgozás következő lépéseként meghívott ghostscript, ami a tényleges pdf generálást végezné, nem kap adatot. ...de már annyiféle verziót kipróbáltam, hogy már kezdek belezavarodni... Elvileg az stdin-stdout adatokat kellene kiírni, de valamit rosszul csinálok. Akár mivel küldöm ki az STDOUT-ra a módosított file-t, üres pdf az eredmény.
Nem volna rossz, ha a programod elmentené az inputfájlt későbbi elemzésre, hogy pl.:
Meg talán az output is:
Mindkettő megvan. Sima szöveges file-k, semmi extra nincs benne. A kiindulási adatok megtalálhatók a /var/spool/cups/aktuális_file alatt, ez a rosszul kódolt, a /tmp/ alatt pedig a konvertált file. Ha kiveszem a filtert, akkor a kapott pdf olvashatatlan: "K‚rjk, az tutal sokat a fenti, Łj sz mlasz mra teljesˇteni szˇveskedjenek!"
A /tmp alatti file-ok jók: "Kérjük, az átutalásokat a fenti, új számlaszámra teljesíteni szíveskedjenek!"
Az error logban semmi nincs. Ha szándékosan beleteszek valami hibát, amin elhasal a bash, akkor láthatóvá válnak a paraméterek, amit fent is bemásoltam, de semmi más használható információ.
Akkor most nézd meg [strace, ha nincs más], hogy a derék cups hogyan (feltehetőleg egy külső program meghíváséval) állítja elő a PDF-et, és azt próbáld ki saját kezűleg parancssorból.
Figyelj már. Konvertáld már inkább UTF-8-ra azokat a fájlokat. Szerintem.
Szia. Az is megvolt. Nincs változás. Már nem tudnám összeszámolni, hány féle beállítást, program-verziót kipróbáltam. A mintaként használt nyomtatandó számla minden sorát már fejből tudom... (először a képernyőn jelenik meg... már beégett a retinámba :-) )
Egyébként fizikai nyomtatásról van itt szó, vagy csak egy rtf to pdf konverzióról? (Persze a rtf csak egy találgatás a részemről.)
Azzal kezdődik a beírás... :-) pdf nyomtató, virtuális. Viszont mindent lehet vele nyomtatni, nem csak rich-text-et.