找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 354|回复: 17

[原创] win下的无驱打印机共享程序

[复制链接]
发表于 昨天 10:46 | 显示全部楼层 |阅读模式
基于smb打印共享不安全、linux缺某些打印机驱动程序,用AI写了一个IPP打印机共享程序,可以使用通用驱动达到无驱的效果。地址如下:https://gitee.com/T_show/ippserver
发表于 昨天 11:01 | 显示全部楼层
感谢楼主分享实用的小程序啊
回复

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层
感谢楼主,辛苦。
回复

使用道具 举报

发表于 昨天 11:15 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 昨天 11:15 | 显示全部楼层
试了一下,进入共享打印机管理里面,打印机对应的共享IP有多个,但不能改,只选保留的IP址:168.254.x.x,不能选真实的内网ip
回复

使用道具 举报

发表于 昨天 11:19 | 显示全部楼层
支持发布,楼主辛苦了
回复

使用道具 举报

发表于 昨天 11:23 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 昨天 11:30 | 显示全部楼层
不错 试一下看
回复

使用道具 举报

发表于 昨天 11:36 | 显示全部楼层
已下载谢谢分享
回复

使用道具 举报

发表于 昨天 11:36 | 显示全部楼层
已下载谢谢分享
回复

使用道具 举报

发表于 昨天 12:12 | 显示全部楼层
win下的无驱打印机共享程序
回复

使用道具 举报

发表于 昨天 12:16 | 显示全部楼层
IPP 打印服务器(Win7 兼容,支持通用 PS 驱动 + 多打印机共享)

基于 Go + OpenPrinting/goipp + Ghostscript 9.52 的 IPP(RFC 8010/8011)打印服务器,兼容 Windows 7(32 位)。
页面与认证

  • http://服务器/(根目录,公开):展示所有已共享打印机及各入口的客户端添加详细提示(URL、驱动厂商及名称、Win/Linux 步骤)
  • http://服务器/admin(管理页面,需认证):共享打印机向导/表格、打印任务、服务设置、连接日志
  • 认证:HTTP Basic,默认账户 admin / admin;密码以国密 SM3(加盐)摘要保存在 config.json,可在"服务设置→修改管理密码"中更改(需填原密码)
  • 默认监听端口 80(可在服务设置中修改,如改回 IPP 标准 631,重启生效;旧配置保持原端口)
架构

客户端(Win7: MS Publisher Imagesetter / Win10: Microsoft PS Class Driver)        │  IPP Print-Job (application/postscript)        ▼ippserver.exe :631 ── PS/PDF ──► Ghostscript(mswinpr2) ──► 真实打印机驱动 ──► 出纸        │                                              (GDI 打印机同样适用)        └── 其它格式 ──► RAW 直通

功能

  • IPP 服务端(/ipp/print、/ipp/print/<打印机名>):
    • Get-Printer-Attributes / Print-Job / Get-Jobs / Get-Job-Attributes
    • Hold-Job / Release-Job / Cancel-Job / Pause-Printer / Resume-Printer / Purge-Jobs
    • 响应严格遵循 RFC 8011(attributes-charset/natural-language 头属性),兼容 Windows IPP 客户端
  • PS/PDF 渲染打印:客户端发来的 PostScript/PDF(通用 PS 驱动)自动经 Ghostscript mswinpr2 设备交给目标打印机自己的 Windows 驱动渲染,对 GDI 打印机同样有效
  • 多打印机共享(支持共享名称/别名):
    • 默认端点 /ipp/print → 默认打印机(网页表格中单选指定)
    • 每台共享打印机独立端点 /ipp/print/<共享名称>(共享名称可自定,与真实打印机名解耦;中文需 URL 编码,添加打印机向导自动处理)
    • 共享名单与默认打印机在网页"共享打印机"选项卡以表格管理(本机打印机名 / 共享名称 / 是否共享 / 默认打印机 / 共享路径),勾选后"保存"
  • Web 管理界面(http://localhost:631/):
    • 共享打印机选项卡:表格展示本机全部打印机(本机打印机名 / 共享名称 / 是否共享 / 默认打印机单选 / 共享路径),勾选后"保存";默认打印机只能选一台,默认勾选第一台共享打印机
    • 打印任务选项卡:任务列表 + 队列级操作(暂停队列/恢复队列/清空队列/刷新)合并展示
    • 服务设置选项卡:Ghostscript 目录配置(含版本自检)+ IP 白名单(支持单 IP 192.168.1.10 或范围 192.168.1.1-192.168.1.50,每行一条;本机 127.0.0.1 始终允许)
    • 连接日志:每个任务记录目标打印机、格式、大小、路由方式(Ghostscript渲染/RAW直通)、GS 启动/完成/失败及耗时、白名单拦截(BLOCK)
  • 托盘图标:程序启动后在系统托盘显示打印机图标(提示文字"IPP 打印服务器"),点击弹出菜单:设置(打开网页管理界面)、退出(结束进程);程序为 GUI 子系统,无控制台黑窗
  • 静默打印:Ghostscript 以隐藏窗口方式执行(CREATE_NO_WINDOW),PS 渲染打印全程不弹出任何界面
  • Windows 打印集成:winspool.drv(EnumPrinters / StartDocPrinter / WritePrinter / EnumJobs / SetJob / SetPrinter)
自定义 API(JSON,端口 631)

[td]
方法路径说明
GET/api/status端口、当前打印机、打印机列表、队列任务数
POST/api/printer设置默认打印机,body {"name":"..."}
GET/api/jobs任务列表(含来源 IP、页数、状态)
POST/api/job任务操作,body {"id":N,"action":"pause|resume|delete"}
POST/api/queue队列操作,body {"action":"pause|resume|purge"}
GET/api/logs?n=30最近连接/请求日志
GET/POST/api/settings查看/设置 Ghostscript 目录与 IP 白名单(body 含 gs 或 ipEnable+ipRules,后者每行一条 IP 或 IP-IP 段)
POST/api/shared保存共享配置,body {"action":"save","list":[{"name":"本机名","alias":"共享名"}],"default":"本机名"}
目录结构

[td]
文件/目录说明
main.go入口:注册 IPP / 网页 / API 路由并启动服务
ipp.goIPP 协议处理(goipp 编解码 + 操作分发 + 多打印机路由)
psprint.goPS/PDF 渲染打印(Ghostscript mswinpr2 调用)
webui.go网页管理界面(内嵌 HTML/JS)+ JSON API
printer_windows.gowinspool 打印机枚举 / RAW 打印封装
spooler_windows.go任务枚举 / 任务与打印机控制
config.go配置(端口/默认打印机/GS 目录/共享名单,存于 config.json)
log.go连接与请求日志(内存环形缓冲,最多 500 条)
ui_core.go队列快照刷新逻辑
gs/Ghostscript 9.52 便携版(gswin32c.exe + gsdll32.dll + lib/Resource/iccprofiles,约 34MB,绿色免安装)
test_ps.ps1PS 打印链路自测脚本
构建与运行

使用 C:\go(Go 1.20.14 windows/386,纯 Go 无 CGO):
build.bat          :: 生成 ippserver.exe(约 7.6MB)ippserver.exe      :: 启动后浏览器访问 http://localhost:631/

  • IPP_HEADLESS=1 环境变量可静默运行
  • Ghostscript 默认使用 exe 同目录的 gs\,可在网页设置中改为任意路径(含已安装版)
  • 网页每 5 秒自动刷新状态与任务
客户端接入

  • 服务器开放防火墙:netsh advfirewall firewall add rule name="IPP Print Server" dir=in action=allow protocol=TCP localport=631
  • 服务器网页"共享打印机"选项卡勾选目标打印机(如 LJ2400)并保存——排在第一台的即是默认端点目标
  • 客户端添加打印机,地址填:
    • 默认打印机:http://服务器IP:631/ipp/print
    • 指定打印机:http://服务器IP:631/ipp/print/打印机名
  • 驱动选择(系统自带,无需下载):
    • Win7:手动选择 MS Publisher Imagesetter(通用 PostScript)
    • Win10:Microsoft PS Class Driver,或 HP UPD PS 版(功能更全)
  • 打印测试页——服务器"连接日志"出现 接收任务: 目标打印机=… 路由=Ghostscript渲染 与 GS-DONE 耗时=… 即链路正常
Linux 客户端接入(UOS / 麒麟 等 Debian 系)

UOS/麒麟基于 Debian + CUPS,两种方式添加通用 PS 网络打印机:
方式一:图形界面(UOS/麒麟 控制中心)
  • 控制中心 → 打印机 → 添加 → 网络打印机(或"手动添加")
  • 协议选 IPP,地址填:192.168.x.x:631/ipp/print/共享名称
  • 驱动选择 Generic → PostScript Printer(通用 PostScript,系统自带)
方式二:CUPS 网页 / 命令行
# CUPS 管理页:http://localhost:631 → Administration → Add Printer#   连接类型选 Internet Printing Protocol (ipp)#   URI: ipp://192.168.x.x:631/ipp/print/共享名称#   型号选 Generic → Generic PostScript Printer# 命令行(一条命令完成):lpadmin -p ipp-remote -E \  -v ipp://192.168.x.x:631/ipp/print/共享名称 \  -m drv:///sample.drv/generic.ppd   # Generic PostScript 驱动lpoptions -d ipp-remote              # 设为默认lp /path/test.txt                    # 测试打印

说明:Linux 的 Generic PostScript 驱动发送 PostScript 数据,服务器端由 Ghostscript 渲染到真实打印机,与 Windows 客户端(MS Publisher Imagesetter / PS Class Driver)完全一致。
共享向导(推荐配置方式)

网页"共享打印机"卡片 → + 共享向导,三步完成:
  • 协议测试:选择待共享打印机,点击 打印 PS 测试页 / 打印 PCL6 测试页 (服务器把内嵌的中文测试页 RAW 直发打印机,由打印机自身解释)。 根据实际打印结果勾选"支持 PS / 支持 PCL 6":
    • 清晰打印 = 支持;空白/乱码 = 不支持
    • 可选:添加 PCL 共享入口(勾选"支持 PCL6"后出现,默认勾选)
    • 可选:添加原厂驱动共享入口(客户端需安装原装驱动,数据直传保真度最高)
  • 共享计划(按测试结果自动生成,无需选择;共享名称可改):[td]
    检测结果生成的共享入口
    默认XX-drv(原厂驱动直连:客户端装原装驱动,保真度最高)
    默认 + 支持 PSXX-ps(直连 RAW:PS 流直传打印机,不转换)
    默认 + 不支持 PSXX-ps(PS 转发:客户端通用 PS 驱动,服务器 Ghostscript 渲染)
    支持 PCL6额外添加 XX-pcl6(直连 RAW:客户端用 PCL6 通用驱动)
  • 客户端接入:为每个入口展示 Win7/Win10/Linux 添加步骤、URL、驱动厂商及名称(见下表),点"完成并保存"生效。
客户端添加打印机详细帮助

[td]
入口客户端驱动厂商 / 名称步骤
PS(转发或直通)Win7Microsoft / MS Publisher Imagesetter控制面板→设备和打印机→添加打印机→按名称选择共享打印机→填 http://服务器:631/ipp/print/共享名
PSWin10/11Microsoft / Microsoft PS Class Driver设置→打印机和扫描仪→添加→不在列表中→按名称选择→同上 URL
PSLinux(UOS/麒麟)Generic / Generic PostScript Printerlpadmin -p ipp-ps -E -v ipp://服务器:631/ipp/print/共享名 -m drv:///sample.drv/generic.ppd
PCL6Win7/10/11HP / HP Universal Printing PCL 6(或厂商 PCL6 通用驱动)同上(按名称选择共享打印机)
PCL6LinuxGeneric / PCL Laserlpadmin -p ipp-pcl -E -v ipp://... -m foomatic:Generic-PCL-Laser.ppd
真实打印机Win7/10/11打印机制造商 / 该型号官方驱动(如 Lenovo LJ2405)同上
真实打印机Linux厂商 / 型号 PPDlpadmin -p ipp-raw -E -v ipp://... -m <型号PPD>
启动失败提示与处理

程序启动时若端口监听失败(被占用/权限不足等),会:
  • 弹出错误对话框(Windows)或桌面通知(Linux),内容含失败原因与处理建议
  • 将详情写入程序目录的 startup-error.log(无界面环境也可排查)
  • 退出程序(不会出现"看似在运行实际不服务"的状态)
常见原因与处理:
[td]
原因判别处理
端口被占用(IIS/http.sys 占 80、CUPS 占 631 等)Windows:netstat -ano | findstr :端口;Linux:lsof -i:端口改端口:编辑 config.json 的 listenPort(或删除 config.json 后在管理页设置),重启
权限不足(Linux 1024 以下端口)以 root 运行或 setcap 'cap_net_bind_service=+ep' 程序或改用 1024 以上端口
防火墙拦截客户端无法访问放行端口(见下文防火墙命令)
程序已在运行(单例)弹"程序已在运行"使用托盘图标,或退出旧实例
打印报错排查(看连接日志)

[td]
日志现象原因与处理
只有"接收任务"和 GS-START,无 GS-DONEGhostscript 被挂起,常见于目标打印机是 Microsoft Print to PDF 等弹保存对话框的虚拟打印机——在网页上取消其共享或不要排首位
接收任务: 路由=RAW直通客户端驱动不是 PS 类(未发 postscript),数据直通真实打印机导致乱码——客户端改用通用 PS 驱动
GS-FAIL + 错误输出Ghostscript 渲染失败,看输出内容(常见:GS 目录配置错误、数据损坏)
print failRAW 直通失败,检查打印机权限/状态
PARSEIPP 请求解析失败(客户端与协议不兼容)
完全无日志客户端连的是别的机器/端口,或防火墙拦截
已知限制

  • PS 任务经打印机驱动提交后无法直接取回 spooler 任务号,IPP 响应中的 job-id 固定为 1(不影响打印功能)
  • 队列级暂停/恢复等管理操作需要相应打印机权限(部分打印机要求管理员)
  • 本机 C:\go 为 32 位 Go,产出 windows/386 二进制;在 64 位测试机上经 WOW64 运行偶发调度异常,Win7 32 位目标环境原生稳定
  • Ghostscript 为 AGPL 许可(内部使用免费,闭源商用分发需商业授权)
依赖

  • github.com/OpenPrinting/goipp v1.2.0
  • golang.org/x/sys(windows/386 系统调用)
  • Ghostscript 9.52(32 位,随 gs\ 目录分发,免安装)

回复

使用道具 举报

发表于 昨天 12:17 | 显示全部楼层
我简单测试了一下,好像没反应!
回复

使用道具 举报

发表于 昨天 13:17 | 显示全部楼层
感谢楼主
回复

使用道具 举报

发表于 昨天 14:21 来自手机 | 显示全部楼层
win7下能用吗?弄一个试试,感谢
回复

使用道具 举报

发表于 昨天 14:21 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 昨天 15:53 | 显示全部楼层
不错,谢谢!
回复

使用道具 举报

发表于 昨天 16:28 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-8-29 05:07

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表