Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Printing in NT

by dree (Monsignor)
on Aug 28, 2002 at 14:34 UTC ( #193470=note: print w/ replies, xml ) Need Help??


in reply to Printing in NT

There are a lot of ways:

1) using system:

system("notepad.exe /p \"filename.txt\"");
Or with Win Me and NT4+ should be also:
system("print [/D:device] [[drive:][path]filename[...]]");
2) Using a method inspired by Printer.pm by Stephen Patterson:
$|=1; my $i=0; while (-e "$ENV{TEMP}\\printer-$i") { ++$i; } my $spoolfile = "$ENV{TEMP}\\printer-$i"; my $data="String to print"; $data.="\f"; open SPOOL, ">$spoolfile"; print SPOOL $data; close SPOOL; system("copy /B $spoolfile LPT1:"); unlink $spoolfile;
3) code from here :
open( LPT, "+>LPT1" ) or die "Can't access printer: $!"; print LPT "Text to print\n\f"; close (LPT);
4) code from Mike Solomon: (see also Article ID: Q154078 on MSDN)
#! perl -w use strict; use Win32::API; &print("foo"); sub print { my $text=$_[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 mod +e # 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'); $text .= "\f"; my $len = length $text; $WritePrinter->Call($hprinter, $text, $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); }
5) also this:
$file="foo.txt"; print `type $file > lpt1:`; print `echo "\f" > lpt1:`;
6) code from Indy Singh:
if (-e "$ENV{'WINDIR'}/System32/mshtml.dll") { $dll = "$ENV{'WINDIR'}/System32/mshtml.dll"; } else { $dll = "$ENV{'WINDIR'}/System/mshtml.dll"; } #note: can't use this to print multiple files system("rundll32.exe $dll,PrintHTML $outfile");


Comment on Re: Printing in NT
Select or Download Code
Replies are listed 'Best First'.
Re: Re: Printing in NT
by Mr. Muskrat (Abbot) on Aug 28, 2002 at 23:00 UTC
    I have had luck with the following two methods:
    # method 1 local printer open(LPT, ">LPT1"); print LPT "$data\f"; close(LPT); # method 2 network printer open(LPT, ">\\printserver\printername"); print LPT "$data\f"; close(LPT);

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://193470]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (9)
As of 2015-07-29 08:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (261 votes), past polls