*BSD News Article 21921


Return to BSD News archive

Xref: sserve comp.os.386bsd.misc:1154 comp.os.linux.misc:2343 comp.lang.perl:18570
Path: sserve!newshost.anu.edu.au!munnari.oz.au!constellation!osuunx.ucc.okstate.edu!moe.ksu.ksu.edu!crcnis1.unl.edu!wupost!howland.reston.ans.net!math.ohio-state.edu!cs.utexas.edu!geraldo.cc.utexas.edu!sylvester.cc.utexas.edu!not-for-mail
From: vax@sylvester.cc.utexas.edu (Vax)
Newsgroups: comp.os.386bsd.misc,comp.os.linux.misc,comp.lang.perl
Subject: sqprint, a multi-page filter for HP Laserjets
Date: 5 Oct 1993 19:48:47 -0500
Organization: The University of Texas - Austin
Lines: 228
Message-ID: <28t4lf$1aa@sylvester.cc.utexas.edu>
NNTP-Posting-Host: sylvester.cc.utexas.edu
Keywords: PERL PCL LJ

The following PERL script was written to print multiple pages in landscape
mode on a Hewlett-Packard Laserjet Series printer (PCL-lang only).
I conducted a search for other programs which would do this, but the search
was fruitless.  I hope the general community finds this program useful.

To use this program, you must install it in your printcap file.  I put mine
in the "cf" entry, for example, in my BSD-based system:

lp|local line printer:\
	:lp=/dev/lpa0:sd=/var/spool/lpd:lf=/var/log/lpd-errs:sh:\
	:if=/usr/foreign/bin/if_ljet3:\
	:cf=/usr/foreign/bin/sqprint:

The cf entry stands for "cif filter", or something like that.  Since I don't
have cif on my machine, I used the empty printcap slot for my filter.
However, if you install sqprint as a filter on your machine, be warned that
users who attempt to print cif files, or whatever filter you used, will have
quite a surprise in store for them.

To print on my system, I use:
	lpr -c inputfilename

The "-c" tells lpd to print the file using the cif output filter.

Unfortunately, very few useful arguments (such as input filename, etc) are
passed to any filters except "if" or "of", both of which you will probably
not want to override.  If you do override the "if" or "of" filters, you will
have to change the print_footer routine at the end of the file.

There is no guarantee of support from me, although I will probably continue
to add features as I find them useful.  I never intend to make a MS-DOS port.

I will not answer any mail regarding "how to install this program" or
"the program won't work with my HP calculator, what is wrong?".  If you have
problems, you will have to resolve them yourself.

Check you printcap and lpr manpages for more info.

Mail kudos, remarks, subpoenas to vax@ccwf.cc.utexas.edu.

----------If you cut here you will damage your monitor------8<-----------------
#!/usr/bin/perl
# sqprint v1.0
# Written by vax@ccwf.cc.utexas.edu (VaX#n8) October 4th, 1993
# This program may not be used in any commercial product without written
# permission of the author.
# This program is freely redistributable (with the exception noted above)
# as long as this header remains with the file.

$line=-1;
$col=-1;
while (<STDIN>)
{
	chop;
	$temp = $_;
	while (($l = length($temp)) > 0)
	{
		$_ = substr($temp,0,($l < 80) ? $l : 80);
		$temp = substr($temp,length($_));
		$line = ($line + 1) % 65;
		if ($line == 0)
		{
			if ($col == 1)
			{
				# send form feed (FF)
				print "\x0C";
			}
			$col = ($col + 1) % 2;
			if ($col == 0)
			{
				&setup_page;
			}
			else
			{
				print "\x1B&k7.2029H";
				print "\x1B&a91lhV";
				print "\n";
			}
			&setup_font_stuff;
			&setup_column;
		}
		print ;
		print "\n";
	}
}

# send form feed (FF)
print "\x0C";

# reset printer
print "\x1BE";


sub setup_font_stuff
{
	
	# set font type to PC8
	print "\x1B(10U";
	
	# set default [non]proportional font (?)
	# 16.6 CPI pitch
	# 8.5 point vertical
	# set default upright/italic
	# set default stroke weight
	# set default typeface
	print "\x1B(sp16.6h8.5vsbT";
}

sub draw_box
{
	# horizonal move to 155 decipoints
	# vertical move to 452 decipoints
	print "\x1B&a155h452V";
	
	# create a graphic element 7325 horizontal decipoints
	# create a graphic element 1 vertical decipoint
	# draw
	print "\x1B*c7325h1vP";
	
	# horizontal move to 155 decipoints
	# vertical move to 5652 decipoints
	print "\x1B&a155h5652V";
	
	# same as two above
	print "\x1B*c7325h1vP";
	
	# move to (155,452)
	print "\x1B&a155h452V";
	
	# make a vertical line 5200 decipoints high, 1 wide 
	print "\x1B*c1h5200vP";
	
	# move to (3830,452)
	print "\x1B&a3830h452V";
	
	# same as two above
	print "\x1B*c1h5200vP";
	
	# move to (7480,452)
	print "\x1B&a7480h452V";
	
	# make another line 1 wide, 5200 high
	print "\x1B*c1h5200vP";
	
	# move to (7524,5352)
	print "\x1B&a7524h5352V";
}

sub setup_page
{
	# reset printer
	print "\x1BE";
	
	# print in landscape mode
	print "\x1B&l1O";

	&setup_font_stuff;
	
	# set column width (HMI) to 7.2/120ths of an inch
	print "\x1B&k7.2H";
		
	# set VMI to 5.2/42ths of an inch
	# set default perforation skip
	print "\x1B&l5.2cL";
	
	# set default number of lines in top margin
	print "\x1B&lE";
		
	# set default left margin
	print "\x1B&aL";
	
	&draw_box;

	&setup_font_stuff;
	
	# set HMI to 7.2029/120ths of an inch
	print "\x1B&k7.2029H";
	
	# set VMI to 15.2/42ths of an inch
	# set default perforation skip
	print "\x1B&l5.2cL";
	
	# set line termination to cr->cr; lf->cr+lf; ff->cr+ff
	print "\x1B&k2G";

	&print_footer;

	# horizontal move -5 decipoints,
	# vertical move +3 decipoints
	print "\x1B&a-5h+3V";
	
	# Set top margin 7 lines
	print "\x1B&l7E";
	
	print "\x1B&a6lhV";
	print "\n";
	
}

sub setup_column
{
	# set column width (HMI) to 7.2/120ths of an inch
	print "\x1B&k7.2H";
	
	# set VMI to 05.200/42ths of an inch
	print "\x1B&l05.200C";
}

sub print_footer
{
	# args are of form  -xwidth -ylength -n login -h hostname acct-file

	# move to (155,5652) decipoints
	print "\x1B&a155h5652V";

	print "\n";

	# 172 or more spaces for footer
	print "    login: $ARGV[3]\thostname: $ARGV[5]\n";
	
	print "\x1B&a+5h-3V";
	
	# an emply line that's left open for later stuff
	print "\n";
}
-- 
Protect our endangered bandwidth - reply by email.  NO BIG SIGS!
VaX#n8 vax@ccwf.cc.utexas.edu - Don't blame me if the finger daemon is down