Difference between revisions of "Setting up a VISTA Printer"

From VistApedia
Jump to: navigation, search
Line 4: Line 4:
 
This is an updated page. See [[Setting_up_a_Linux_Printer_Old|this page]] for old content.
 
This is an updated page. See [[Setting_up_a_Linux_Printer_Old|this page]] for old content.
  
=== A new simpler way of doing GT.M pipes for printing ===
+
=== Cache/Linux printing ===
The old way of doing GT.M pipes for printing requires you to use pre-open execute and post-close execute. This is a way to do it with just the open parameters.
+
You can use Pipes in Cache as well to print on Linux/Unix. Here's an operative example.
 +
 
 +
<pre>
 +
NAME: SAM'S PHARMACY PRINTER            $I: /usr/bin/lpr -PSAN_FL6 -l
 +
  OPEN PARAMETERS: "QW"                SUBTYPE: P-HPLJ4SI-P12
 +
  TYPE: TERMINAL
 +
</pre>
 +
 
 +
=== GT.M/Linux printing ===
 +
Pipes again; just like Cache.
  
 
<pre style="padding:1em;border:1px dashed #2f6fab;color:black;background-color:#f9f9f9;line-height:1.1em">
 
<pre style="padding:1em;border:1px dashed #2f6fab;color:black;background-color:#f9f9f9;line-height:1.1em">
Line 58: Line 67:
 
No need to do pre-open and post-close executes on the device which dynamically change IOs.
 
No need to do pre-open and post-close executes on the device which dynamically change IOs.
  
=== Cache/Linux printing ===
 
You can use Pipes in Cache as well to print on Linux/Unix. Here's an operative example.
 
 
<pre>
 
NAME: SAM'S PHARMACY PRINTER            $I: /usr/bin/lpr -PSAN_FL6 -l
 
  OPEN PARAMETERS: "QW"                SUBTYPE: P-HPLJ4SI-P12
 
  TYPE: TERMINAL
 
</pre>
 
 
=== GT.M pipe for print DEVICE (older way): ===
 
  
With the introduction of the pipe device to GT.M (version V5.3-003) this simple, secure, and elegant method can be used:
 
 
* To begin, [[Begin_Configuration_of_Vista#Update_the_Devices,_Start_Taskman_and_Mail_a_Message|Update the Devices]] file. To create a new DEVICE, enter an unused NAME of your choice.
 
 
                  NAME: HP-PHOTOSMART                   
 
                    $I: <pipe>
 
      PRE-OPEN EXECUTE: X "o ""p"":(command=""lpr"")::""pipe"" s IO=""p"""
 
    POST-CLOSE EXECUTE: X "c ""p"""                 
 
                SUBTYPE: P-OTHER80
 
                  TYPE: OTHER
 
 
 
Note: We use [[FILE_3.5|TYPE:OTHER]] rather than Host File Server. No host file needed; output will be "piped" to the default CUPS printer. Also the fancy stuff is in the PRE-OPEN EXECUTE. For example, one can write:
 
 
      PRE-OPEN EXECUTE: X "o ""p"":(command=""lpr -P Photosmart_@192.168.5.103 -o cpi=12 -o lpi=8 -o page-left=72"")::""pipe"" s IO=""p"""
 
 
In human (ok in geekspeak), this last PRE-OPEN EXECUTE says, "Open a pipe device named "p" with the command to print to the CUPS printer named "Photosmart_@192.168.5.103". Set it to give us 12 characters/inch, 8 lines/inch and a 1 inch left margin). And then set IO to that device."
 
 
FileMan will then send his output to that IO device, the just-defined pipe.
 
 
Finally, the POST-CLOSE EXECUTE simply closes the pipe. And it's gone. No Linux /tmp/print.txt file to clean up. No fuss, no muss.
 
 
Another option is to define the device with option raw:
 
PRE-OPEN EXECUTE: X "o ""p"":(command=""lpr -P 1100A -o raw"")::""pipe"" s IO=""p"""
 
And then the SUBTYPE can manage the details of formating... Portrait vs Landscape and fonts, etc.
 
----
 
==== [[pipe to identify CUPS printers]] ====
 
 
--[[User:JohnLeoZ|JL.Z]] Aug 2009
 
----
 
 
=== VistA output to a temporary Linux file (Calling ^TMGPRNTR) (older) ===
 
 
Below is an older way of setting up a Linux printer.
 
 
Here is the DEVICE file entry:
 
 
                        NAME: S121-LAUGHLIN-LASER
 
                          $I: <TO BE SET IN PRE-OPEN EX.>   
 
        LOCATION OF TERMINAL: Laughlin_Office
 
  SUPPRESS FORM FEED AT CLOSE: YES 
 
                  PAGE LENGTH: 70                 
 
            PRE-OPEN EXECUTE: SET IO='''$$GETJOBNM^TMGPRNTR()'''
 
          POST-CLOSE EXECUTE: DO '''FINISH^TMGPRNTR("laughlin_laser")'''
 
                      SUBTYPE: P-OTHER80         
 
                        TYPE: HOST FILE SERVER
 
 
Here are the supporting calls to routine ^TMGPRNTR that create a file for writing, and then send the output file to the Linux lpr system
 
 
GETJOBNM()
 
        ;"Purpose: To create a unique printer job name. 
 
        ;"        This will be used during a printing process
 
        ;"        that writes the printer file to the host file system,
 
        ;"        then passes file to Linux
 
        ;"        printing system.
 
        ;"Output: Returns name of file to put output into
 
       
 
        ;"UNIQUE will generate a filename based on time and job number
 
        ;"    i.e. 'Print-Job-628233034.tmp
 
       
 
        ;"write !,"here in GETJOBNM^TMGPRNTR",!
 
        new cJobs set cJobs="PRINT JOBS"
 
        new Filename set Filename=$$UNIQUE^%ZISUTL("/tmp/Print-Job.tmp")
 
       
 
        ;"Now store Filename for later transfer to Linux lpr
 
        new index set index=$order(^TMP("TMG",cJobs,$J,""))
 
        if index="" set index=1
 
        set ^TMP("TMG",cJobs,$J,index)=Filename
 
       
 
        ;"write !,"Print job name will be:",Filename,!
 
        quit Filename  ;"result returned by altering Filename
 
 
 
FINISH(Printer)
 
        ;"Purpose: to complete the printing process by sending the now-created file
 
        ;"        to Linux CUPS (the printing system).
 
        ;"Note: The lpr system itself will delete this print file when
 
        ;"      done (option -r)
 
        ;"Input: Printer OPTIONAL -- the name of the linux printer to send the job to.
 
       
 
        new cJobs set cJobs="PRINT JOBS"
 
        new index set index=$order(^TMP("TMG",cJobs,$J,""))
 
        new Filename set Filename=$get(^TMP("TMG",cJobs,$J,index))
 
       
 
        close IO
 
        kill IO(1,IO)
 
       
 
        kill ^TMP("TMG",cJobs,$J,index)
 
        if Filename'="" do
 
        . new CmdStr
 
        . set CmdStr="lpr "
 
        . if $get(Printer)'="" set CmdStr=CmdStr_"-P "_Printer
 
        . ;"option -r --> lpr deletes file after printing done.
 
        . set CmdStr=CmdStr_" -r "_Filename_" &"
 
        . ;"write !,"Here is where I call:",!,"ZSYSTEM "_CmdStr,!
 
        . zsystem CmdStr
 
        . ;"write "Back from zsystem.  Returning to Fileman.",!
 
       
 
        quit
 
 
--[[User:Kdtop|Kdtop]] 10:34, 18 Sep 2005)
 
----
 
=== '''Linux /tmp/file (With ZSYSTEM call)''' (older) ===
 
 
On a Linux system with CUPS.
 
 
                  NAME: PRINTSERVER                     
 
                    $I: /tmp/vistaprint.txt
 
  LOCATION OF TERMINAL: lpr         
 
            OPEN COUNT: 1
 
    POST-CLOSE EXECUTE: X "ZSYSTEM ""lpr -r /tmp/vistaprint.txt"""
 
                SUBTYPE: P-OTHER80               
 
                  TYPE: HOST FILE SERVER
 
 
And for an elaboration of this method
 
 
                  NAME: HP-PHOTOSMART                   
 
                    $I: <TO BE SET IN PRE-OPEN EXECUTE>
 
      PRE-OPEN EXECUTE: S IO="/tmp/"_$J_"print.txt"
 
    POST-CLOSE EXECUTE: X "ZSYSTEM ""lpr -P Photosmart_@192.168.5.103 -r /tmp/""_$J_""print.txt"""
 
                SUBTYPE: P-OTHER80
 
                  TYPE: HOST FILE SERVER
 
 
Note: This DEVICE does not require the calls to ^TMGPRNTR. And, by exposing the lpr call in the POST-CLOSE EXECUTE, it allows more flexibility. For example, this relatively simple change will direct output to the default CUPS printer with 12 characters/inch, 8 lines/inch and a 1 inch left margin. :
 
 
      POST-CLOSE EXECUTE: X "ZSYSTEM ""lpr -o cpi=12 -o lpi=8 -o page-left=72 -r /tmp/""_$J_""print.txt"""
 
 
----
 
 
=== Avoiding the Staircase effect when printing from GT.M/Cache on *Nix ===
 
=== Avoiding the Staircase effect when printing from GT.M/Cache on *Nix ===
 
For an explanation of the Staircase effect, see this:
 
For an explanation of the Staircase effect, see this:
Line 211: Line 83:
  
 
On the other hand, if you are asking cups to handle the formatting (lpr without the -l option), cups properly formats the line returns through a cups filter, so you don't have to do anything.
 
On the other hand, if you are asking cups to handle the formatting (lpr without the -l option), cups properly formats the line returns through a cups filter, so you don't have to do anything.
 +
 +
=== Advanced printing topics ===
 +
[[VISTA_Advanced_printing_topics|Advanced printing topics]]

Revision as of 15:50, 9 June 2015

Back to Programming VistA Issues

This is an updated page. See this page for old content.

Cache/Linux printing

You can use Pipes in Cache as well to print on Linux/Unix. Here's an operative example.

NAME: SAM'S PHARMACY PRINTER            $I: /usr/bin/lpr -PSAN_FL6 -l
  OPEN PARAMETERS: "QW"                 SUBTYPE: P-HPLJ4SI-P12
  TYPE: TERMINAL

GT.M/Linux printing

Pipes again; just like Cache.

NAME: PHAR-IP-DM                        $I: PHAR-IP-DM
  LOCATION OF TERMINAL: Inpatient Pharmacy Dot-Matrix
  OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -l -P PHAR-IP-DM 2>/dev/null":WRITEONLY)::"pipe"
  SUBTYPE: P-EPSON-DM-P15-5L
  TYPE: TERMINAL


NAME: PHAR-IP-LS                        $I: PHAR-IP
  LOCATION OF TERMINAL: Inpatient Pharmacy Landscape
  OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe"
  SUBTYPE: P-HPLJ4SI-P13-LS
  TYPE: TERMINAL


NAME: PHAR-IP-POR-P12                   $I: PHAR-IP
  LOCATION OF TERMINAL: Inpatient Pharmacy Portrait (PL)
  OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe"
MNEMONIC: PL
  SUBTYPE: P-HPLJ4SI-P12                TYPE: TERMINAL


NAME: PHAR-IP-POR-P16                   $I: PHAR-IP
  LOCATION OF TERMINAL: Inpatient Pharmacy Portrait (MAR)
  OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe"
MNEMONIC: MAR
  SUBTYPE: P-HPLJ2-P16                  TYPE: TERMINAL

How does this work? The way this works is that $I becomes the IO variable. The open parameters tells VISTA how to open the device.

Vista does this:

S IO=[$I]
S param=[OPEN PARAMETERS]
O IO:param
U IO
Send Open Execute from Subtype
U IO(0)
Interact with user; open another job, etc...
U IO
write write write
Send Close Execute from Subtype
C IO
etc.

No need to do pre-open and post-close executes on the device which dynamically change IOs.


Avoiding the Staircase effect when printing from GT.M/Cache on *Nix

For an explanation of the Staircase effect, see this: http://www.digitalissues.co.uk/html/os/unix/stair.html

Basically, the new line doesn't do a carriage return with it, so our output just flows off the page. So when you print a 10 line document, you may only see one line, as the rest was printed outside of the margin.

If you are sending raw output (lpr with the -l option) from VISTA to any PCL compatible printer (and VISTA by and large uses PCL for formatting plain text output), you need to add this to your open execute:

W $C(27),"&k2G"

This tells the PCL compatible printer to append a CR to each LF or FF.

On the other hand, if you are asking cups to handle the formatting (lpr without the -l option), cups properly formats the line returns through a cups filter, so you don't have to do anything.

Advanced printing topics

Advanced printing topics