win10更新有时会导致打印机共享失败,在网上寻找解决办法,都不能解决目前共享失败的问题,于是萌发了在客户端生成PDF文件,服务端打印的想法,发现网络上已经有利用开源虚拟打印机clawPDF生成本地PDF,上传后打印的文章,比如kkprint,决定动手试验。
需要的工具:clawPDF(官网下载),PDFtoPrinter.exe,服务端采用Python的pyftpdlib库架设FTP服务。
服务端:
import subprocess
import sys
import os
#import win32api
sys.path.append("c:\\users\\administrator\\appdata\local\\programs\\python\\python38\\lib\\site-packages")
import win32print
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer
# :param cprinter: 调用的打印机名称
# :param pdf: pdf文件的绝对路径
#print(
win32print.GetDefaultPrinter()) # 获取默认打印机名称
#print(win32print.EnumPrinters(3)) # 获取所有打印机列表
class MyHandler(FTPHandler):
def on_disconnect(self):
# do something when client disconnects
pass
def on_login(self, username):
# do something when user login
pass
def on_logout(self, username):
# do something when user logs out
pass
def on_file_sent(self, file):
# do something when a file has been sent
pass
def on_file_received(self, file):
# do something when a file has been received
print("file re")
if sys.platform == 'win32':
args = [#f"{os.path.dirname(__file__)}\plug\PDFtoPrinter.exe",
f"d:\\PDFtoPrinter.exe",
f"{file}",
#f"{cprinter}",
]
subprocess.run(args, encoding="gb2312", shell=True)
print(f"\t|已发送至打印机")
pass
def on_incomplete_file_sent(self, file):
# do something when a file is partially sent
pass
def on_incomplete_file_received(self, file):
# remove partially uploaded files
import os
os.remove(file)
# 新建一个用户组
authorizer = DummyAuthorizer()
# 将用户名,密码,指定目录,权限 添加到里面
authorizer.add_user("zw", "zw", "d:\\ftpfile", perm="elradfmw") # adfmw
# 这个是添加匿名用户,任何人都可以访问,如果去掉的话,需要输入用户名和密码,可以自己尝试
authorizer.add_anonymous("d:\\ftpfile")
handler = MyHandler
handler.encoding = 'gbk'
print(handler.encoding)
handler.authorizer = authorizer
# 开启服务器
server = FTPServer(("192.168.2.43", 21), handler)
server.serve_forever()
客户端:
安装clawPDF,
文件参数设置
自动保存
目标文件夹自己建一个,记得定期清理
返回后点击动作
客户端和服务端完成,打印时在打印机选择框选择clawPDF,clawPDF会在生成本地PDF文件后自动上传至FTP服务器,FTP服务器在接收上传文件后调用PDFtoPrinter.exe将PDF文件在打印机打印出来。如果存在PDF文件名乱码问题,需要将pyftpdlib组件中filesystem.py、handlers.py文件里所有“utf8”替换成“gbk”。实际使用中,文件名乱码不影响使用。