(17. Februar 2005 – tk}

Einfügen von »setpagedevice« Kommandos

Ab und zu steht man vor der Herausforderung, zwar an und für sich ADSC –konforme PostScript-Dateien noch mit zusätzlichen Befehlen für den PostScript Interpreter versehen zu müssen. Ein solches Beispiel ist das Festsetzen eines anderen Papierformats als »US Letter« wenn Apples »PSNormalizer Framework« benutzt wird (es sieht so aus, als ob Apple in MacOS X 10.3 keine Möglichkeit vorgesehen hat , das Standard-Papierformat für PDFs benutzerfreundlich einzustellen).

Zu diesem Zweck empfiehlt es sich, einfach den »setpagedevice«-Befehl in ein PPD-Feature zu packen und nach dem PostScript-Prolog in den PS-Stream einzustreuen. Im folgenden Beispiel wird das Papierformat auf DIN A4 gesetzt.

Vorher:

/Times-Roman@0 ENC0/Times-Roman RE
%%EndProlog
%%Page: 1 1
%%BeginPageSetup

Nachher:

/Times-Roman@0 ENC0/Times-Roman RE
%%EndProlog
%%BeginFeature: *PageSize Default
<< /PageSize [ 595 842 ] >> setpagedevice
%%EndFeature
%%Page: 1 1
%%BeginPageSetup

Man könnte aber ebenfalls PDFMarks oder andere PS-Statements (wie bspw. »setdistillerparams« für die Distiller-Parametrisierung ) einfügen. Das Skript daher auch einfach als Denkanstoß verstehen.

Das Skript kann hier heruntergeladen werden. Nachfolgend noch die Source.

#!/bin/sh
# 
# Script that inserts setpagedevice commands into a postscript file. The
# dimensions are read from ${MyXDimension} and ${MyYDimension} respectively.
# Set the values to 592 and 842 to get results in plain DIN A4 format.
#
# The PS files in question have either to be supplied as command line 
# arguments or piped through

MyXDimension=595
MyYDimension=842

Main() {
    if [ $# -eq 0 ]; then
        # we'll read from stdin and write to stdout
        MyPSFile=$(mktemp /tmp/ps-file.XXXXXX) || exit 1
        trap 'rm "${MyPSFile}"' 1 2 15
        cat >"${MyPSFile}"
        ProcessPSFiles "${MyPSFile}"
        if [ $? -eq 0 ]; then
            cat "${MyPSFile}"
        fi
        rm "${MyPSFile}"
    else
        # We process all files supplied as command line arguments
        while [ $# -ne 0 ]; do
            ProcessPSFiles "$1"
            shift
        done
    fi
} # Main

ProcessPSFiles() {
    MyFileType=$(file -b "$1")
    case ${MyFileType} in
        PostScript*)
            InsertPos=$(egrep -n "^%%EndProlog$" "$1" | cut -d: -f 1)
            if [ "X${InsertPos}" = "X" ]; then
                echo "\"$1\": not possible to get ADSC comments. Skipped" >&2
                return 1
            fi
            TmpFile=$(mktemp /tmp/ps-trallala.XXXXXX) || exit 1
            trap 'rm "${TmpFile}"' 1 2 15
            head -n ${InsertPos} "$1" >"${TmpFile}"
            cat >>"${TmpFile}" <<-END-OF-INSERTION
            %%BeginFeature: *PageSize Default
            << /PageSize [ ${MyXDimension} ${MyYDimension} ] >> setpagedevice
            %%EndFeature
            END-OF-INSERTION
            sed 1,${InsertPos}d "$1" >>"${TmpFile}"
            mv "${TmpFile}" "$1"
            ;;
        *)
            echo "\"$1\" is not a PostScript file. Exiting" >&2
            return 1
            ;;
    esac
} # ProcessPSFiles

Main "$@"

Copyright © Thomas Kaiser, 2008 (erstellt 17. Februar 2005 – tk)

Dieser Beitrag kann durch jedermann gemäß den Bestimmungen der Lizenz für die freie Nutzung unveränderter Inhalte genutzt werden. Die Lizenzbedingungen können unter http://www.uvm.nrw.de/opencontent abgerufen oder bei der Geschäftsstelle des Kompetenznetzwerkes Universitätsverbund MultiMedia NRW, Universitätsstraße 11, D-58097 Hagen, schriftlich angefordert werden.