Did you ever want to quickly print a screen capture of the current M3 program using any of your local Windows printers and printer preferences?
Print Screen
One known technique is to press the Print Screen button on the keyboard, and to paste the resulting bitmap image into Microsoft Paint or Microsoft Word, and to print from there. The result is a bitmap print. The advantages are: the truthfulness of the result which is a replica of what the user sees on the screen (WYSIWYG), the ability to print locally using the locally configured Windows printers, as well as the last minute control of the printer preferences. The disadvantage is the poor non vectorial quality, and the waste of printer ink used in printing background colors.
MOM, StreamServe
The other known technique is to print using the standard M3 functionality via MOM and streamfiles to StreamServe. The result is a vectorial print. The advantages are: the high quality of the vectorial print, the ability to customize the resulting documents via StreamServe Design Center, and the pre-configuration of the printer preferences in MOM. Also, StreamServe can print more complex content like barcodes. The disadvantage is that pretty much each M3 program needs to be configured via MOM and StreamServe, which requires custom implementation, as well as the inability to print locally using the locally configured Windows printers, and the inability to have last minute control of the printer preferences.
Script
It’s actually possible to programmatically print a screen capture of the current M3 program with a simple Personalized Script for Lawson Smart Office in JScript.NET. The result is similar to using the Print Screen button, while avoiding the extra steps of pasting the bitmap image into Microsoft Paint or Microsoft Word. One click print, locally.
For that, the script must get a reference to the current M3 window, convert the content from vectorial to bitmap using RenderTargetBitmap and BmpBitmapEncoder, and to print it using PrintDocument.
import System; import System.IO; import System.Drawing; import System.Drawing.Printing; import System.Windows.Media; import System.Windows.Media.Imaging; package MForms.JScript { class PrintMe { var img; public function Init(element: Object, args: Object, controller : Object, debug : Object) { try { // get the current window var h = controller.RenderEngine.Host; var e = h.VisualElement; // convert vectorial to bitmap var RTbmap: RenderTargetBitmap = new RenderTargetBitmap(h.Width, h.Height, 96, 96, PixelFormats.Default); RTbmap.Render(e); var encoder = new BmpBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(RTbmap)); var stream = new MemoryStream(); encoder.Save(stream); var gdiBitmap = new Bitmap(stream); stream.Close(); stream.Dispose(); this.img = gdiBitmap; // print var pd: PrintDocument = new PrintDocument(); pd.add_PrintPage(OnPrintPage); pd.Print(); } catch (ex: Exception) { debug.WriteLine(ex); } } function OnPrintPage(sender: Object, e: PrintPageEventArgs) { e.Graphics.DrawImage(this.img, 0, 0); } } }
There are also options to preview the document and to open the printer preferences but I haven’t yet succeeded in using them correctly:
(new PrintPreviewDialog()).ShowDialog(); (new PrintDialog()).ShowDialog();
Suppose you have an M3 program like this:
The result of the print would look like this (using printer PDF995):
The next step is to find a solution to add a margin, polish the print, and show the print preview and printer preferences.
The last step would be to place the script in a new Print button in the M3 panel, or to inject a new Print option in the File menu, to deploy the script on the server, and to attach it to the desired M3 programs with the XML Customization files. With that, the user would be able to quickly and locally print the M3 programs.