Computer & Technik

Betriebssysteme

DOS

ASCII-Dateien mit PostScript drucken

Wer einen PostScript-Drucker sein eigen nennt, kennt das Problem: Das Gerät druckt wunderschöne Schriften und Grafiken, aber bei einer normalen ASCII-Datei muß der Drucker passen. Dafür sind gleich zwei Gründe verantwortlich:

1. PostScript-Drucker benötigen PostScript-Befehle zum Drucken
2. PostScript-Drucker verwenden eine eigene Zeichensatzcodierung

Drucken unter PostScript
PostScript ist eine Programmiersprache speziell zum Beschreiben von Druckseiten. Folglich benötigt ein PostScript-Drucker keine ASCII-Datei, sondern eine Reihe von PostScript-Befehlen, damit etwas gedruckt wird. Jede einzelne Zeile muß ähnlich wie im Grafikmodus des PC auf der Druckseite plaziert werden. Darüber hinaus muß das Ausgabeprogramm den Seitenumbruch selbst steuern, da die einzelnen Elemente in beliebiger Reihenfolge auf der Seite plaziert werden können, so daß nur der ausgebende Prozess weiß, wann das Seitenende erreicht ist.

PostScript-Zeichensatz
Der unter PostScript übliche Zeichensatz verwendet eine andere Codierung als der üblicherweise unter DOS verwendete erweiterte IBM-Zeichensatz. Während die unteren 128 Zeichen noch miteinander identisch sind, stimmt in der oberen Hälfte fast gar nichts mehr überein. Darüberhinaus existieren eine Reihe von Zeichen in normalen PostScript-Fonts überhaupt nicht. Dazu zählen insbesondere die Blockgrafikzeichen, die in PostScript-Font nicht enthalten sind. Soll eine Datei mit diesen Zeichen ausgedruckt werden, muß man entweder einen speziellen Zeichensatz verwenden oder diese Zeichen simulieren.

Font PSFont
Das Programm PC2PS verwedent quasi beide Methoden, indem alle gemäß PostScript-Standard fehlenden Zeichen in einem separaten Zeichensatz nachempfunden werden. Diese Definitionen befinden sich in der Datei PSFONT.DAT. Diese Datei definiert einen PostScript-Zeichensatz und besteht aus reinen PostScript-Befehlen, die zu erläutern hier zuweit vom Thema abführen würde. Nehmen wir den Font kommentarlos als gegeben hin.

Programm PC2PS
Das Programm PC2PS druckt eine ASCII-DAtei mit vollem erweiterten IBM-Zeichensatz auf einem PostScript-Drucker aus. Obwohl das Programm ein sich abgeschlossenes Modul darstellt, kann es leicht in andere Software-Projekte integriert werden, indem die Quelle für die Eingabe der Textzeilen umgeleitet wird. Die übrigen Schritte bleiben gleich.

Drucker initialisieren
Als erstes muß der PostScript-Drucker initialisiert werden. Dies erfolgt in drei Schritten:

1. Modul-Ende-Zeichen CHR(4) senden
2. Selbstdefinierten Font PSFont zeilenweise an Drucker senden
3. Weitere Druckoptionen setzen

Zu den Druckoptionen zählen hier die Programmoptionen, für die zwar Defaultwerte vorgegeben sind, die jedoch auch als Parameter an die Funktion Init() übergeben werden:

- Rotation der Grundlinie
- Zeichengröße
- Linker Rand
- Linker Rand auf ungeraden Seiten
- Oberer Rand
- Anzahl der Zeichen pro Zeile
- Anzahl der Zeilen pro Seite

void init(fontsize, opageoffset, epageoffset, topmargin, linepitch, rotation, fontname, spacing)
double    fontsize,
     opageoffset,
     epageoffset,
     topmargin,
     linepitch,
     spacing,
     rotation;
char *fontname;
{
        register char     **p;

     fprintf(ostr, "\004\n");    /* ENDE-Zeichen für PostScript */

     p = initPCfont;
     while(*p)       /* PCfont an Ausgabegerät senden */
          fprintf(ostr, "%s\n", *p++);
     fprintf(ostr, "\004\n");

     p = inittab;
     while(*p)
          fprintf(ostr, "%s\n", *p++);

     fprintf(ostr, "/%s findfont %.1f scalefont setfont\n",
          fontname, fontsize);
     fprintf(ostr, "/linepitch %.1f def\n", -linepitch);
     fprintf(ostr, "/spacing %.1f def\n", spacing);
     fprintf(ostr, "/coffset %.1f def\n", opageoffset + 4);
     fprintf(ostr, "/noffset %.1f def\n", epageoffset + 4);

     /* falls gewünscht, Rotation ausführen */
     if(rotation != 0.0)
          fprintf(ostr, "%.1f rotate\n", rotation);

     /* Aktuelle Seitengröße holen */
     fprintf(ostr, "clippath pathbbox\n");

     /* Y-Koordinate oben rechts speichern */
     fprintf(ostr, "/pgtop exch def\n");

     /* Y-Koordinate links unten speichern und Ursprung dorthin legen */
     fprintf(ostr, "pop /y exch def y translate\n");

        /* Seitenoberrand ermitteln und setzen */
     fprintf(ostr, "/pgtop pgtop y sub %.1f sub linepitch add def\n",
                topmargin);

        /* horizontalen Offset setzen */
     fprintf(ostr, "coffset 0 translate\n");

        /* an Seitenanfang gehen */
     fprintf(ostr, "newpath 0 pgtop moveto\n");
}

Datei drucken
Die eigentliche Druckausgabe erfolgt dann über die Funktion process() der lediglich ein Dateihandle übergeben wird. Aus dieser Datei liest die Funktion Zeichen, bis das Ende des Stroms erreicht ist. Durch Austauschen dieser Eingabequelle kann die Funktion in eigene Programme integriert werden, um beispielsweise Listen auszudrucken.

void process(FILE *istr)
{
     register char   ch;
     register int    x, linenum;

        linenum = 1;
     x = 0;
     putc('(', ostr);
     while((ch=(char)getc(istr)) != EOF && ch != '\x1A')
     {

          if(ch == '\t')
          {
                int  n = x + tabsize - (x % tabsize);

                while(x < n) {
                          pch(' ');
                          x++;
                     }
          }
          else if(ch == '\n')
          {
                fprintf(ostr, ") n\n");
                linenum = linenum + 1;
                if (linenum > linesperpage) {
                     fprintf(ostr,"p\n");
                     linenum = 1;
                }
                x = 0;
                putc('(', ostr);
          }
          else if(ch == '\r')
          {
                fprintf(ostr, ") r\n");
                x = 0;
                putc('(', ostr);
          }
          else if(ch == NEW_PAGE)
          {
                fprintf(ostr, ") n p\n");
                linenum = 1;
                x = 0;
                putc('(', ostr);
          }
          else
          {
                if (x >= charsperline) {
                     fprintf(ostr, ") n\n");
                     linenum = linenum + 1;
                     if (linenum > linesperpage) {
                          fprintf(ostr,"p\n");
                          linenum = 1;
                     }
                     x = 0;
                     putc('(', ostr);
                }
                pch(ch);
                x++;
          }
     }
     fprintf(ostr, ") n p\n\f");
}

void pch(ch)
int  ch;
{
     if(ch < ' ' || ch > '~')
          fprintf(ostr, "\\%3.3o", (unsigned char)ch);
     else
     {
          if(ch == '(' || ch == ')' || ch == '\\')
                putc('\\', ostr);
          putc(ch, ostr);
     }
}





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 01:07:35 von textarchiv.alojado.de