解决方案是创建一个作为过滤器的包装器脚本。dvips 命令不接受来自 stdin 的输入,所以这个脚本可能需要创建临时文件,在调用 dvips 之前把 stdin 拷贝到临时文件。清单 4 显示了可能的脚本。
清单 4. CUPS DVI 到 PostScript 的过滤器脚本
#!/bin/bash
# CUPS filter to process DVI files using dvips
# Create a sandbox for working if input on stdin
if [ $# -lt 6 ]; then
sandbox=${TMPDIR-/tmp}/cups-dvitops.$$
(umask 077 && mkdir $sandbox) || {
echo "Cannot create temporary directory! Exiting." 1>&2
exit 1
}
fn="$sandbox/cups-dvitops.$$"
cat > "$fn"
else
fn="$6"
fi
# Call dvips quietly, securely and with output to stdout
dvips -R -q -o - "$fn"
# Erase sandbox if we created one
if [ $# -lt 6 ]; then
rm -rf "$sandbox"
fi
回想一下 CUPS 使用 /etc/cups 中的两个文件来确定 MIME 类型和要使用的过滤器。只要重新安装或升级 CUPS,这些文件都会被覆盖。幸运的是,CUPS 在启动或重新启动时,都会读取 所有 扩展名为 .types 或 .convs 的文件。所以应当为新的过滤器创建一对文件,例如 /etc/cups/dvitops.types 和 /etc/cups/dvitops.convs。清单 5 显示了 DVI 过滤器的两个配置文件。
清单5. CUPS dvitops 的配置文件 filter
[ian@attic4 ~]$ cat /etc/cups/dvitops.types
# Local MIME definition for DVI files
application/x-dvi dvi string(0,)
[ian@attic4 ~]$ cat /etc/cups/dvitops.convs
# Local DVI to PostScript filter for CUPS
application/x-dvi application/postscript 50 dvitops
清单 5 说明前两个位置是 16 进制数字 F7 和 02 的文件被识别为 DVI 文件,而且这类文件应当用 dvitops 过滤器处理。