aardio使用sys.printer+gdip打印二维码图片

发布时间 2023-07-10 18:02:15作者: 周文豪

一、二维码生成

二维码生成代码:

import qrencode.bitmap;
import gdip.graphics;
import fsys.stream;
import gdip.solidBrush;

var width=216 // 画板宽度
var height=330 // 画板高度
var imgWidth = 140; // 二维码宽度
var bmp = gdip.bitmap(width,height); // 创建位图对象
var graphics = gdip.graphics(bmp) // 创建图形对象graphics
var brush = gdip.solidBrush(0xFF000000);  //创建黑色刷子  
// 根据url生成二维码位图  
var url="https://www.baidu.com/index.htm";
var qrBmp = qrencode.bitmap(url);
var bitmap  = qrBmp.copyBitmap(imgWidth);
// 将位图画到画板中
graphics.drawImage(bitmap,(width-imgWidth)/2,30) // 参数二为左边距,参数3为上边距
// 转换为文件流
var stream = fsys.stream();
bmp.saveToStream(stream,"*.png"); // 保存bmp到stream流
var fileName = "/img/ticket4-"+time.stamp() + math.random(1000,9999)+".png"
// 获取图片字符串 保存到本地
string.save(fileName,stream.readAll());
brush.delete() 
bmp.dispose()

效果如下:

aardio关于打印机的介绍在范例:

二、打印机

1、打印文字

import win.ui;
import sys.printer;
/*DSG{{*/
mainForm = win.form(text="aardio4";right=757;bottom=467)
mainForm.add(
btnPrint={cls="button";text="打印";left=101;top=61;right=164;bottom=98;z=1}
)
/*}}*/

mainForm.btnPrint.oncommand = function(id,event){
    //直接选定默认打印机输出
    var printer = sys.printer();
    var pdc = printer.createDevice(
        dmPaperSize = 9/*_DMPAPER_A4*/; //小票打印机可以设为0,普通打印机使用 _DMPAPER_ 前缀常量指定纸张大小,例如 _DMPAPER_A4 指定为A4纸
        dmOrientation = 0;//横向打印为2,纵向打印为1
        //dmPaperWidth = 800;//纸张宽度
        //dmPaperLength = 580;//纸张长度
    );

    pdc.start(
        function(hdcPrinter){
            ::Gdi32.TextOut(hdcPrinter,20,20,"测试打印1",5);    
        }
    );
    
    pdc.close();
}

mainForm.show();
return win.loopMessage();

注意:TextOut方法的第五个参数为要打印文字的个数。

2、打印图形

import win.ui;
import sys.printer;
/*DSG{{*/
mainForm = win.form(text="aardio4";right=757;bottom=467)
mainForm.add(
btnPrint={cls="button";text="打印";left=137;top=371;right=200;bottom=408;z=1}
)
/*}}*/
    
mainForm.btnPrint.oncommand = function(id,event){
    //直接选定默认打印机输出
    var printer = sys.printer();
    var pdc = printer.createDevice(
        dmPaperSize = 9/*_DMPAPER_A4*/; //小票打印机可以设为0,普通打印机使用 _DMPAPER_ 前缀常量指定纸张大小,例如 _DMPAPER_A4 指定为A4纸
        dmOrientation = 0;//横向打印为2,纵向打印为1
        //dmPaperWidth = 800;//纸张宽度
        //dmPaperLength = 580;//纸张长度
    );

    pdc.start(
        function(hdcPrinter){
            //::Gdi32.TextOut(hdcPrinter,20,20,"测试打印1",5);  
            //GDI+绘图
            import gdip.graphics;
            import gdip.family;
            import gdip.solidBrush;
            
            var graphics = gdip.graphics(hdcPrinter); // 创建图形对象graphics
            graphics.pageUnit = 2/*_UnitPixel,打印单位改为使用像素*/
            
            var brush = gdip.solidBrush(0xFFFF0000); // 创建刷子
            var family = gdip.family("宋体"); // 创建FontFamily
            var strformat = gdip.stringformat(); // 创建stringFormat
            var curFont = family.createFont(  15,2/*_GdipFontStyleItalic*/, 2/*_GdipUnitPixel*/) // 创建Font
            graphics.drawString( "Hellow world! 打印测试!!"  , curFont
            ,  gdip.RECTF(15,15,500,150), strformat,brush);
            brush.delete()
            curFont.delete()
            strformat.delete();
            family.delete();   
        }
    );
    
    pdc.close();
}

3、生成二维码再打印

import win.ui;

import sys.printer;
     
/*DSG{{*/
mainForm = win.form(text="使用sys.printer+gdip打印二维码图片";right=451;bottom=252;parent=...)
mainForm.add(
button={cls="button";text="打印二维码";left=112;top=90;right=214;bottom=130;z=1};
edit={cls="edit";left=111;top=50;right=331;bottom=75;edge=1;z=3};
static={cls="static";text="二维码内容:";left=34;top=56;right=119;bottom=75;transparent=1;z=2}
)
/*}}*/

mainForm.button.oncommand = function(id,event){
        //直接选定默认打印机输出
        var printer = sys.printer();
        var pdc = printer.createDevice(
            dmPaperSize = 0/*_DMPAPER_A4*/; //小票打印机可以设为0,普通打印机使用 _DMPAPER_ 前缀常量指定纸张大小,例如 _DMPAPER_A4 指定为A4纸
            dmOrientation = 0;//横向打印为2,纵向打印为1
            //dmPaperWidth = 800;//纸张宽度
            //dmPaperLength = 580;//纸张长度
        );
        pdc.start(function(hdcPrinter){
                import qrencode.bitmap;  
                import gdip.graphics;
                var bmp = qrencode.bitmap(mainForm.edit.text);
                bmp.copyBitmap(180);                       
                var graphics = gdip.graphics(hdcPrinter); // 创建图形对象graphics
                graphics.drawImageRect(bmp[["bitmap"]], 0,0, 180, 180); // 指定输出大小180*180画图片
        });  
        pdc.close();     
}

mainForm.enableDpiScaling();
mainForm.show();

return win.loopMessage();

4、打印指定位置的图片

// 打印指定位置的图片
function printImage(filepath,deleteFile){
    var printer = sys.printer();
    var pdc = printer.createDevice(
        dmPaperSize = 0/*_DMPAPER_A4*/; //A4 纸
        dmOrientation = 0;//横向打印为2,纵向打印为1 
    );
    pdc.start(
        function(hdcPrinter,rc){
        var graphics = gdip.graphics(hdcPrinter);
            graphics.pageUnit = 2/*_UnitPixel,打印单位改为使用像素*/;
            
            var bmp = gdip.bitmap(filepath); 
            
            //保持比例缩放打印内容以符合介质 
            graphics.drawImageScale(bmp,rc);
        }
    );     
    pdc.close()
    if(deleteFile)fsys.delete(filepath) // 打印完成之后删除
}

测试:

printImage("D:\project\aardio-project\aardio4\img\pic-1688972944332.png",true)