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

C#打印Fargo DTC1250E卡片出现左上边距问题求助

解决Fargo DTC1250E打印机C#打印时左上偏移问题

问题说明

使用Fargo DTC1250E卡片打印机,通过C#读取模板图并绘制文本后,Windows直接打印图片正常,但用C#代码打印时出现左上偏移。即使设置Margins(0,0,0,0)、文本位置设为(0,0)仍无效,且打印预览显示正常。

核心原因

  1. OriginAtMargins = true会强制打印原点从「边距位置」开始,即使边距设为0,打印机存在硬件最小可打印边距,导致实际打印原点偏移。
  2. 打印时未考虑打印机的实际可打印区域,直接按(0,0)绘制会被打印机的硬件边距截断/偏移。
  3. Bitmap分辨率与打印机实际分辨率不匹配,导致缩放时出现偏移。

解决步骤

1. 关闭OriginAtMargins并统一PageSettings设置

移除myPrintDocument1.OriginAtMargins = true,该属性会覆盖边距设置,强制从系统默认边距开始打印。同时避免在PrintPage事件中重复设置PageSettings,防止参数冲突。

2. 获取打印机实际可打印区域,调整绘制坐标

通过PrinterSettings获取打印机的可打印边界,计算偏移量后调整DrawImage的位置,抵消硬件边距的影响。

3. 统一Bitmap与打印机的分辨率

Fargo DTC1250E的原生打印分辨率为300dpi,将Bitmap的分辨率设置为300x300dpi,避免缩放导致的偏移。

修改后的代码示例

绘制代码调整

// 改为打印机原生300dpi
bmp.SetResolution(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.High;

// 保持文本绘制位置不变
RectangleF rectfAppleId = new RectangleF(0, 0, 500, 100);
g.DrawString(cardInfo.AppleId, new Font(fontName, GetLocations("applieid", 5), FontStyle.Regular), Brushes.Black, rectfAppleId);

打印代码调整

private void Print(Bitmap img)
{
    System.Drawing.Printing.PrintDocument myPrintDocument1 = new System.Drawing.Printing.PrintDocument();
    PrintDialog myPrinDialog1 = new PrintDialog();
    
    // 统一设置打印参数,移除OriginAtMargins
    myPrintDocument1.DefaultPageSettings.Landscape = true;
    myPrintDocument1.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
    // 卡片尺寸单位为百分之一英寸,336=3.36英寸,211=2.11英寸,对应标准卡片尺寸
    myPrintDocument1.DefaultPageSettings.PaperSize = new PaperSize("cardSize", 336, 211);
    
    currentPrintBitMap = img;
    myPrintDocument1.PrintPage += myPrintDocument2_PrintPage;
    
    ComboboxItem selected = (ComboboxItem)comboBox1.SelectedItem;
    myPrinDialog1.Document = myPrintDocument1;
    myPrinDialog1.PrinterSettings.PrinterName = selected.Value.ToString();
    
    if (myPrinDialog1.ShowDialog() == DialogResult.OK)
    {
        myPrintDocument1.Print();
    }
}

private void myPrintDocument2_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    if (currentPrintBitMap != null)
    {
        e.HasMorePages = false;
        
        // 获取打印机的可打印区域偏移量
        int offsetX = (int)e.PageSettings.PrintableArea.X;
        int offsetY = (int)e.PageSettings.PrintableArea.Y;
        
        // 偏移坐标,抵消硬件边距
        e.Graphics.DrawImage(currentPrintBitMap, -offsetX, -offsetY);
        
        currentPrintBitMap.Dispose();
    }
}

额外验证点

  • 检查打印机驱动是否为最新版本,旧驱动可能存在边距计算错误。
  • 在打印机设置中确认「无边距打印」已开启(部分型号需手动开启该选项)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:03:32