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"; } }
关键说明
虚拟打印机与物理打印机的差异
Microsoft Print to PDF这类虚拟打印机的驱动会将作业参数同步到队列的CurrentJobSettings中,而佳能iR-ADVC3525这类物理打印机的驱动严格区分队列默认配置和作业专属配置,不会自动覆盖队列设置。异常处理的必要性
部分场景下(比如作业已完成并被假脱机系统清理),JobPrintTicket可能抛出PrintSystemException或返回null,因此需要添加异常捕获和默认值处理。验证方式
提交一个设置为A3的打印作业到物理打印机,代码会直接读取该作业提交时的JobPrintTicket,返回正确的ISOA3,无需修改打印机队列的默认偏好。
内容的提问来源于stack exchange,提问作者Aiorio
相关产品推荐
相关产品推荐

