# EmfPrinter **Repository Path**: alab/emfprinter ## Basic Information - **Project Name**: EmfPrinter - **Description**: 使用codebuddy ai、glm和minimax制造的emf虚拟打印机,可以打印输出emf矢量图片格式,用于从cad的dwg文件或其他文件输出emf格式,以便于写入方案,word文件中。 ai说svg格式不太兼容旧版本的word软件,png格式不是矢量图片,emf格式本事就是微软出的,兼容性还可以,之前在github上看到别人的太老了,所以最近用ai做了这个,md格式的手册和说明也是ai 做的 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-11 - **Last Updated**: 2026-06-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EMF 虚拟打印机 一个运行在 Windows 11 上的虚拟打印机程序,用于将任何可打印的文档(包括 DWG 文件)输出为 EMF 格式的矢量图片。 ## 文档导航 - 📖 **[用户手册 (USER_MANUAL.md)](./USER_MANUAL.md)** — 安装、卸载、日常使用指南(适合终端用户) - 📘 **[开发说明 (DEVELOPER_GUIDE.md)](./DEVELOPER_GUIDE.md)** — 程序架构、思路、扩展开发指南(适合开发者) - 📄 **README.md**(本文)— 项目概览 ## 功能特点 - **矢量输出**: 输出标准 EMF(Enhanced Metafile)矢量格式,无损缩放 - **广泛兼容**: 适用于 DWG(AutoCAD)、Word、Excel、PDF 等所有可打印文档 - **简单稳定**: 基于 Windows 原生打印假脱机机制,无自定义驱动/DLL - **系统托盘**: 后台运行,自动监控打印作业 - **灵活命名**: 支持自定义文件命名模式 - **Windows 11**: 完全兼容 Win11 打印架构 ## 系统要求 - Windows 10 (1809+) 或 Windows 11 - .NET 8.0 Runtime - 管理员权限(仅安装时需要) ## 快速开始 ### 方式一:使用安装脚本(推荐) 1. 安装 .NET 8 Runtime(如尚未安装) 2. 构建项目(或下载发布版本) 3. **以管理员身份**运行 PowerShell: ```powershell .\scripts\install.ps1 ``` 4. 启动程序: ``` .\publish\EmfPrinter.exe ``` ### 方式二:命令行安装 ```powershell # 以管理员身份运行 .\EmfPrinter.exe --install # 正常启动 .\EmfPrinter.exe ``` ## 使用方法 1. **安装打印机**: 首次使用需以管理员身份运行安装 2. **启动监控**: 运行 `EmfPrinter.exe`,程序将驻留系统托盘 3. **打印文档**: 在任何应用程序中打印,选择 "EMF Virtual Printer" 4. **获取 EMF**: 程序自动提取 EMF 矢量页面并保存到输出目录 ### 从 AutoCAD 打印 DWG 1. 在 AutoCAD 中打开 DWG 文件 2. 按 Ctrl+P 打开打印对话框 3. 打印机选择 "EMF Virtual Printer" 4. 设置纸张大小(建议选择大尺寸如 A1/A0 以获得高精度) 5. 点击打印 6. 程序自动将每页保存为独立 .emf 文件 ## 工作原理 ``` 应用程序 → Windows GDI → EMF假脱机文件(.SPL) → EmfPrinter监控 → 提取EMF页面 → 保存.emf文件 ``` 1. 虚拟打印机使用 Windows 内置驱动(Microsoft Print To PDF) 2. Windows 假脱机器自动将打印内容渲染为 EMF 格式 3. 程序监控假脱机目录中的 .SPL 文件 4. 自动解析 .SPL 文件中的 EMF 记录 5. 提取每一页为独立的 .emf 矢量文件 ## 配置 右键系统托盘图标 → 配置打印机 | 选项 | 说明 | 默认值 | |------|------|--------| | 输出目录 | EMF 文件保存位置 | 文档\EMF输出 | | 命名模式 | 文件命名规则 | {document}_{date}_{page} | | 输出 DPI | 矢量渲染分辨率 | 600 | | 自动删除作业 | 处理后清理打印队列 | 是 | | 显示通知 | 完成后弹出通知 | 是 | ### 命名模式变量 - `{document}` - 文档名称 - `{date}` - 日期 (YYYYMMDD) - `{time}` - 时间 (HHMMSS) - `{page}` - 页码 (三位数) ## 构建项目 ```bash # 安装 .NET 8 SDK # 然后: build.bat ``` 或手动构建: ```bash dotnet publish EmfPrinter/EmfPrinter.csproj -c Release -r win-x64 -o publish ``` ## 卸载 ```powershell # 以管理员身份运行 .\scripts\uninstall.ps1 # 或 .\EmfPrinter.exe --uninstall ``` ## 常见问题 **Q: 安装失败提示找不到驱动?** A: 运行 `可选功能` 确保 "Microsoft Print to PDF" 已启用。或手动安装打印机时选择其他 PostScript 驱动。 **Q: 打印后没有生成 EMF 文件?** A: 确保 EmfPrinter.exe 正在运行(检查系统托盘),且打印机配置中"保留已打印文档"已启用。 **Q: 输出的 EMF 文件无法打开?** A: 尝试使用系统自带的"画图"或 IrfanView 打开。EMF 是矢量格式,某些查看器可能不完全支持。 **Q: DWG 打印后页面为空?** A: 在 AutoCAD 打印对话框中,确保选择了正确的打印范围和打印比例。 ## 技术细节 - **开发语言**: C# / .NET 8 - **打印驱动**: 使用 Windows 内置 "Microsoft Print To PDF" 驱动 - **EMF 提取**: 通过扫描 .SPL 文件中的 ENHMETAHEADER 签名提取矢量页面 - **假脱机监控**: FileSystemWatcher + 轮询双重机制确保不遗漏 - **无需自定义 DLL**: 不使用自定义端口监视器或打印处理器 ## 项目结构 ``` ├── EmfPrinter/ # 主项目 │ ├── Native/NativeMethods.cs # Windows API 声明 │ ├── Models/AppConfig.cs # 配置模型 │ ├── Services/ │ │ ├── PrinterSetup.cs # 打印机安装管理 │ │ ├── SpoolMonitor.cs # 假脱机文件监控 │ │ └── EmfExtractor.cs # EMF 页面提取 │ └── Program.cs # 主程序 + 系统托盘 ├── scripts/ │ ├── install.ps1 # 安装脚本 │ └── uninstall.ps1 # 卸载脚本 ├── build.bat # 构建脚本 └── README.md # 本文档 ``` ## 许可证 mulan License