You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#中设置打印机自定义DPI以解决打印模糊问题?

解决C#中USB打印机自定义DPI打印的问题

我完全懂你的困扰——明明打印机支持203dpi,但程序输出的100dpi内容模糊到没法用。微软官方文档对自定义DPI的说明确实有点语焉不详,我来分享两个亲测有效的解决方法:

方法一:通过PrinterSettings配置自定义分辨率

有些打印机允许直接在程序里指定自定义DPI,你可以先检查打印机是否支持这个功能,再手动设置:

using System.Drawing;
using System.Drawing.Printing;

var printDoc = new PrintDocument();
// 替换成你的USB打印机名称,或者留空用默认打印机
printDoc.PrinterSettings.PrinterName = "你的USB打印机型号";

if (printDoc.PrinterSettings.SupportsCustomPageSettings)
{
    // 设置打印分辨率为203dpi(X和Y方向)
    printDoc.DefaultPageSettings.PrintResolution.X = 203;
    printDoc.DefaultPageSettings.PrintResolution.Y = 203;
    
    printDoc.PrintPage += (sender, e) =>
    {
        // 让绘图对象的DPI和打印机设置匹配
        e.Graphics.DpiX = 203;
        e.Graphics.DpiY = 203;
        // 设置单位为Document,这样坐标会基于DPI计算,避免尺寸混乱
        e.Graphics.PageUnit = GraphicsUnit.Document;
        
        // 示例:打印清晰文本
        using (var font = new Font("Arial", 10, FontStyle.Regular))
        {
            e.Graphics.DrawString("203dpi测试文本", font, Brushes.Black, new PointF(10, 10));
        }
        
        // 示例:处理图像(如果原图DPI不是203,需要缩放适配)
        var img = Image.FromFile("your-image.png");
        float scaleX = 203f / img.HorizontalResolution;
        float scaleY = 203f / img.VerticalResolution;
        e.Graphics.DrawImage(img, new RectangleF(10, 50, img.Width * scaleX, img.Height * scaleY));
    };
    
    printDoc.Print();
}

如果这个方法没生效(比如打印机驱动不支持直接设置PrintResolution的X/Y),试试更可靠的第二种方法。

方法二:直接控制Graphics对象的DPI

很多时候,打印机驱动不会暴露自定义分辨率选项,但你可以直接在打印事件里强制修改绘图对象的DPI,确保输出匹配203dpi:

using System.Drawing;
using System.Drawing.Printing;

var printDoc = new PrintDocument();
printDoc.PrintPage += (sender, e) =>
{
    // 强制设置绘图DPI为203,忽略默认的100dpi
    e.Graphics.DpiX = 203;
    e.Graphics.DpiY = 203;
    // 一定要设置这个单位,否则坐标会按像素计算,导致尺寸错误
    e.Graphics.PageUnit = GraphicsUnit.Document;
    
    // 打印文本:这里的字体大小是基于1/100英寸,结合203dpi会输出正确的物理尺寸
    using (var font = new Font("Courier New", 12, FontStyle.Bold))
    {
        e.Graphics.DrawString("清晰的条码/文本", font, Brushes.Black, 10, 10);
    }
    
    // 处理图像:缩放原图到203dpi的尺寸
    var printImage = Image.FromFile("barcode.png");
    float horizontalScale = 203f / printImage.HorizontalResolution;
    float verticalScale = 203f / printImage.VerticalResolution;
    e.Graphics.DrawImage(printImage, 
        new RectangleF(10, 60, printImage.Width * horizontalScale, printImage.Height * verticalScale));
};

printDoc.Print();

几个关键提醒

  • 图像适配:如果你的原始图像是96dpi这类低分辨率,直接打印会被拉伸模糊,必须按目标DPI/原图DPI的比例缩放,才能保证清晰。
  • 驱动兼容性:先去打印机的系统属性里确认是否能手动设置203dpi,如果系统里都没法设置,程序里也大概率不行,可能需要更新驱动。
  • 验证方法:打印后用尺子量文本的物理大小——比如10pt的字体,在203dpi下应该是约3.5mm高(1pt=1/72英寸,1英寸=25.4mm),这样就能确认DPI是否真的生效了。

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

火山引擎 最新活动