基于开源项目二次开发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 打印对话框,选择虚拟打印机,文件会自动用 物理打印机打印出来,实现了我们的目标。
点击本地打印机测试,即共享本地了打印机,可以根据需要进行更改业务逻辑实现自动化。
添加虚拟打印机到本地:
文档打印对话框中,选择 安装的虚拟打印机:
经过测试,可以完成我们的目标。
完整源码下载地址:
点击下载
以上是市面上使用的技术方案,比如 森雀云 等等。
我们团队有更高级的实现方案,有需要可以私聊。