[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 428.   Modifica sistematica di un file PostScript

Un problema abbastanza frequente negli uffici è la creazione di un'immagine da sovrapporre a tutte le stampate, come un marchio, o come una fincatura. Per esempio, al posto di far stampare della carta intestata, si vuole fare in modo che la stampante stampi automaticamente l'intestazione, senza fare la cosa in due passaggi. Questo capitolo cerca di mostrare un metodo pratico per risolvere il problema.

428.1   Modifica del file PostScript

Per aggiungere qualcosa a una stampa si deve intervenire nel file PostScript prima che questo raggiunga la coda di stampa. Inizialmente si può fare qualche esperimento per scoprire in che punto conviene inserire le proprie modifiche.

Osservando un file PostScript generato da un programma comune per la stampa, si dovrebbe individuare facilmente la fine di una pagina cercando l'istruzione showpage:

PDFVars/TermAll get exec end end
userdict /pgsave get restore
showpage
%%PageTrailer
%%EndPage

Normalmente, subito prima di questa istruzione appare anche l'istruzione restore che serve a ripristinare le condizioni normali. Se effettivamente si recuperano tutte le impostazioni predefinite del linguaggio PostScript si può inserire subito prima dell'istruzione showpage qualcosa che si vuole sovrascrivere sulla pagina; per esempio un codice simile a quello seguente:

PDFVars/TermAll get exec end end
userdict /pgsave get restore
save
/cm { 28.346456 mul } def
   0 cm   0   cm moveto
  21 cm  29.7 cm lineto
   0 cm  29.7 cm moveto
  21 cm   0   cm lineto
stroke
restore
showpage
%%PageTrailer
%%EndPage

In questo caso si immagina di avere a disposizione una pagina A4, sulla quale si sovrascrive una «X» con due linee tra gli angoli opposti. Nel prossimo esempio, si intende sovrapporre la scritta «riservato» che appare in modo obliquo sulla pagina:

PDFVars/TermAll get exec end end
userdict /pgsave get restore
save
/cm { 28.346456 mul } def
    55  rotate
    7 cm  0 cm moveto
    /Helvetica findfont 7 cm scalefont setfont
    (riservato)
    0.9 setgray
    show
stroke
restore
showpage
%%PageTrailer
%%EndPage

La figura successiva mostra una pagina con un contenuto senza significato, sulla quale appare la scritta sovrapposta:

Figura 428.4. Esempio di una pagina con la sovrapposizione della scritta «riservato» in primo piano.

riservato

Se invece quello che si vuole è semplicemente di intervenire sullo sfondo della pagina, al posto di inserire il codice immediatamente prima dell'istruzione showpage occorre farlo all'inizio della pagina, precisamente subito dopo l'istruzione speciale %%Page:, per esempio così:

%%Page: 1 10
save
/cm { 28.346456 mul } def
    55 rotate
    7 cm   0   cm moveto
    /Helvetica findfont 7 cm scalefont setfont
    (riservato)
    0.9 setgray
    show
stroke
restore
585 600 bop 1319 39 a Ii(Appunti)37 b(di)d(inf)-5 b(or)t(m)m(atica)35
b(liber)m(a)105 b Ic(2003.01.01)3042 243 y Ii(V)-13 b(olume)71

Nella figura successiva si mostra nuovamente l'esempio di una scritta obliqua che questa volta viene posta sullo sfondo, senza disturbare così la lettura del documento.

Figura 428.6. Esempio di una pagina con la scritta «riservato» sullo sfondo.

riservato

Eventualmente, per evitare sorprese, prima di modificare un file PostScript lo si può rielaborare attraverso ps2ps.

428.2   Due programmi Perl che fanno tutto da soli

Per risolvere il problema della modifica di file PostScript si può realizzare un piccolo programma Perl che legge un file contenente le aggiunte, filtrando un file PostScript:

ps-overwrite.pl file < file_ps_originale > file_ps_sovrascritto
ps-background.pl file < file_ps_originale > file_ps_sovrascritto

Per esempio, se il file aggiunte contiene il codice PostScript da aggiungere, i due comandi seguenti servirebbero per generare il file prova-modificato.ps dal file prova.ps; il primo per aggiungere il codice in primo piano, il secondo per aggiungerlo sullo sfondo:

cat prova.ps | ps-overwrite.pl aggiunte > prova-modificato.ps[Invio]

cat prova.ps | ps-background.pl aggiunte > prova-modificato.ps[Invio]

Ecco il primo programma che dovrebbe essere disponibile presso <allegati/a2/ps-overwrite.pl>:

#!/usr/bin/perl
#
local ($external_postscript_file) = $ARGV[0];
local ($external_postscript_code) = "";
local ($line)                     = "";
#
# Carica dal file esterno il codice da aggiungere.
#
open (PSCODE, "< $external_postscript_file");
while ($line = <PSCODE>)
  {
    $external_postscript_code = $external_postscript_code . $line;
  }    
close (PSCODE);
#
# Legge lo standard input e cerca l'istruzione "showpage" per
# inserire il codice aggiunto.
#
while ($line = <STDIN>)
  {
    if ($line =~ m/^\%/)
      {
        #
        # Si tratta di un commento o di un'istruzione speciale.
        #
        print STDOUT ($line);
      }
    elsif ($line =~ m/^(.*)\bshowpage\b(.*)$/)
      {
        #
        # Si aggiunge il codice.
        #
        print STDOUT ($1);
        print STDOUT ("\n");
        print STDOUT ("save");
        print STDOUT ("\n");
        print STDOUT ("$external_postscript_code");
        print STDOUT ("\n");
        print STDOUT ("restore");
        print STDOUT ("\n");
        print STDOUT ("showpage");
        print STDOUT ("\n");
        print STDOUT ($2);
        print STDOUT ("\n");
      }
    else
      {
        print STDOUT ($line);
      }
  }    

Ecco il secondo programma che dovrebbe essere disponibile presso <allegati/a2/ps-background.pl>:

#!/usr/bin/perl
#
local ($external_postscript_file) = $ARGV[0];
local ($external_postscript_code) = "";
local ($line)                     = "";
#
# Carica dal file esterno il codice da aggiungere.
#
open (PSCODE, "< $external_postscript_file");
while ($line = <PSCODE>)
  {
    $external_postscript_code = $external_postscript_code . $line;
  }    
close (PSCODE);
#
# Legge lo standard input e cerca l'istruzione speciale "%%Page:" per
# inserire il codice aggiunto.
#
while ($line = <STDIN>)
  {
    if ($line =~ m/^\%\%Page\:\s/)
      {
        #
        # Si aggiunge il codice a partire dalla riga successiva.
        #
        print STDOUT ($line);
        #
        print STDOUT ("save");
        print STDOUT ("\n");
        print STDOUT ("$external_postscript_code");
        print STDOUT ("\n");
        print STDOUT ("restore");
        print STDOUT ("\n");
      }
    else
      {
        print STDOUT ($line);
      }
  }    

Si può osservare che il codice aggiunto viene contornato automaticamente dalle istruzioni save e restore per maggior sicurezza.

428.3   Utilizzo pratico di questi programmi

Per fare in modo che tutte le stampe vengano alterate con qualche tipo di informazione, si deve intervenire nella gestione delle code di stampa. Se si dispone di un sistema di stampa BSD o compatibile, si può agire nel file /etc/printcap, aggiungendo delle code differenti per ogni tipo di modifica che si vuole apportare; a ognuna di queste si deve abbinare un filtro differente.

lp|HP Laserjet:\
        :lp=/dev/lp0:\
        :sd=/var/spool/lpd/lp:\
        :af=/var/log/lp-acct:\
        :lf=/var/log/lp-errs:\
        :if=/etc/magicfilter/ljet4-filter:\
        :pl#66:\
        :pw#80:\
        :pc#150:\
        :mx#0:\
        :sh:

L'esempio che si vede sopra fa riferimento a una direttiva della coda di stampa predefinita, a cui si associa il filtro /etc/magicfilter/ljet4-filter. Si tratta precisamente di un programma scritto per Magicfilter (capitolo 205), che contiene in particolare le direttive seguenti:

# PostScript
0       %!      filter  /usr/bin/gs  -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- - 0 \004%! filter /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- -

A questo punto si potrebbero scrivere una serie di file contenenti codice PostScript da aggiungere alle stampe, a seconda delle esigenze. Si suppone di collocare questi file nella directory /etc/ps-modifica/. Si osservi il listato successivo che si riferisce ad altre due code di stampa speciali:

logo|HP Laserjet con sovrascrittura del logo aziendale:\
        :lp=/dev/lp0:\
        :sd=/var/spool/lpd/lp:\
        :af=/var/log/lp-acct:\
        :lf=/var/log/lp-errs:\
        :if=/etc/magicfilter/ljet4-logo-filter:\
        :pl#66:\
        :pw#80:\
        :pc#150:\
        :mx#0:\
        :sh:

fatt|HP Laserjet con sovrascrittura della fincatura delle fatture:\
        :lp=/dev/lp0:\
        :sd=/var/spool/lpd/lp:\
        :af=/var/log/lp-acct:\
        :lf=/var/log/lp-errs:\
        :if=/etc/magicfilter/ljet4-fattura-filter:\
        :pl#66:\
        :pw#80:\
        :pc#150:\
        :mx#0:\
        :sh:

A questo punto si prende il file /etc/magicfilter/ljet4-filter e se ne fanno due copie: rispettivamente /etc/magicfilter/ljet4-logo-filter e /etc/magicfilter/ljet4-fattura-filter. All'interno di questi file si devono modificare le direttive riferite al filtro PostScript; in questo caso si mostra l'uso dello script ps-overwrite, per la sovrapposizione in primo piano, ma l'uso dell'altro script è identico:

# PostScript
0       %!      filter  /usr/bin/ps-overwrite /etc/ps-modifica/logo \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- - 0 \004%! filter /usr/bin/ps-overwrite /etc/ps-modifica/logo \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- -
# PostScript
0       %!      filter  /usr/bin/ps-overwrite /etc/ps-modifica/fattura \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- - 0 \004%! filter /usr/bin/ps-overwrite /etc/ps-modifica/fattura \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- -

Se si vuole aggiungere anche un passaggio con ps2ps:

# PostScript
0       %!      filter  /usr/bin/ps2ps - - \
  \| /usr/bin/ps-overwrite /etc/ps-modifica/logo \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- - 0 \004%! filter /usr/bin/ps2ps - - \
  \| /usr/bin/ps-overwrite /etc/ps-modifica/logo \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- -
# PostScript
0       %!      filter  /usr/bin/ps2ps - - \
  \| /usr/bin/ps-overwrite /etc/ps-modifica/fattura \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- - 0 \004%! filter /usr/bin/ps2ps - - \
  \| /usr/bin/ps-overwrite /etc/ps-modifica/fattura \
  \| /usr/bin/gs -q -dSAFER -dNOPAUSE \
  \-r600 -sDEVICE=ljet4 -sOutputFile=- -

Naturalmente rimangono da preparare i file /etc/ps-modifica/logo e /etc/ps-modifica/fattura con il codice PostScript che si preferisce.

Alla fine, è sufficiente selezionare una coda o l'altra per aggiungere il logo o la fincatura di una fattura:

lpr -Plogo ...[Invio]

lpr -Pfatt ...[Invio]

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome modifica_sistematica_di_un_file_postscript.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!