(09. Mai 2007 — tk)

InDesign CS3 und Druckjobs mit Umlauten

Das gerade erschienene InDesign 5.0.0 (CS3) zeigt sich recht kreativ im PostScript-Workflow bei der Verwendung von Umlauten oder sonstigen Sonderzeichen im Dateinamen. Anstatt daß der Name sauber innerhalb der PostScript-Datei im sogenannten »%%Title«-Kommentar kodiert würde, erzeugt InDesign 5.0.0 einen seltsamen hexadezimal kodierten UTF-8-String. Aus dem Dateinamen »IDCS3-Täst.indd« bspw. erzeugt InDesign den DSC-Kommentar:

%%Title: FEFF00490044004300530033002D00540061030800730074002E0069006E0064006400005F7800240018007900620000000043382D65000000000000000000000000«

Heißt die Datei dagegen »IDCS3-Test.indd« so lautet auch der Kommentar korrekterweise »%%Title: IDCS3-Test.indd« und wird auch von Weiterverarbeitungs-Mechanismen (bspw. Druckserver, Distiller) korrekt verarbeitet.

Adobe scheint das Phänomen aktuell noch nicht mal besonders aufregend zu finden sondern verweist darauf, daß das Ganze genau so geplant sei — vielleicht weil sich das ein amerikanischer Entwickler, der sich mit Umlauten, Accents, etc. allenfalls im Fremdsprachenunterricht herumschlagen mußte, gar nicht vorstellen kann,
daß dem Rest der Welt mit »US-ASCII« alleine nicht wirklich geholfen ist.

Solange Adobe keinen Fix bereitstellt, hilft ein wenig Perl-Code, der die garstige Zeile innerhalb des PostScript-Datenstroms wieder bändigt und in nicht-kodierte UTF-8-Zeichen umwandelt. Im Folgenden ein kleiner CUPS-Filter, der das Ganze transparent innerhalb des MacOS X’ Drucksystems erledigen kann nebst einer Regel-Datei, die dafür sorgt, daß Dateien vom Typ »application/postscript« (simple PostScript-Dateien) entsprechend gefiltert bzw. repariert werden. Ein praktischer Installer erledigt die Installation von beidem im System (Uninstaller ist mit im Paket und wird auf den Schreibtisch gelegt). Der Code von beiden Dateischnipseln sieht so aus:

CUPS-Regel-Datei (/etc/cups/fixidcs3jobtitle.convs):

application/postscript   application/vnd.cups-postscript                20     fixidcs3jobtitle

Der CUPS-Filter, der die Reparatur der %%Title-Zeile übernimmt (/usr/libexec/cups/filter/fixidcs3jobtitle):

#!/bin/bash
#
# Usage:     fixidcs3jobtitle job user title copies options [filename]
#
# Main use:  CUPS filter to fix InDesign 5.0.0 (ID CS3) job titles in 
#            PostScript print jobs containing special characters, eg. umlauts.
#            Tested with CUPS 1.1.23
#
#############################################################################
#
# author:    Thomas Kaiser <mailto:Thomas.Kaiser@phg-online.de>
# url:       http://kaiser-edv.de/en/CUPS/fixidcs3jobtitle-filter
# license:   http://www.opensource.org/licenses/bsd-license.php
# date:      1 May 2007 (v0.1.1)
# kudos to:  Axel Rose for the Perl code below (hacked together in his limited 
#            spare time)
#
#############################################################################
#
# Changes
#
# 0.1.1: - fixed version which transparently handles the PS code passed through
#
# 0.1.0: - first official release (30 Apr 2007)
#
#############################################################################
#
# Non-Warranty: 
# This script comes with absolutely no warranty.
#
# Use at your own risk!
#
#############################################################################

case $# in
	5)
		# print job is on stdin
		echo "DEBUG: filter postscript stream originating from stdin" >&2
		cat | perl -CO -ne 'if(/^%%Title: ]+)>?$/){$m=$1;if($m!~/^FEFF/){print}else{while($m=~/(.{4})/g){$s=$1;next if$s eq"FEFF";last if$s eq"0000";$t.=pack("U*",hex($s));}print"%%Title: $t\n";}}else{print}' | /usr/libexec/cups/filter/pstops "$1" "$2" "$3" "$4" "$5"
		;;
	6)
		# print job is $6
		echo "DEBUG: filter postscript stream originating from \"$6\"" >&2
		cat "$6" | perl -CO -ne 'if(/^%%Title: ]+)>?$/){$m=$1;if($m!~/^FEFF/){print}else{while($m=~/(.{4})/g){$s=$1;next if$s eq"FEFF";last if$s eq"0000";$t.=pack("U*",hex($s));}print"%%Title: $t\n";}}else{print}' | /usr/libexec/cups/filter/pstops "$1" "$2" "$3" "$4" "$5"
		;;
	*)
		echo "ERROR: $(basename "$0") job user title copies options [filename]" >&2
		;;
esac