SSIS调用PDFtoPrinter静默打印PDF服务器端无输出问题求解
排查思路
权限类问题排查
- 首先确认SSIS运行时的服务账户:SSIS部署到服务器后,默认运行的是SQL Server代理服务账户或SSIS目录的执行账户,不是你本地登录的用户账户。先检查该账户是否有以下权限:
- 目标打印机
Printer1的打印权限,若为网络打印机需额外确认该账户可访问打印队列、提交打印任务 - 目标PDF文件、PDFtoPrinter.exe的读取和执行权限
- 目标打印机
- 可临时将SSIS执行账户替换为本地测试正常的账户做对比测试,若替换后可正常打印即可锁定为权限问题。
环境差异排查
- 直接在服务器本地打开CMD执行日志中的命令:
"\\xxx\PDFtoPrinter.exe" "\\xxx\sample.pdf" "Printer1" /s,确认是否能正常打印、有无报错弹窗。若手动执行也无法打印,说明问题出在服务器本身环境,和SSIS无关。 - 检查服务器是否安装了PDFtoPrinter依赖的VC++运行库,部分精简版服务器系统会缺失这类依赖,导致工具静默退出无输出。
打印队列排查
- 执行SSIS任务后立刻打开服务器的打印队列,查看
Printer1的队列中是否有任务短暂出现后消失:若有则说明是打印机本身拒收任务,大概率是打印驱动不兼容、纸张设置不匹配导致;若完全没有任务出现,说明PDFtoPrinter未成功将任务提交到打印队列。
日志补充排查
- 你当前仅捕获了SSIS的执行日志,未捕获PDFtoPrinter本身的输出,可修改Execute Process Task配置,将stdout和stderr输出到本地文本文件而非SSIS变量,执行命令追加
>> C:\print_log.txt 2>&1即可查看工具本身的错误输出。
可行解决方案
方案1(优先适配PDFtoPrinter需求)
- 给SSIS执行账户授予打印机权限:打开打印机属性→安全→添加SSIS运行的服务账户,勾选「打印」权限。若为网络打印机,需要先在服务账户上下文下完成打印机安装:
- 用SSIS运行的服务账户登录服务器
- 访问网络打印机路径,完成驱动安装和设备添加
- 确认打印机名称和你参数中填写的
Printer1完全一致,包括大小写、空格和特殊符号
- 修改Execute Process Task的执行选项,勾选「FailTaskIfReturnCodeIsNotSuccessValue」,设置SuccessValue为0,同时将超时时间调整为60000毫秒,避免工具未完成任务提交就被SSIS强制终止。
方案2(替代静默打印方案)
- 若PDFtoPrinter始终无法排查问题,可替换为SumatraPDF实现静默打印,该工具原生支持无GUI运行,单文件无需安装,日志输出更完善,执行命令为:
SumatraPDF.exe -print-to "Printer1" -silent "\\xxx\sample.pdf"。
方案3(Script Task优化方案)
- 若使用Script Task实现,可在C#代码中捕获进程的退出代码、标准输出和错误信息,写入自定义日志方便定位问题,参考代码片段:
bool fireAgain = false; Process p = new Process(); p.StartInfo.FileName = @"\\xxx\PDFtoPrinter.exe"; p.StartInfo.Arguments = @"\""\\xxx\sample.pdf\"" \""Printer1\"" /s"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.Start(); string output = p.StandardOutput.ReadToEnd(); string error = p.StandardError.ReadToEnd(); p.WaitForExit(); // 将输出信息写入SSIS日志或本地文件 Dts.Events.FireInformation(0, "PrintLog", $"ExitCode: {p.ExitCode}, Output: {output}, Error: {error}", "", 0, ref fireAgain);
内容的提问来源于stack exchange,提问作者wonderk
相关产品推荐
相关产品推荐

