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

.NET Framework 4.7.2中System.Drawing.Printing的PrinterSettings初始化报错

解决方案

问题根源

.NET Framework 4.7.2自带System.Drawing.Printing相关组件,你安装的System.Drawing.Common v8.0.4是针对.NET Core/.NET 5+的包,和框架自带的API冲突,导致初始化PrinterSettings失败。

第一步:修复依赖问题

卸载已安装的System.Drawing.Common NuGet包,直接使用.NET Framework自带的System.Drawing.Printing命名空间即可。

第二步:修正代码错误

你的代码存在两处逻辑错误,移除不必要依赖后,修正后的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing.Printing;

string printerName = "PrinterName";
int l_Pages = 0; 

// 初始化PrinterSettings,此时不会报错
var printerSettings = new PrinterSettings(); 
// 获取所有已安装打印机
var installedPrinters = PrinterSettings.InstalledPrinters.Cast<string>().ToList(); 
// 查找目标打印机索引(找不到返回-1)
int z = installedPrinters.FindIndex(p => p.Equals(printerName, StringComparison.OrdinalIgnoreCase));

if (l_Pages == 0)
{
    // 修正判断逻辑:找不到打印机时用第一个
    if (z == -1) 
    {
        printerSettings.PrinterName = installedPrinters[0];
    }
    else
    {
        // 修正变量名:z而非i
        printerSettings.PrinterName = installedPrinters[z]; 
    }
}

第三步:实现完整功能

1. 获取已安装打印机

直接用PrinterSettings.InstalledPrinters即可,示例:

var allPrinters = PrinterSettings.InstalledPrinters.Cast<string>().ToList();
foreach(var printer in allPrinters)
{
    Console.WriteLine($"打印机:{printer}");
}

2. 设置默认打印机

.NET Framework中PrinterSettings没有直接设置默认打印机的API,需要调用Windows原生API实现:

using System.Runtime.InteropServices;

public static class PrinterHelper
{
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool SetDefaultPrinter(string printerName);
}

// 使用示例:
bool success = PrinterHelper.SetDefaultPrinter("目标打印机名称");
if(success)
{
    Console.WriteLine("默认打印机设置成功");
}
else
{
    Console.WriteLine("设置失败,错误码:" + Marshal.GetLastWin32Error());
}

注意:此操作需要管理员权限,否则可能执行失败。

3. 调整打印方向和缩放

通过PrinterSettings和PageSettings实现:

// 设置打印方向为横向
printerSettings.DefaultPageSettings.Landscape = true;

// 设置缩放比例(比如150%)
printerSettings.DefaultPageSettings.Scale = 150;

// 或者针对单页单独设置
var pageSettings = new PageSettings(printerSettings);
pageSettings.Landscape = true;
pageSettings.Scale = 120;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:52:40