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

C#获取物理打印机打印作业纸张尺寸始终为ISOA4的问题求助

问题解决:获取打印作业真实纸张尺寸

核心问题

你当前的代码错误读取了打印队列的默认打印配置,而非单个作业自身的打印参数。printJob.HostingPrintQueue.CurrentJobSettings.CurrentPrintTicket返回的是打印机队列的全局默认设置,不是当前作业提交时指定的纸张尺寸——这就是为什么修改队列默认偏好为A3后能返回正确值,但作业单独设置A3时失效的原因。

解决方案

改用PrintSystemJobInfo.JobPrintTicket属性获取当前打印作业专属的打印票证,该属性存储了作业提交时指定的所有打印参数,包括纸张尺寸。

修改后的Job构造函数代码

public Job(PrintSystemJobInfo printJob)
{
    Name = printJob.Name;
    Status = printJob.JobStatus.ToString();
    Owner = Environment.UserName;
    Priority = printJob.Priority.ToString();
    TimeSubmitted = printJob.TimeJobSubmitted;
    DriverName = printJob.HostingPrintQueue.FullName;
    JobId = printJob.JobIdentifier;
    TotalPages = printJob.NumberOfPages;

    // 使用作业专属的JobPrintTicket替代队列的默认配置
    PrintTicket jobPrintTicket = null;
    try
    {
        jobPrintTicket = printJob.JobPrintTicket;
    }
    catch (PrintSystemException ex)
    {
        // 处理无法获取作业打印票证的情况,比如作业已完成被清理
        Console.WriteLine($"无法获取作业{printJob.JobIdentifier}的打印票证: {ex.Message}");
    }

    if (jobPrintTicket != null)
    {
        // 获取作业的纸张尺寸
        var pageMediaSize = jobPrintTicket.PageMediaSize;
        string? paperSize = pageMediaSize?.PageMediaSizeName.ToString();
        PaperSize = paperSize is null ? "format inconnu" : paperSize;

        // 获取纸张尺寸的具体数值
        double? paperLength = pageMediaSize?.Height;
        double? paperWidth = pageMediaSize?.Width;
        PaperLength = paperLength is null ? 0 : Math.Round((double)paperLength * _pixelSize);
        PaperWidth = paperWidth is null ? 0 : Math.Round((double)paperWidth * _pixelSize);

        // 获取作业的颜色设置
        var outputColor = jobPrintTicket.OutputColor;
        Color = outputColor?.Value.ToString() ?? "Unknown";
    }
    else
    {
        // 无法获取作业打印票证时的默认值
        PaperSize = "format inconnu";
        PaperLength = 0;
        PaperWidth = 0;
        Color = "Unknown";
    }
}

关键说明

  1. 虚拟打印机与物理打印机的差异
    Microsoft Print to PDF这类虚拟打印机的驱动会将作业参数同步到队列的CurrentJobSettings中,而佳能iR-ADVC3525这类物理打印机的驱动严格区分队列默认配置和作业专属配置,不会自动覆盖队列设置。

  2. 异常处理的必要性
    部分场景下(比如作业已完成并被假脱机系统清理),JobPrintTicket可能抛出PrintSystemException或返回null,因此需要添加异常捕获和默认值处理。

  3. 验证方式
    提交一个设置为A3的打印作业到物理打印机,代码会直接读取该作业提交时的JobPrintTicket,返回正确的ISOA3,无需修改打印机队列的默认偏好。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:43:13