# IPPSERVER **Repository Path**: T_show/ippserver ## Basic Information - **Project Name**: IPPSERVER - **Description**: 一个AI生成的打印机共享程序,基于IPP协议和GS程序实现原厂驱动及无驱通用驱动共享。 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-28 - **Last Updated**: 2026-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IPP 打印服务器(Win7 兼容,支持通用 PS 驱动 + 多打印机共享) 基于 Go + [OpenPrinting/goipp](https://github.com/OpenPrinting/goipp) + [Ghostscript 9.52](https://ghostscript.com/) 的 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) | 方法 | 路径 | 说明 | |------|------|------| | 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":"本机名"}` | ## 目录结构 | 文件/目录 | 说明 | |------|------| | `main.go` | 入口:注册 IPP / 网页 / API 路由并启动服务 | | `ipp.go` | IPP 协议处理(goipp 编解码 + 操作分发 + 多打印机路由) | | `psprint.go` | PS/PDF 渲染打印(Ghostscript mswinpr2 调用) | | `webui.go` | 网页管理界面(内嵌 HTML/JS)+ JSON API | | `printer_windows.go` | winspool 打印机枚举 / 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.ps1` | PS 打印链路自测脚本 | ## 构建与运行 使用 `C:\go`(Go 1.20.14 windows/386,纯 Go 无 CGO): ```bat build.bat :: 生成 ippserver.exe(约 7.6MB) ippserver.exe :: 启动后浏览器访问 http://localhost:631/ ``` - `IPP_HEADLESS=1` 环境变量可静默运行 - Ghostscript 默认使用 exe 同目录的 `gs\`,可在网页设置中改为任意路径(含已安装版) - 网页每 5 秒自动刷新状态与任务 ## 客户端接入 1. 服务器开放防火墙:`netsh advfirewall firewall add rule name="IPP Print Server" dir=in action=allow protocol=TCP localport=631` 2. 服务器网页"共享打印机"选项卡勾选目标打印机(如 LJ2400)并保存——**排在第一台的即是默认端点目标** 3. 客户端添加打印机,地址填: - 默认打印机:`http://服务器IP:631/ipp/print` - 指定打印机:`http://服务器IP:631/ipp/print/打印机名` 4. 驱动选择(系统自带,无需下载): - **Win7**:手动选择 **MS Publisher Imagesetter**(通用 PostScript) - **Win10**:**Microsoft PS Class Driver**,或 HP UPD PS 版(功能更全) 5. 打印测试页——服务器"连接日志"出现 `接收任务: 目标打印机=… 路由=Ghostscript渲染` 与 `GS-DONE 耗时=…` 即链路正常 ## Linux 客户端接入(UOS / 麒麟 等 Debian 系) UOS/麒麟基于 Debian + CUPS,两种方式添加通用 PS 网络打印机: **方式一:图形界面(UOS/麒麟 控制中心)** 1. 控制中心 → 打印机 → 添加 → 网络打印机(或"手动添加") 2. 协议选 **IPP**,地址填:`192.168.x.x:631/ipp/print/共享名称` 3. 驱动选择 **Generic → PostScript Printer**(通用 PostScript,系统自带) **方式二:CUPS 网页 / 命令行** ```bash # 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)完全一致。 ## 共享向导(推荐配置方式) 网页"共享打印机"卡片 → **+ 共享向导**,三步完成: 1. **协议测试**:选择待共享打印机,点击 **打印 PS 测试页** / **打印 PCL6 测试页** (服务器把内嵌的中文测试页 RAW 直发打印机,由打印机自身解释)。 根据实际打印结果勾选"支持 PS / 支持 PCL 6": - 清晰打印 = 支持;空白/乱码 = 不支持 - 可选:**添加 PCL 共享入口**(勾选"支持 PCL6"后出现,默认勾选) - 可选:**添加原厂驱动共享入口**(客户端需安装原装驱动,数据直传保真度最高) 2. **共享计划**(按测试结果自动生成,无需选择;共享名称可改): | 检测结果 | 生成的共享入口 | |---|---| | 默认 | `XX-drv`(原厂驱动直连:客户端装原装驱动,保真度最高) | | 默认 + 支持 PS | `XX-ps`(直连 RAW:PS 流直传打印机,不转换) | | 默认 + 不支持 PS | `XX-ps`(PS 转发:客户端通用 PS 驱动,服务器 Ghostscript 渲染) | | 支持 PCL6 | 额外添加 `XX-pcl6`(直连 RAW:客户端用 PCL6 通用驱动) | 3. **客户端接入**:为每个入口展示 Win7/Win10/Linux 添加步骤、URL、驱动厂商及名称(见下表),点"完成并保存"生效。 ## 客户端添加打印机详细帮助 | 入口 | 客户端 | 驱动厂商 / 名称 | 步骤 | |---|---|---|---| | PS(转发或直通) | Win7 | Microsoft / **MS Publisher Imagesetter** | 控制面板→设备和打印机→添加打印机→按名称选择共享打印机→填 `http://服务器:631/ipp/print/共享名` | | PS | Win10/11 | Microsoft / **Microsoft PS Class Driver** | 设置→打印机和扫描仪→添加→不在列表中→按名称选择→同上 URL | | PS | Linux(UOS/麒麟) | Generic / **Generic PostScript Printer** | `lpadmin -p ipp-ps -E -v ipp://服务器:631/ipp/print/共享名 -m drv:///sample.drv/generic.ppd` | | PCL6 | Win7/10/11 | HP / **HP Universal Printing PCL 6**(或厂商 PCL6 通用驱动) | 同上(按名称选择共享打印机) | | PCL6 | Linux | Generic / **PCL Laser** | `lpadmin -p ipp-pcl -E -v ipp://... -m foomatic:Generic-PCL-Laser.ppd` | | 真实打印机 | Win7/10/11 | 打印机制造商 / **该型号官方驱动**(如 Lenovo LJ2405) | 同上 | | 真实打印机 | Linux | 厂商 / **型号 PPD** | `lpadmin -p ipp-raw -E -v ipp://... -m <型号PPD>` | ## 启动失败提示与处理 程序启动时若端口监听失败(被占用/权限不足等),会: 1. **弹出错误对话框**(Windows)或桌面通知(Linux),内容含失败原因与处理建议 2. 将详情写入程序目录的 **`startup-error.log`**(无界面环境也可排查) 3. 退出程序(不会出现"看似在运行实际不服务"的状态) 常见原因与处理: | 原因 | 判别 | 处理 | |---|---|---| | 端口被占用(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 以上端口 | | 防火墙拦截 | 客户端无法访问 | 放行端口(见下文防火墙命令) | | 程序已在运行(单例) | 弹"程序已在运行" | 使用托盘图标,或退出旧实例 | ## 打印报错排查(看连接日志) | 日志现象 | 原因与处理 | |---|---| | 只有"接收任务"和 `GS-START`,无 `GS-DONE` | Ghostscript 被挂起,常见于目标打印机是 *Microsoft Print to PDF* 等弹保存对话框的虚拟打印机——在网页上取消其共享或不要排首位 | | `接收任务: 路由=RAW直通` | 客户端驱动不是 PS 类(未发 postscript),数据直通真实打印机导致乱码——客户端改用通用 PS 驱动 | | `GS-FAIL` + 错误输出 | Ghostscript 渲染失败,看输出内容(常见:GS 目录配置错误、数据损坏) | | `print fail` | RAW 直通失败,检查打印机权限/状态 | | `PARSE` | IPP 请求解析失败(客户端与协议不兼容) | | 完全无日志 | 客户端连的是别的机器/端口,或防火墙拦截 | ## 已知限制 - 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\` 目录分发,免安装) ## 支持与捐赠 本软件由 **T型台** 个人开发并持续维护,全部功能免费开源。 如果它帮你解决了 Win10 SMB 共享的繁琐、让 Linux 客户端用上了没有 Linux 驱动的打印机, 欢迎请作者喝杯咖啡——**微信扫下方二维码打赏**即可(金额随意,感谢每一份支持!):
微信收款码

微信收款码 · 请备注"IPPSERVER"

捐赠完全自愿,**不影响任何功能使用**;有问题欢迎提 Issue 反馈。