C#打印Fargo DTC1250E卡片出现左上边距问题求助
解决Fargo DTC1250E打印机C#打印时左上偏移问题
问题说明
使用Fargo DTC1250E卡片打印机,通过C#读取模板图并绘制文本后,Windows直接打印图片正常,但用C#代码打印时出现左上偏移。即使设置Margins(0,0,0,0)、文本位置设为(0,0)仍无效,且打印预览显示正常。
核心原因
OriginAtMargins = true会强制打印原点从「边距位置」开始,即使边距设为0,打印机存在硬件最小可打印边距,导致实际打印原点偏移。- 打印时未考虑打印机的实际可打印区域,直接按(0,0)绘制会被打印机的硬件边距截断/偏移。
- 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
相关产品推荐
相关产品推荐

