SVH If you use the postscript export functionality from the canvas together with ghostscript, you can print your forms easily using following code. This code is based on
Printing a canvas under Windows (bottom of page). Your form must be created first on a canvas scale 1:1 (path for the canvas is in $WIN(FRM)). This code is written for Windows environment, but should be easily modified for other environments, as ghostscript is available for multiple platforms. On other platforms the options
-sDEVICE=mswinpr2 and
-sOutputFile must be modified, see GhostScript documentation.
Usage : (prefix commands with Print:: if you're working from a different namespace)
OpenPrinter
PrintForm (1 or multiple times)
ClosePrinter
sx and
sy are shifts to get the form on the right place on paper, this values are obtained by calibration. These values may not be the same for different printers.
fwdt and
fhgt are form width and height, the canvas must have the same size.
#
#
proc Print::OpenPrinter {} {
variable WIN
variable FLD
variable CUR
# Preprinted form is shown in the canvas as an image,
# This image must be removed temporarily during the printing
$WIN(FRM) itemconfigure img -state hidden
update
set gspath {C:\\gs\\gs8.51\\bin\\gswin32c.exe}
set opt1 "-q"
if {$FLD(Printer) != "Select from Printer Dialog"} {
set opt2 "-sDEVICE=mswinpr2 -sOutputFile=\"%printer%$FLD(Printer)\""
}\
else {
set opt2 "-sDEVICE=mswinpr2"
}
set opt3 "-dNOPAUSE -dBATCH"
set CUR(gs) [open "|\"$gspath\" $opt1 $opt2 $opt3 -" w]
}
#
#
proc Print::PrintForm {} {
variable WIN
variable FLD
variable CUR
variable Msg ""
# Form definition is stored in a BLT tree
# Values are obtained by procedure GetValues var1 var2 ...
GetValues sx sy fwdt fhgt unit rot
if {$rot} {
set sftx [expr {$sx + $fwdt / 2}]
set sfty [expr {$sy + $fhgt / 2}]
}\
else {
set sftx [expr {-1 * $sy + $fwdt / 2}]
set sfty [expr {$sx + $fhgt / 2}]
}
$WIN(FRM) yview moveto 0
$WIN(FRM) xview moveto 0
$WIN(FRM) postscript -channel $CUR(gs) -pagey $sftx$unit -pagex $sfty$unit -rotate $rot\
-width $fwdt$unit -height $fhgt$unit -pageheight $fhgt$unit -pagewidth $fwdt$unit -x 0 -y 0
}
#
#
proc Print::ClosePrinter {} {
variable WIN
variable CUR
variable Msg "" ;# variable attached to status bar
catch {close $CUR(gs)} Msg
array unset CUR gs
$WIN(FRM) itemconfigure img -state normal
update
}