CUPS-PDF karakter kódolás iconv segítségével

Fórumok

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.

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:

if [ -n "$6" ]; then
  iconv -s -c --from-code=CSPC850MULTILINGUAL --to-code=WINDOWS-1252 $6
else
  iconv -s -c --from-code=CSPC850MULTILINGUAL --to-code=WINDOWS-1252
fi

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)

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
  exec < /tmp/$FILENAME
fi

Nem tudom, korábban miért hozott hibát.

Most ezzel így működik!!!

iconv -c --from-code=CSPC850MULTILINGUAL --to-code=UTF-8 --output=$FILENAME $6
exec <"$FILENAME"

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ó :-)

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:

D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[0]="Virtual_PDF"
D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[1]="1526456"
D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[2]="valaki"
D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[3]="(stdin)"
D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[4]="1"
D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[5]="-o cpi=20 finishings=3 fit-to-page number-up=1 job-uuid=urn:uuid:4aad5411-1fd1-3754-671a-a6542e26b281 job-originating-host-name=localhost date-time-at-creation= date-time-at-processin
g= time-at-creation=1649744056 time-at-processing=1649744056"
D [12/Apr/2022:08:14:16 +0200] [Job 1526456] argv[6]="/var/spool/cups/d1526456-001"

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...

Esetleg kelet-európai módon?

if [ -n "$6" ]; then
    iconv -f CP852 -t Windows-1250 "$6"
else
    iconv -f CP852 -t Windows-1250
fi

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.

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‚rjk, 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ó.

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.)