浏览器快速打印.md

浏览器快速打印

在使用B/S架构开发管理系统时,不可避免的会用到打印功能,一般的实现方式是使用windos.print()方法打印报表或表单,但该法会弹出一个打印预览界面,需要再次点击打印才能将打印内容发送到打印机。对于一般的报表或表单打印,这种方法也是可以接受的。但是对于需要高频打印的标签打印,这种方式就会显得繁琐,那么有没有一种方法可以在点击打印后直接将打印内容发送到打印机,而不需要弹出打印预览界面?

WebClentPrint

WebClentPrint:为Windows, Linux, Mac和树莓派提供跨浏览器客户端打印解决方案,在客户端只需安装一个WebClentPrint的客户端,就能实现在点击打印时将打印内容直接发送到指定的打印机,而不会先弹出打印预览。

WebClentPrint 浏览器打印JavaScript核心代码为:

 var setA = function ()
{
    var e_id = 'id_' + new Date().getTime();
    if (window.chrome)
    {
        $('body').append('<a id="' + e_id + '"></a>');
        // webclientprintv 要执行的文件在注册表中的名称
        // arguments[0] 传入可执行文件的参数
        $('#' + e_id).attr('href', 'webclientprintv:' + arguments[0]);
        var a = $('a#' + e_id)[0];
        // 创建一个鼠标事件
        var evObj = document.createEvent('MouseEvents');
        // 事件触发click事件
        evObj.initEvent('click', true, true);
        // 在a标签上执行该事件
        a.dispatchEvent(evObj)
    }
    else
    {
        $('body').append('<iframe name="' + e_id + '" id="' + e_id + '" width="1" height="1" style="visibility:hidden;position:absolute" />');
        // webclientprintv 要执行的文件在注册表中的名称
        // arguments[0] 传入可执行文件的参数
        $('#' + e_id).attr('src', 'webclientprintv:' + arguments[0])
    }
    setTimeout(function ()
    {
        $('#' + e_id).remove()
    }, 5000)
}

使用a标签调用本地执行程序,通过本地安装的执行程序调用打印机发送打印命令和内容。

实现页面快速打印步骤

  1. 创建本地应用程序,接收a标签传入的参数,从服务器中获取打印内容,将打印内容发送到指定的打印机
  2. 在注册表中注册本地程序
  3. a标签的href的值为$"{本地应用程序在注册表中的名称}:{传入的参数}"

本地应用程序(C#)

获取客户端电脑默认打印机

public static String DefaultPrinter()
{
    return  new PrintDocument().PrinterSettings.PrinterName;
}

获取客户端电脑安装的打印机

public static List<String> GetLocalPrinters()
{
    List<String> fPrinters = new List<String>();
    fPrinters.Add(DefaultPrinter()); //默认打印机始终出现在列表的第一项
    foreach (String fPrinterName in PrinterSettings.InstalledPrinters)
    {
        if (!fPrinters.Contains(fPrinterName))
        {
            fPrinters.Add(fPrinterName);
        }
    }
    return fPrinters;
}

发送打印

using (var pd = new PrintDocument())
{
    try
    {
        // 设置打印机
        pd.PrinterSettings.PrinterName = "指定打印机名称";
        // 设置纸张尺寸100mm*60mm
        pd.DefaultPageSettings.PaperSize = new PaperSize()
        {
            PaperName = "100*60",
            /**
             * 1英寸=25.4毫米
             * 1毫米=0.04英寸
             * */
            Width = (int)(100 * 100 / 25.4),
            Height = (int)(60 * 100 / 25.4),
        };

        pd.DocumentName = "标签打印";
        pd.PrintPage += Pd_PrintPage;

        pd.Print();
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}
private void Pd_PrintPage(object sender, PrintPageEventArgs e)
{
    // 生成打印内容
    e.Graphics.PageUnit = GraphicsUnit.Millimeter;

    Font titleFont = new Font("黑体", 11, FontStyle.Bold);//标题字体
    Font fntTxt = new Font("宋体", 10, FontStyle.Regular);//正文文字
    Brush brush = new SolidBrush(Color.Black);//画刷
    e.Graphics.DrawString("打印测试", titleFont, brush, new PointF(32, 2));
    e.Graphics.DrawString($"纸张大小【{ e.PageSettings.PaperSize.PaperName}】", fntTxt, brush, new PointF(30, 22));
}

注册表设置

方法一、注册表文件格式如下

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\注册表中的名称]
"URL Protocol"="可执行文件完整路径"
@="注册表中的名称.Protocol"
[HKEY_CLASSES_ROOT\注册表中的名称\DefaultIcon]
@="可执行文件完整路径,1"
[HKEY_CLASSES_ROOT\注册表中的名称\shell]
[HKEY_CLASSES_ROOT\注册表中的名称\shell\open]
[HKEY_CLASSES_ROOT\注册表中的名称\shell\open\command]
@="\"可执行文件完整路径\"\"%1\""

复制到(txt)记事本,然后另存为注册表中的名称.reg.reg文件,打开运行文件;

方法二、部署添加注册表(C#)如下

注册表页面,各个节点的键值为:

键(Key 名称(Name) 值(Value)
注册表中的名称 注册表中的名称.Protocol
注册表中的名称 URL Protocol 可执行文件完整路径
注册表中的名称/DefaultIcon URL Protocol 可执行文件完整路径,1
注册表中的名称/shell
注册表中的名称/shell/open
注册表中的名称/shell/open/command "可执行文件完整路径""%1"

添加程序安装项目

posted @ 2020-12-24 17:27  $("#阿飞")  阅读(467)  评论(0编辑  收藏  举报