You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ghostscript使用mswinpr2打印时C#调用弹出打印对话框如何解决

问题根因

  1. Ghostscript原生API gsapi_init_with_args 要求传入的参数数组首位必须为执行程序名占位(可任意填写,无实际意义),你当前传入的参数数组缺少该占位项,导致首位有效参数被Ghostscript误判为程序名丢弃,后续所有参数整体错位,打印机配置参数未被正确识别,因此触发默认的打印机选择弹窗。
  2. 你当前对sOutputFile的引号包裹规则有误,%printer%前缀不需要被引号包裹,仅当打印机名称包含空格时需要用引号包裹打印机名称部分,否则会导致%printer%前缀识别失败,无法锁定目标打印机。

解决方法

1. 调整参数数组结构

首先在参数数组最前面添加程序名占位,同时修正sOutputFile的引号位置,还可新增禁止弹窗的强制参数,修改后的代码如下:

private static bool DoGhostscriptPrint(string printerName, string pdfFilename)
{
    try
    {
        String[] ghostScriptArguments = { 
            "gswin64c", // 新增占位参数,对应命令行的可执行程序路径
            "-dBATCH", "-dNOPAUSE", "-dSAFER", "-dNoCancel",
            "-dQueryUser=0", // 新增参数,强制禁止mswinpr2弹出任何交互窗口
            "-dNumCopies=1", "-sDEVICE=mswinpr2", 
            // 调整引号位置,仅包裹打印机名称,%printer%放在引号外
            String.Format("-sOutputFile=%printer%\"{0}\"", printerName),
            "-f", pdfFilename
        };
        GhostScript.CallAPI(ghostScriptArguments);
        return true;
    }
    catch (Exception ex)
    {
        Logger.Error("Unable to Print using Ghostscript: " + ex.Message + Environment.NewLine + ex.StackTrace);
        return false;
    }
}

2. 权限验证

确认你的.NET应用运行身份有目标打印机的访问权限,权限不足时也会触发打印机选择弹窗。

3. 参数校验

可通过日志输出完整的传入参数,逐位和正常执行的命令行参数比对,确认无参数错位、转义错误问题。


内容的提问来源于stack exchange,提问作者Pradeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:18:03