当前位置: 首页 > news >正文

自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现

常规通过小程序或APP在外出时控制本地电脑实现打印功能,可以结合远程桌面技术、云打印服务或开发定制化的远程打印解决方案。

但这里我们采用自已的实现方案来解决

服务器端实现

搭建一个后端socket服务,监听来自手机的打印请求。监听到打印任务后向本地客户端打印机发送打印命令。


手机端小程序APP

开发小程序或APP,通过API与本地电脑的后端服务通信。
用户选择文件后,将文件上传或发送打印指令到后端服务。


本地客户端打印执行

本地客户端进行socket连接,注册服务。后端服务接收到打印请求后进行打印。本地客户端我们采用的是electron来连接服务器端socket。本地客户端就可以静默打印。客户端核心方案的打印代码是采用了electron BrowserWindow静默打印实现。

win = new BrowserWindow({show: false,webPreferences: {nodeIntegration: false,contextIsolation: true,preload: join(__dirname, '../preload/print.js')}})if (options.printType === 'pdf') {// PDF打印 - 直接加载URLif (!options.url) {throw new Error('URL is required for PDF printing')}await win.loadURL(options.url)} else {// HTML内容打印 - 加载模板并注入内容if (is.dev && process.env['ELECTRON_RENDERER_URL']) {await win.loadURL(`${process.env['ELECTRON_RENDERER_URL']}/print.html`)} else {await win.loadFile(join(__dirname, '../renderer/print.html'))}// 检查并注入HTML内容if (!options.content && !options.url) {throw new Error('Either content or url is required for HTML printing')}let htmlContent = options.contentif (!htmlContent && options.url) {// 如果提供了url但没有content,尝试从 url 解析内容htmlContent = decodeURIComponent(options.url.replace('data:text/html;charset=utf-8,', ''))}await win.webContents.executeJavaScript(`document.getElementById('printContent').innerHTML = ${JSON.stringify(htmlContent)}`)}// 等待内容加载完成await new Promise((resolve) => setTimeout(resolve, 1000))await win.webContents.executeJavaScript('document.readyState === "complete"')// 执行打印const result = await new Promise((resolve, reject) => {win.webContents.print({silent: true,printBackground: options.printBackground || true,deviceName: options.printer,pageSize: options.pageSize === 'custom'? {width: options.customWidth * 1000,height: options.customHeight * 1000}: options.pageSize,landscape: options.landscape,copies: options.copies || 1,margins: {top: options.margins?.top || 0,bottom: options.margins?.bottom || 0,left: options.margins?.left || 0,right: options.margins?.right || 0}},(success, failureError) => {if (success) {resolve({ success: true })} else {reject(failureError || new Error('Print failed'))}})})win.close()


优点

完全自定义,满足特定需求。
数据传输更安全,隐私可控。


缺点

开发成本较高,需要一定的技术能力。
需要确保本地电脑和手机在同一网络下,或通过公网IP访问。

相关文章:

  • 停止回答 docker启动redis
  • 青少年编程与数学 02-016 Python数据结构与算法 26课题、生物信息学算法
  • XC6SLX100T-2FGG484I 赛灵思 XilinxFPGA Spartan-6
  • 抽样信号——Sa函数sinc函数
  • java聊天室案例改进(建立与数据库的连接)
  • Chrome漏洞可窃取数据并获得未经授权的访问权限
  • rac环境下,增加一个控制文件controlfile
  • 从技术本质到未来演进:全方位解读Web的过去、现在与未来
  • Git完全指南:从入门到精通版本控制 ------- Git Flow(10)
  • TDengine 语言连接器(PHP)
  • 用 MongoIndexStore 实现对话存档和恢复 实现“多用户、多对话线程”场景(像一个 ChatGPT 对话列表那样)
  • 什么是分布式锁?
  • java + spring boot + mybatis 通过时间段进行查询
  • 微信小程序文字混合、填充动画有效果图
  • Linux网络协议栈深度解析:从数据封装到子网划分的底层架构
  • 第二篇:linux之Xshell使用及相关linux操作
  • 「数据可视化 D3系列」入门第六章:比例尺的使用
  • 数据结构-栈
  • WebSocket 实现数据实时推送原理
  • Spine-Leaf 与 传统三层架构:全面对比与解析
  • wordpress换主机域名/深圳优化seo
  • 南昌做网站/恩施seo整站优化哪家好
  • 宁波网站建设方案联系方式/微信营销的方法和技巧
  • 微信营销大师/整站seo定制
  • 天猫网站左侧导航是怎么做的/网站推广的基本方法有
  • 平凉哪家做企业网站/直销怎么做才最快成功