navicat 16 定时导出 pdf 必须依赖用户登录态和预存的 .njb 文件,因 gdi+ 渲染引擎需完整 gui 上下文;后台静默运行时因缺失窗口句柄与字体上下文,导致导出空白、0 字节或失败不报错。

Navicat 16 无法在无 GUI 上下文的后台环境中导出 PDF,所谓“定时导出 PDF”必须依赖 Windows 用户登录态 + --batch-job 调用预存的 .njb 文件,且版本不能低于 15.0 Premium。
为什么直接勾选“自动运行”导出 PDF 总是失败
根本原因是 PDF 渲染引擎(GDI+)需要完整图形界面会话。Navicat 后台静默运行时拿不到窗口句柄和字体上下文,导致导出为空白或直接跳过 —— 不报错、不写日志、不生成文件。
- 错误现象包括:生成 0 字节 PDF、打开后仅显示页眉无内容、任务计划里显示“已运行”但目标目录无文件
- 旧版 Navicat(如 12 或 14)根本不支持命令行触发 PDF 导出,
--batch-job参数会被忽略 - 即使 Navicat 正常登录着,Windows 任务计划若设为“不管用户是否登录都要运行”,PDF 渲染线程仍初始化失败
必须用 .njb 文件 + Windows 任务计划组合
.njb 是 Navicat 封装了连接、查询、报表模板、页面设置和导出路径的二进制作业包,不是普通 XML 或脚本,不可手写或修改。
- 先在 GUI 中打开报表 → 点右上角 Export → 选 PDF → 设置好页边距、嵌入字体、图表选项 → 务必点 Save As Template,存为
daily_report.njb - 导出路径必须填绝对路径(如
C:\Reports\{yyyy}{mm}{dd}_report.pdf),注意:{yyyy}这类占位符在--batch-job模式下不生效,得靠 PowerShell 脚本动态替换后再调用 - 保存后双击该
.njb文件手动运行一次,目的是让 Navicat 缓存数据库密码;否则命令行静默卡在认证环节
Windows 任务计划中关键配置项
参数写错一个字符、路径少一对引号、上下文选错,都会导致 PDF 导出无声失败。
- 程序路径必须是完整路径并加英文双引号:
"C:\Program Files\PremiumSoft\Navicat Premium 16\navicat.exe" - 参数栏严格写:
--batch-job="C:\Jobs\daily_report.njb"(注意等号前后无空格,路径含空格必须引号包裹) - 「安全选项」中:必须勾选“只在用户登录时运行”,同时勾选“使用最高权限运行”
- 「起始于(可选)」字段填
C:\Jobs\这类纯英文短路径,不能留空,否则 Navicat 找不到本地驱动或临时资源
导出 PDF 时中文乱码、缺字体、图表不显示
这不是编码问题,而是 .njb 绑定的渲染环境与实际执行环境不一致。
- 确保保存
.njb时,Navicat 当前窗口缩放比例是 100%(非 125% 或 150%),高 DPI 缩放会导致 PDF 布局错乱 - 报表中用的中文字体(如微软雅黑、思源黑体)必须已安装在系统中,且为 TrueType 格式;OpenType 字体可能无法嵌入
- 如果报表依赖自定义 SQL 查询,务必确认该查询已“保存为查询”并绑定到报表,不能是临时 SQL 窗口内容 ——
--batch-job模式下看不到未保存的语句
最易被忽略的是:每次更新报表设计(比如加了个图表或改了字段顺序)后,必须重新 Save As Template 生成新的 .njb,旧文件不会自动同步变更。PDF 导出不像 CSV 那样容错,差一点上下文就全盘失效。











