Newsgroup: it.comp.lang.perl
Titolo: Stampa

come?..
non mi è mai capitato di leggere nulla al riguardo...
Si puo' stampare con Active Perl ?
Grazie

 Si puo' stampare con Active Perl ?
Win32::API !!! Con le API di windows fai tutto! :)
Uno script lo trovi qui:
http://archive.develooper.com/begi...@perl.org/msg17947.html
Se vuoi stampare da Word c'č Win32::OLE :
http://aspn.activestate.com//ASPN/Reference/Products/ActivePerl/faq/Windows/ActivePerl-Winfaq12.html#print_word
Poi ci sono i moduli
printer
lineprinter
net-printer
che puoi trovare facendo un
search printer
da ppm
Un ottimo libro Win32 & Perl č
Win32 Perl Programming di Dave Roth (New Riders)
-- 
$_=q,6;-16;-1;-8;0;7;-13;-12;-9;-3;13#4A75737420616E6F74686572,,($_,$b)=
split?#?;@b=split?;?;map{$c.=$_,$d.=chr$b[$e++]+ord}split??,pack'H24',$b
;chop$d,print$c.chr(32).$d

li ho provati tutti senza il minimo risultato:-/
qualcuno è riuscito ad usare  "Printer" su Win.?..
Mi dice come lo ha modificato...
io ho provato molte modifiche senza alcun risultato:-(((
grazie
use Printer;
 $prn = new Printer('linux' => 'lp',    'MSWin32' => 'LPT1',      $OSNAME =>
'Printer');
 $prn->print_command('linux' = {'type' => 'pipe',
           'command' => 'lpr -P lp'},
      'MSWin32' = {'type' => 'command',
     'command' => 'gswin32c -sDEVICE=mswinpr2    -dNOPAUSE -dBATCH
$spoolfile'}
      );
 %available_printers = $prn->list_printers;
 $prn->use_default;
 $prn->print($data);

 qualcuno è riuscito ad usare  "Printer" su Win.?..
In effetti, il modulo scaricato con ppm ha dei buchi...
C'è una versione (0.95b) su CPAN con i bugfix.
Basta scaricarla e mettere il modulo Printer.pm
in C:\Perl\site\lib
Ma in sostanza, il modulo fa questo:
############
# codice ispirato a Printer.pm di Stephen Patterson
$|=1;
my $i=0;
while (-e "$ENV{TEMP}\\printer-$i") { ++$i; }
my $spoolfile =  "$ENV{TEMP}\\printer-$i";
my $dato="Stringa da stampare";
$dato.="\f";
open SPOOL, ">$spoolfile";
print SPOOL $dato;
close SPOOL;
system("copy /B $spoolfile LPT1:");
unlink $spoolfile;
############
sul mio w98 in effetti stampa correttamente una pagina e fa un 
form feed.
E' in effetti un workaround... bisognerebbe indagare per bene 
Win32::API ed esprimere correttamente la chiamata alla API
di sistema...


 di sistema...
altro modo è il semplice:
open( LPT, "+>LPT1" ) or die "Can't access printer: $!";
print LPT "Text to print\n\f";
close (LPT);
inoltre ci sono dei thread di comp.lang.perl.misc (da google)
sull'utilizzo di Win32::API che vanno indagati!
http://groups.google.com/groups?hl=it&ie=ISO-8859-1&oe=ISO-8859-1&frame=right&th=a46cdabcf78a4ea5&seekm=38ceb2b2.2455092%40news.skynet.be#s
http://groups.google.com/groups?hl=it&ie=ISO-8859-1&oe=ISO-8859-1&frame=right&th=292f1be403ed0772&seekm=56568be5.0108140529.259a7692%40posting.google.com#s


 close (LPT);
non va manco questo!... accede su LPT2 (dove ho la stapante)
ma non stampa nulla.. nessun errore.. niente! .-/

 ma non stampa nulla.. nessun errore.. niente! .-/
entrambi gli script:
############
# codice ispirato a Printer.pm di Stephen Patterson
$|=1;
my $i=0;
while (-e "$ENV{TEMP}\\printer-$i") { ++$i; }
my $spoolfile =  "$ENV{TEMP}\\printer-$i";
my $dato="Stringa da stampare";
$dato.="\f";
open SPOOL, ">$spoolfile";
print SPOOL $dato;
close SPOOL;
system("copy /B $spoolfile LPT1:");
unlink $spoolfile;
############
e
###########
#da 
http://users.telerama.com/~ghia/perl.html
open( LPT, "+>LPT1" ) or die "Can't access printer: $!";
print LPT "Text to print\n\f";
close (LPT);
###########
a me *stampano corretamente*!
Anche il seguente, (che usa la Dialog per chiedere QUALE stampante 
usare) a me funziona.
#! perl -w
use strict;
use Win32::API;
&print("pippo");
sub print {
    #sub adatatta (quasi nulla) da codice di Mike Solomon
    #vedere anche articolo (Article ID: Q154078) su MSDN
    my $testo=$_[0];
    my $PrintDialog =  new Win32::API('comdlg32', 'PrintDlg', ['P'],
'N');
    my $GlobalLock = new Win32::API('kernel32', 'GlobalLock', ['N'],
'N');
    my $GlobalFree =  new Win32::API('kernel32', 'GlobalFree', ['N'],
'N');
    my $OpenPrinter = new Win32::API('winspool.drv', 'OpenPrinter',
['P','P','P'], 'N');
    my $StartDocPrinter = new Win32::API('winspool.drv',
'StartDocPrinter', ['N','N','P'], 'N');
    my $StartPagePrinter = new Win32::API('winspool.drv',
'StartPagePrinter', ['N'], 'N');
    my $WritePrinter =     new Win32::API('winspool.drv',
'WritePrinter',  ['N','P','N','P'], 'N');
    my $EndPagePrinter =   new Win32::API('winspool.drv',
'EndPagePrinter',  ['N'], 'N');
    my $EndDocPrinter =    new Win32::API('winspool.drv',
'EndDocPrinter', ['N'],  'N');
    my $ClosePrinter =     new Win32::API('winspool.drv',
'ClosePrinter', ['N'],  'N');
    my $GetLastError =     new Win32::API('kernel32', 'GetLastError',
[],  'N');
    my $FormatMessage = new Win32::API('kernel32',
'FormatMessage',['N','P','N','N','P','N','P'], 'N');
    my $pd = pack("Lx16Lx42", 66, 0x10010C);
    unless ($PrintDialog->Call($pd)) {
            return 0;
    }
    my ($devmode) = unpack("x8L", $pd);
    # devmode is a handle to movable global memory
    my $handle = $devmode;
    # get actual memory pointer
    unless ($devmode = $GlobalLock->Call($handle))
{ShowError('GlobalLock')};
    # get perl to use long integer as a pointer
    $devmode = unpack('P156', pack('L', $devmode));
    # release the global memory
    unless ($GlobalFree->Call($handle) == 0) {ShowError('GlobalFree')};
    # these strings are blank padded
    my ($devicename) = unpack('A32', $devmode);
    $devicename .= "\0";
    my $hprinter = pack('x4');
    # RAW mode
    my $datatype = "RAW\0";
    # devmode not passed in pdefaults
    # user selected paper/orientation/duplex have no effect in RAW mode
    # defaults set at printer will be used
    my $pdefaults = pack('px4L', $datatype, 0x8); # PRINTER_ACCESS_USE
    $OpenPrinter->Call($devicename, $hprinter, $pdefaults) or
ShowError('OpenPrinter');
    $hprinter = unpack('L', $hprinter);
 
    # name of document in print manager display
    # this won't be there very long unless the printer is off or busy
with another job
    my $docname = "Win32::API print test\0";
    my $docinfo = pack("px12", $docname);
    $StartDocPrinter->Call($hprinter, 1, $docinfo) or
ShowError('StartDocPrinter');
    $StartPagePrinter->Call($hprinter) or ShowError('StartPagePrinter');
 
    my $written = pack('x4');
    $testo .= "\f";
    my $len = length $testo;
    $WritePrinter->Call($hprinter, $testo, $len, $written) or
ShowError('WritePrinter');
    # one canvas per sheet, next postscript would start new sheet
    $EndPagePrinter->Call($hprinter) or ShowError('EndPagePrinter');
    $EndDocPrinter->Call($hprinter) or ShowError('EndDocPrinter');
    $ClosePrinter->Call($hprinter);


 ma non stampa nulla.. nessun errore.. niente! .-/
ma che win32 usi?
Potresti usare anche una cosa del genere:
system("notepad.exe /p \"nomefile.txt\"");
o se hai Win ME (NT4+ ?)
system("print [/D:device] [[drive:][path]filename[...]]");
naturalmente il comando va scritto con le giuste sostituzioni
(tutte info ricavate da 
groups.google.com
)


 naturalmente il comando va scritto con le giuste sostituzioni
grazie
 (tutte info ricavate da 
groups.google.com
)
in genere lo uso anch'io... ma stavolta ho passato il tempo a provare (senza
successo)  gli esempi trovati nella documentazione..
ciao

 98 ultimo aggirnatissimo...
Anche io ho testato su win98 e TUTTI i 4 metodi che ti ho elencato
precedentemente funzionano!
Li hai provati tutti e nessuno funziona???
Nemmeno questo (il 5o):
$file="pippo.txt";
print `type $file > lpt1:`;
print `echo "\f" > lpt1:`;
???
(nel tuo caso ovviamente sostituisci lpt1 con lpt2)
Se nessuno dei 5 metodi ti funziona, penso che le cause siano
indipendenti da Perl ...
... ma neanche da prompt di dos:
type nomefile.txt > lpt2:
o
notepad.exe /p nomefile.txt
??
Se non ti vanno da linea di comando, allora il Perl non c'entra niente!
Altrimenti... mistero!


 system("notepad.exe /p \"nomefile.txt\"");
porcacc.. funziona!!!! :-)
non sapevo con Win ci fosse questa possibilita'
GRAZIE!!!

 indipendenti da Perl ...
penso anche io.. ho provato anche a modificare le impostazioni
della stampante ma nulla... nel caso riportato qui sopra dice:
"Errore durante la creazione del file"
... trova la stampante (se meto lpt1 da errore)
Mah! :-/