基于开源项目二次开发KKPrinter实现打印机共享,远程跨网络实现不同网络打印机共享,客户端利用虚拟打印机截取打印文件转发至物理打印机(附源码)

news2024/12/22 18:01:58

基于开源项目二次开发KKPrinter实现打印机共享,远程跨网络实现不同网络打印机共享,客户端利用虚拟打印机截取打印文件转发至物理打印机(附源码)。实现方案有很多种,这里主要介绍 2 种,并附详细的实现过程和提供需要的源码下载。


题外话,首先分享一个在线PDF工具箱,功能非常全非常好用:
https://tools.pdf24.org/en/all-tools


一、实现思路简介

要实现标题所写的目标,需要按照下面的步骤来进行:

1、开发虚拟打印机程序

跟普通的打印机驱动一样,安装完后可以在“打印机”里看到本打印机,第三方软件也能通过点“打印”选择该打印机。打印时完成两个处理:一是生成pdf文件,二是把文档送到真实打印机进行打印。

2、开发把打印文件上传到服务器的程序

这个程序是一个服务,要一直运行。程序会实时监测是否有虚拟打印机生成的PDF文件,如果有则立即进行上传到服务器的操作。

二、打印机相关案例介绍

1、利用虚拟打印机把打印内容上传到服务器并输出给物理打印机(一)

A 运行环境:win7/win10

B 打印内容转成文件格式:JPG

C 文件上传通讯协议:https、post

D 物理打印机类型:热敏

E 连接的物理打印机台数:1台

2、利用虚拟打印机把打印内容上传到服务器并输出给物理打印机(二)

A 运行环境:win7/win10

B 打印内容转成文件格式:PDF

C 文件上传通讯协议:https、post

D 物理打印机类型:热敏

E 连接的物理打印机台数:4台(纸的尺寸不同)

3、打印机驱动程序开发

A 运行环境:win7/win10

B 打印机类型:热敏

C 打印数据传递:串口

D 参数设定:调用打印机的SDK来设定

4、利用PJL命令控制打印机参数

A 运行环境:win7/win10

B 打印机类型:喷墨

C 打印数据传递:串口

D 命令实现功能:设定打印机的灰度、单双面、份数等

5、打印内容偏移的矫正

A 运行环境:win7/win10

B 打印机类型:热敏

C 打印数据传递:串口

D 问题描述:打印内容随着打印份数增加偏移增大


方案一:

基于开源项目clawpdf二次开发,实现我们的功能。clawpdf项目开源但并不免费,一般人根本没法直接从github下载后运行,他有各种坑,还有文件签名,我也是花了很久的时间才弄好,在它的基础上做了一些新的业务实现,并命名为KKPrinter,但是大部分代码任然是clawpdf的,在这里说明。

打开项目目录,双击 clawpdf.sln 启动项目,如图所示:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

打开一个文档,按 Ctrl + P 调出打印机列表,如下图:

在这里插入图片描述

上面的打印机驱动 数量 和 名称,可以在代码里面进行控制,这里为了尊重开源项目,我就用了原来的名称。

有两种方式把拦截到的打印机文件转发到物理打印机所在电脑:
1)HTTP请求;
2)Ftp请求;
在这里插入图片描述

在物理打印机监听到文件后,直接使用共享的打印机或者默认的打印机对文件进行打印,这里主要用到一个核心库:PdfPrintingNet.dll 。这样就可以实现在物理打印机电脑自动打印文件,不需要人为干预。

在这里插入图片描述
自动打印D盘目录下的文件,通过下面简单demo可以进行测试:

在这里插入图片描述
上面两个程序,一个放在 物理打印机所在的电脑,一个 放在需要使用远程打印机的电脑,中间用一个公网服务器通过 http 或者 ftp 把他们的文件进行传输,即可实现我们的目标。

完整源码下载地址:
点击下载


方案二:

基于修改系统注册表中的打印机属性参数实现,其原理都是差不多,都是通过虚拟打印机拦截用户的打印机文件,转发到物理打印机进行打印。这种方案也测试过,就是不能完全保留打印时候的全部属性参数,比如只能保留部分参数 比如 页码等等。

打开项目目录,双击 clawpdf.sln 启动项目,如图所示:

在这里插入图片描述
在这里插入图片描述
运行后,选择一个需要进行共享的打印机,这里通过 磁盘文件共享的方式代替 HTTP 和 ftp 访问文件传输,而且 把 共享端 和 使用端放在了一起,只需 选中一个文档,Ctrl + P 打印对话框,选择虚拟打印机,文件会自动用 物理打印机打印出来,实现了我们的目标。
在这里插入图片描述
点击本地打印机测试,即共享本地了打印机,可以根据需要进行更改业务逻辑实现自动化。

在这里插入图片描述

添加虚拟打印机到本地:

在这里插入图片描述
文档打印对话框中,选择 安装的虚拟打印机:

在这里插入图片描述
经过测试,可以完成我们的目标。

完整源码下载地址:
点击下载


以上是市面上使用的技术方案,比如 森雀云 等等。


我们团队有更高级的实现方案,有需要可以私聊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL学习笔记之索引优化与查询优化

文章目录 前言数据准备建表创建函数插入数据创建删除索引函数 索引失效案例全值匹配最佳左前缀法则主键插入顺序计算、函数导致列索引失效函数导致索引失效计算导致索引失效 类型转换导致列索引失效范围条件右边的列索引失效不等于导致列索引失效is not null不能使用索引like以…

探索“AI+算力”:加速创新与增长的无限潜力

随着科技的飞速发展,人工智能(AI)技术正成为各行各业的关注焦点。在这个充满激情和创新的时代,"AI算力"的结合应用成为科技行业的热门话题,甚至引发出"AI算力最强龙头"的网络热门等式。本文将探讨…

数据结构-哈希-哈希表实现

哈希表实现 一,哈希概念哈希概念常见哈希函数哈希冲突哈希冲突的解决 二,闭散列实现闭散列的结构插入查找删除闭散列总结 三,哈希桶实现哈希桶的结构插入查找删除析构拷贝构造赋值运算符重载 四,哈希表总结开散列与闭散列的比较哈…

设备虚拟化基础 - PCI

目录 1. 配置空间概念和作用 2. 通过配置空间发现设备 3. Linux读取PCI配置空间接口 4. 内核中具体读取配置空间实例 5. Virtion设备自定义空间 6. Linux读取Capabilities List代码解析 1. 配置空间概念和作用 详细的定义可以参考PCI Spec的第六章《Configuration Space…

嵌入式操作系统(嵌入式学习)

嵌入式操作系统 嵌入式操作系统是什么?嵌入式操作系统有哪些?常用的嵌入式操作系统及其特点对初学者的建议 嵌入式操作系统是什么? 嵌入式操作系统是一种专门设计和优化用于嵌入式系统的操作系统。它是在资源受限的嵌入式设备上运行的操作系…

No CMAKE_Swift_COMPILER could be found问题解决

编译OpenCV的IOS平台包,出错: CMake Error at CMakeLists.txt:20 (enable_language): No CMAKE_Swift_COMPILER could be found. 出错定位,原因是启用Swift语言时没有找到CMAKE_Swift_COMPILER变量 CMAKE官方文档说明启用Swift语言方法 cmake 3.15开始支持swift 查找swift …

简单介绍html/javascript、ajax应用

文章目录 前言1、html1.1.、html实例1.2、HTML文档的后缀名1.3、HTML 编辑器1.4、HTML 标题1.5、HTML 段落1.6、HTML 链接1.7、HTML 图像1.8、HTML 表格1.8.1、HTML 表格实例1.8.2、HTML 表格和边框1.8.3、HTML 表格表头 1.9、HTML <input> 标签1.10、Bootstrap 教程1.10…

开发常用命令合集(Docker、K8s、Linux、Windows等)

开发常用命令合集&#xff08;Docker、K8s、Linux、Windows等&#xff09; 1 Docker 详情查看&#xff1a;https://blog.csdn.net/weixin_45565886/article/details/130130361 1.1 基础命令 ①拉取、查看、删除镜像 docker pull nginx #下载最新版镜像名:版本名&#xff08…

元数据驱动架构的官方数据空间设计

淘宝开放平台是阿里与外部生态互联互通的重要开放途径&#xff0c;通过开放的产品技术把阿里经济体一系列基础服务&#xff0c;像水、电、煤一样输送给我们的商家、开发者、社区媒体以及其他合作伙伴&#xff0c;推动行业的定制、创新、进化, 并最终促成新商业文明生态圈。 开放…

PHP简单入门

PHP是一种流行的服务器端编程语言&#xff0c;被广泛用于Web开发。许多著名的网站和应用程序都是使用PHP编写的&#xff0c;例如Facebook、Wikipedia和WordPress等。本篇文章将为您介绍如何入门PHP编程。 环境配置 在开始使用PHP之前&#xff0c;需要先配置开发环境。要在本…

3ds MAX绘制花坛

绘制一个八边形花坛&#xff1a; 首先绘制一个八边形&#xff0c;并将它转换为可编辑样条线&#xff1a; 在前视图中绘制一个长方形&#xff0c;参数如图&#xff0c;可以按照喜好变换弧度等 注意&#xff0c;长方形的宽要和八边形的边长对应。 接下来我们通过旋转创建完整的…

测试流程体系

目录&#xff1a; 软件测试基本概念软件测试模型软件测试工作流程测试左移和测试右移 1.软件测试基本概念 通过手工或者工具对"被测对象"进行测试验证实际结果与预期结果之间是否存在差异 软件测试作用 通过测试工作可以发现并修复软件当中存在的缺陷&#xff…

环状支撑佩戴,骨传导新体验:南卡OE骨传导开放式耳机

骨传导耳机究竟是“黑科技”还是“智商税”呢&#xff1f;我想近几年的市场反馈就能给出答案。尤其是在户外运动场景下&#xff0c;骨传导耳机的综合体验都要比入耳式耳机更好一些。最近国产品牌南卡推出了一款新形态的骨传导耳机&#xff0c;南卡OE&#xff0c;它通过改良耳机…

【二叉树part03】| 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

目录 ✿LeetCode104.二叉树的最大深度❀ ✿LeetCode559.n叉树的最大深度❀ ✿LeetCode111.二叉树的最小深度❀ ✿LeetCode222.完全二叉树的节点个数❀ ✿LeetCode104.二叉树的最大深度❀ 链接&#xff1a;104.二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度…

[Leetcode] 0014. 最长公共前缀

14. 最长公共前缀 img { margin: auto; display: block } 点击上方&#xff0c;跳转至Leetcode 题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flowe…

一道有点仙的数位dp 方伯伯的商场之旅

link 大意&#xff1a; 思路&#xff1a; 先来考虑单个数字的情况 其实首先可以将题意稍微转化一下&#xff0c;就是移动一个石子的代价是其移动的距离。这样的话&#xff0c;显然我们的策略就是对于每一个石子&#xff0c;一次性将其移动到正确的位置&#xff0c;毕竟能一步…

Axure教程—选择器

本文将教大家如何用AXURE中的动态面板制作选择器 一、效果 预览地址&#xff1a;https://zhihp9.axshare.com 二、功能 用户点击选择框&#xff0c;可以显示下拉选择器&#xff0c;点击后选择对应项。 三、制作 1、选择框 拖入一个矩形&#xff0c;设置大小为16438&#xff…

macOS Ventura 13.4.1 (22F82) Boot ISO 原版可引导镜像下载

macOS Ventura 13.4.1 (22F82|22F2083) Boot ISO 原版可引导镜像下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Wind…

EMC学习笔记(六)优选布线层

EMC学习笔记&#xff08;六&#xff09;优选布线层 1. 表层与内层走线的比较1.1 微带线&#xff08;microsstrip&#xff09;1.2 带状线&#xff08;stripline&#xff09;1.3 微带线与带状线的比较 2.布线层的优先级别 对于时钟、高频、高速、小、弱信号而言&#xff0c;选择合…

React封装axios请求

1、前言 因为最近在进行老系统用新框架改造&#xff0c;正好用到了react&#xff0c;就顺便整理了一下react中对axios进行封装的相关知识点和步骤。 2、如何封装 可以参考一下chat gpt给出的回答。 我大概总结一下&#xff0c;其实就是使用axios.create创建一个axios的实例&…