X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=usr_sbin%2Falignmargins;fp=usr_sbin%2Falignmargins;h=3dcccb2220beafd4b42a4b9943f6754fdbb0f8c7;hb=4eeb254e1e7e63dbbde76d0917ba6e26ba81c13d;hp=0000000000000000000000000000000000000000;hpb=d1c1732fb8fa75c0f4ab15da6f5652b975235ac2;p=grml-scripts.git diff --git a/usr_sbin/alignmargins b/usr_sbin/alignmargins new file mode 100755 index 0000000..3dcccb2 --- /dev/null +++ b/usr_sbin/alignmargins @@ -0,0 +1,275 @@ +#! /usr/bin/perl +# Filename: alignmargins +# Purpose: adjust the margins and the position of the printed contents on the paper +# Authors: (C) 2001 by Till Kamppeter +# Bug-Reports: see http://grml.org/bugs/ +# License: Free software under the terms of the GNU General Public License (GPL) +# Latest change: Son Mär 18 19:31:15 CET 2007 [mika] +################################################################################ +# Downloaded from http://www.linuxprinting.org/download/printing/alignmargins + +$0 =~ m!^(.*)/[^/]+$!; +my $programpath = $1; +my $printcommand = '/usr/bin/lpr -P '; +my $egrep = '/bin/egrep'; +my $cat = '/bin/cat'; +my $cut = '/usr/bin/cut'; +my $head = '/usr/bin/head'; +my $tail = '/usr/bin/tail'; +my $wc = '/usr/bin/wc'; +my $adjustmentpagename = 'align.ps'; +my $adjustmentpagepath = ($programpath ? "${programpath}:" : "") . '.:~:/usr/share/grml-scripts:/usr/share/alignmargins:/usr/local/share/alignmargins:/usr/share:/usr/local/share:/usr/share/printer-testpages:/usr/local/share/printer-testpages:/usr/share/ghostscript/*/lib:/usr/local/share/ghostscript/*/lib'; +my $ppddir = '/etc/cups/ppd'; +my $printerconffile = '/etc/cups/printers.conf'; + +# Find "ælign.ps" + +my $adjustmentpage; +for $path (split(":", $adjustmentpagepath)) { + if (-r "$path/$adjustmentpagename") { + $adjustmentpage = "$path/$adjustmentpagename"; + last; + } +} + +# Are we running as root? + +if (!(-w $printerconffile)) {die "\"alignmargins\" must be run logged in as \"root\"!";} + +# Check whether there are local printer queues + +open NUMBEROFQUEUES, "$cat $printerconffile | $egrep '; +close NUMBEROFQUEUES; + +# Ask the user which printer he wants to align + +print "\n"; +print "CUPS printer margin and offset alignment\n"; +print "----------------------------------------\n"; +print "\n"; +print "(C) 2001 by Till Kamppeter\n"; +print "Free software under the terms of the GNU General Public License (GPL)\n"; +my $queue = ""; + +do { + print "\n"; + print "With this program you can adjust the margins and the position of the\n"; + print "printed contents on the paper. This way you get well-centered printouts and\n"; + print "you can make use of the whole imageable area of your printer, The driver\n"; + print "settings are overridden when this adjustment is used.\n"; + print "\n"; + print "This is especially important when your printer is used with a driver for\n"; + print "another printer to which yours is compatible (for example many laser\n"; + print "printers are compatible to the HP LaserJet printers). Your printer prints\n"; + print "with this driver, but the non-printable margins are usually different or the\n"; + print "contents is even not centered. With this program you can fix these problems\n"; + print "\n"; + print "The program can only be applied to local printer queues. The following\n"; + print "queues are available:\n"; + print "\n"; + + system "$cat $printerconffile | $egrep '' -f 1 | $cat -n"; + + print "\n"; + print "Please enter the number of the desired printer and make sure that it is\n"; + print "connected to your computer and turned on.\n"; + print "\n"; + + print "Number: "; + my $input = ; + + if ( $input =~ m/^\s*(\d+)\D*/ ) { + my $number = $1; + if (($number > 0) && ($number <= $nqueues)) { + open QUEUE, "$cat $printerconffile | $egrep '' -f 1| $head -$number | $tail -1 |"; + if (!$?) { + $queue = ; + close QUEUE; + } + } + } else { + print "\nWrong input, try again!\n"; + } +} until ($queue ne ""); + +chomp $queue; + +print "\n"; +print "Printing margin/offset adjustment page ...\n"; +print "\n"; + +# The "%!" which is needed in a file to be recognized as a PostScript file +# is missing in the adjustment page, therefore it is preceeded to the file +# here. +if (system "(echo %!; $cat $adjustmentpage) | $printcommand$queue") { +die "Could not print the adjustment page."; +} + +print "Please read the instructions on the margin adjustment page and determine the\n"; +print "six numbers mentioned there. If you measure in cm and not in inches, devide\n"; +print "the measured quantities by 2.54 before you insert them into the equations\n"; +print "shown on the page. You do not need to create any file with PostScript\n"; +print "commands, this program will insert your settings into your printer's\n"; +print "configuration.\n"; +print "\n"; +print "If the adjustment page did not come out of your printer, this method cannot\n"; +print "be applied, press Ctrl + C to stop this program. This can especially happen\n"; +print "with very old PostScript printers.\n"; +print "\n"; +print "Note also that this adjustment does not necessarily work with every driver.\n"; +print "The concept is taken from GhostScript and the implementation of this program\n"; +print "is not much tested yet.\n"; +print "\n"; + +print "Please enter your results now:\n"; +print "\n"; + +my $ml = 9999999.; +my $mb = 9999999.; +my $mr = 9999999.; +my $mt = 9999999.; +my $x = 9999999.; +my $y = 9999999.; + +do { + print "ml: "; + my $input = ; + + if ( $input =~ m/^\s*([+-]?[\d\.]+)\D*/ ) { + my $number = $1; + if (($number >= -100000) && ($number <= 100000)) { + $ml = $number * 1.; + } + } else { + print "Wrong input, try again!\n"; + } +} until ($ml != 9999999.); + +do { + print "mb: "; + my $input = ; + + if ( $input =~ m/^\s*([+-]?[\d\.]+)\D*/ ) { + my $number = $1; + if (($number >= -100000) && ($number <= 100000)) { + $mb = $number * 1.; + } + } else { + print "Wrong input, try again!\n"; + } +} until ($mb != 9999999.); + +do { + print "mr: "; + my $input = ; + + if ( $input =~ m/^\s*([+-]?[\d\.]+)\D*/ ) { + my $number = $1; + if (($number >= -100000) && ($number <= 100000)) { + $mr = $number * 1.; + } + } else { + print "Wrong input, try again!\n"; + } +} until ($mr != 9999999.); + +do { + print "mt: "; + my $input = ; + + if ( $input =~ m/^\s*([+-]?[\d\.]+)\D*/ ) { + my $number = $1; + if (($number >= -100000) && ($number <= 100000)) { + $mt = $number * 1.; + } + } else { + print "Wrong input, try again!\n"; + } +} until ($mt != 9999999.); + +do { + print "x: "; + my $input = ; + + if ( $input =~ m/^\s*([+-]?[\d\.]+)\D*/ ) { + my $number = $1; + if (($number >= -100000) && ($number <= 100000)) { + $x = $number * 1.; + } + } else { + print "Wrong input, try again!\n"; + } +} until ($x != 9999999.); + +do { + print "y: "; + my $input = ; + + if ( $input =~ m/^\s*([+-]?[\d\.]+)\D*/ ) { + my $number = $1; + if (($number >= -100000) && ($number <= 100000)) { + $y = $number * 1.; + } + } else { + print "Wrong input, try again!\n"; + } +} until ($y != 9999999.); + +my $ppdfilename = "$ppddir/$queue.ppd"; +print "\n"; +print "Saving your settings in $ppdfilename ...\n"; +print "\n"; + +my @marginsoption = ( + "*OpenUI *Margins/Page Margins/Offsets: PickOne\n", + "*DefaultMargins: Custom\n", + "*Margins Default/Driver Default: \"\"\n", + "*Margins Custom/Custom (set with 'alignmargins'): \"<>setpagedevice\"\n", + "*CloseUI: *Margins\n" +); + +# Read PPD file of the chosen printer + +if (!(-f $ppdfilename)) {die "No PPD file $ppdfilename!"}; +open PPDFILE, "$ppdfilename" or die "Can't open $ppdfilename!"; +my @ppdfile = ; +close PPDFILE; + +# Remove an old margin adjustment option + +($_ =~ m!^\s*\*OpenUI\s*\*Margins/.*:! and $_="") foreach @ppdfile; +($_ =~ m!^\s*\*DefaultMargins:! and $_="") foreach @ppdfile; +($_ =~ m!^\s*\*Margins\s*.*/.*:! and $_="") foreach @ppdfile; +($_ =~ m!^\s*\*CloseUI:\s*\*Margins! and $_="") foreach @ppdfile; + +# Insert the new margin adjustment option + +splice(@ppdfile,-1,0,@marginsoption); + +# Write back PPD file + +open PPDFILE, ">$ppdfilename" or die "Can't open $ppdfilename"; +print PPDFILE @ppdfile; +close PPDFILE; + +# Re-initialize CUPS (must be done after a "manual" change on the PPD file) + +system("killall -HUP cupsd"); + +print "\n"; +print "Done.\n"; +print "\n"; +print "Now your printer \"$queue\" will use the new margin and offset settings by\n"; +print "default. You can turn them off by switching the option \"Page Margins/Offsets\"\n"; +print "to \"Driver Default\" in kprinter, GTKlp, or XPP.\n"; +print "\n"; +print "On the command line (\"lpr\", \"lp\", \"lpoptions\", ...) use the option\n"; +print "\"-o Margins=Default\" to turn off and \"-o Margins=Custom\" to turn on your\n"; +print "settings.\n"; +print "\n"; + +exit 0; + +## END OF FILE #################################################################