V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GrapeCityChina
V2EX  ›  推广

突破技术限制,实现 Web 端静默打印

  •  
  •   GrapeCityChina · 2021-12-28 14:12:14 +08:00 · 933 次点击
    这是一个创建于 1064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作为 Web 开发的同僚们,估计都有一个共同的烦恼,Web 端为什么不能够像 CS 端那样直接打印预览?直接移除掉打印预览界面不就可以了?

    真实情况是 Web 端受限于浏览器的权限,无法直接访问打印机等本机资源。所以,在 Web 上实现无预览和打印并不是一个简单的问题,而是突破权限、突破平台的问题。这就导致了用户在打印报表时,至少需要点击两个按钮才能完成打印,如果是需要批量打印的场景,用户则需要重复多次点击按钮,非常麻烦。

    而不了解详细内情的甲方则会非常不解,这么简单的一个诉求,只是省去点击一个操作步骤,为什么你们办不到呢?

    这种对于我们卑微乙方的灵魂拷问,让我们也很头疼,不是我们办不到,是客观条件不允许我们办到。

    作为一个资历比较老的 Wyn Enterprise(读音:One)嵌入式 BI 和ActiveReports报表控件的技术顾问,这两年接触的客户,基本不再使用 Winform 或 WPF 了,大部分项目都迁移到 B/S 端,采用前后端分离的架构,或者 MVC 。

    在这种情况下,客户都会面临需要打印却无法直接连接打印机,进行默认打印的能力。如果是物流行业的企业或者生产制造企业,网页端打印,都是批量性的操作,比如物流单,每次批量打印上千张,如果每打印一张弹出一次打印预览界面,可能用不了多久,我们的可爱的甲方会将我们的电话打爆炸。

    在如此严峻的形势之下,外加众多用户都追着询问这个问题,静默打印在 Web 端的功能实现也是非常急迫的。

    现在大部分打印过程基本是将需要打印的内容导出为 PDF 文件,然后调用浏览器的打印预览,进行打印。既然有了第一步,就一定有直接实现静默打印的方法,。以下是本人搜索全网,觉得比较合适的内容,现将结果分享给大家。

    实现思路有两种:

    1. 设置浏览器
    2. 安装插件,使用代理软件

    话不多说直接干货,看看测试结果。

    设置浏览器

    有限制的地方就会有需求,既然打印时浏览器限制,那么就一定也有别的用户也有我们同样的需求,方法总比困难多。搜索后,我们找到在 Chrome 和火狐浏览器的设置中,有解决的方法,这法子看着像模像样,点赞也很多:

    大致内容是:

    1. 进入 Chrome 的高级设置,设置浏览器默认的主页为我们的 Web 应用需要静默打印的页面。跟着介绍,我们也操作起来。
    • 点击设置
    • 外观-设置显示主页按钮,并输入我们要访问的 Web 页面。

    • 打开桌面快捷方式,修改在后缀输入--kiosk --kiosk-printing 。

    而走到这一步,此路就不通了。系统会一直弹出如下的错误,无法修改。

    让我们换个浏览器试试。

    1. 修改-火狐浏览器

    2. 在浏览器输入:about:config

    3. 在输入框输入 print.always_print_silent

    并设置为 Boolean 类型,点+号

    1. 重启-测试打印

    此时系统依然会弹出打印预览对话框,此方法依旧无效。

    使用代理软件

    JSPrint

    使用方法简单,先用 Demo 网站调用 JSPrintManager 打印借口接口,然后使用客户端进行代理,就可以实现打印。支持的平台有:windows 10 ,IE ,Edge, 火狐,Chrome ,Safari 。

    下面是一些常用能介绍。

    使用用户选择打印机代码示例:

    const cpj = new JSPM.ClientPrintJob();
    
    cpj.clientPrinter =  new JSPM.UserSelectedPrinter();
    
    const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);
    
    cpj.files.push(printFile);
    
    await cpj.sendToClient();
    

    会出现打印对话框

    使用默认打印机

    const cpj = new JSPM.ClientPrintJob();
    
    cpj.clientPrinter =  new JSPM.DefaultPrinter();
    
    const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);
    
    cpj.files.push(printFile);
    
    await cpj.sendToClient();
    

    使用安装的打印机

    const cpj = new JSPM.ClientPrintJob();
    
    cpj.clientPrinter =  new JSPM.InstalledPrinter('Microsoft Print to PDF);
    
    const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);
    
    cpj.files.push(printFile);
    
    await cpj.sendToClient();
    

    获取打印机列表:

    const printersInfo = await JSPM.JSPrintManager.getPrintersInfo();
    
    console.log(printersInfo);
    

    JSPrintManager 使用起来并不难,但在的使用过程中,存在一些较为明显的技术限制。 在测试过程中,我们发现由于未知的因素,会出现旧示例无法使用工作,需要我们新建一个示例来完成 JSPrint 的静默打印的调用;除此之外,这种方法在火狐浏览器中无法正常执行。如果你是 Mac OS 需要注意,一旦试用 JSPrintManager 将无法卸载。

    Wyn Enterpriese

    实现在线报表设计,预览及静默打印一体功能 Wyn Enterprise V5.0 Update1 带来了突破性的报表打印——静默打印。

    示例下载:

    https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MTgzNDk3fDg2YWRhNTgyfDE2NDA1OTEzMzd8MjkzODJ8MTM2MTU1

    操作步骤:

    1 、启动打印代理服务(打印代理是使用 PowerShell 脚本完成的)

    包含文件如下:

    启动代理必须的环境资源: 1 、 [ Visual Studio 2022 ] (https://visualstudio.microsoft.com/vs/) 17.0 及以上版本(编译实例需要) 2 、 [.NET 6.0 SDK ] (https://www.microsoft.com/net/download) 3 、 [.NET Core Hosting Bundle ] (https://docs.microsoft.com/en-us ... view=aspnetcore-5.0) (IIS 部署环境)

    资源文件介绍:

    ./switchPrinter.ps1   切换默认的打印机资源
    
    `./start.ps1`  启动和安装打印服务
    
    ./stop.ps1  停止服务
     ./build.ps1  如果修改了 src 文件夹下的文件,需要启动该脚本,进行重新编译,编译的项目会放置在./PrintAgent 文件夹中
     ./debug.ps1 如果修改了 src 文件夹,可以使用该脚本进行调试。
    

    启动代理服务器: 将示例下载后,以管理员权限打开 powershell 工具可先执行以下命令:

    • 执行命令 Set-ExecutionPolicy Bypass -Scope CurrentUser -Force 启用执行脚本功能

    • 调用 ./switchPrinter.ps1 命令选择默认的打印机

    • 使用 ./start.ps1 命令启动服务,如果结束后,调用./stop.ps1 关闭案例

    2 、启动成功后,我们再来运行 WynReportDesigner 或 WynViewer 示例: 执行这些示例,会自动加载到默认的打印机选项,。实现打印需求。

    该示例代理使用葡萄城内部的 PDF 打印库进行无声打印。 可以通过附件中的 powerhellpowershell 脚本启动 Agent 并在 Windows 10 上注册其自动运行。

    配置成功后,可以看到点击打印按钮后,后台会连接默认的打印机进行打印。

    总结

    解决静默打印是没有捷径可以走的,设置浏览器该方法是看着是非常便捷,但是结果是并无效果。这时使用代理是一个行之有效的方法,但是现成的智慧结晶往往需要一些知识付费。Anyway ,方法总比困难多,如果大家在遇到类似的需求时,也不用发愁,现在市面上已经出现了行之有效的方法解决问题。去解决这个问题。

    JustinDeng
        1
    JustinDeng  
       2021-12-29 17:03:37 +08:00
    听君一席话,胜听一席话
    Jtyczc
        2
    Jtyczc  
       2022-07-05 17:47:17 +08:00
    不是有云打印么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3400 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:32 · PVG 19:32 · LAX 03:32 · JFK 06:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.