如何在打印预览中实现A4纸多列排列打印二维码
A4纸多列二维码打印修改方案
核心修改逻辑
- 新增列位置跟踪变量,自动计算A4页边距范围内可容纳的二维码列数,横向排布满后自动换行
- 保留原有的按字段值打印对应份数二维码的逻辑,纵向排满整页后自动触发分页
- 所有尺寸参数可按需调整,适配不同大小的二维码展示需求
修改后完整代码
// 全局状态变量 private int curRow = 0; private int curCopy = 0; private int curCol = 0; // 打印布局配置 可根据实际需求调整数值 private const int QrCodeSize = 120; // 二维码正方形边长(像素) private const int ItemGap = 25; // 二维码块之间的间距(像素) private const int LabelHeight = 30; // 二维码下方编码文字的高度(像素) private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { curRow = 0; curCopy = 0; curCol = 0; } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { var curY = e.MarginBounds.Y; // 自动计算当前页可容纳的总列数 int availableWidth = e.MarginBounds.Width; int totalColumns = Math.Max(1, availableWidth / (QrCodeSize + ItemGap)); int blockTotalHeight = QrCodeSize + LabelHeight + ItemGap; using (var fontNormal = new Font("Arial", 12)) using (var sf = new StringFormat()) { sf.Alignment = sf.LineAlignment = StringAlignment.Center; for (int row = curRow; row < dt.Rows.Count; row++) { DataRow dr = dt.Rows[row]; if (!string.IsNullOrEmpty(dr.Field<string>(1)) && int.TryParse(dr.Field<string>(4)?.ToString(), out int copies)) { for (int i = curCopy; i < copies; i++) { // 列数排满时自动换行 if (curCol >= totalColumns) { curCol = 0; curY += blockTotalHeight; } // 纵向超出页面范围时 触发新页 if (curY + blockTotalHeight >= e.MarginBounds.Bottom) { curCopy = i; curCol = 0; e.HasMorePages = true; return; } // 计算当前二维码和标签的绘制位置 int curX = e.MarginBounds.X + curCol * (QrCodeSize + ItemGap); var imgRect = new Rectangle(curX, curY, QrCodeSize, QrCodeSize); var labelRect = new Rectangle(curX, imgRect.Bottom, QrCodeSize, LabelHeight); // 绘制二维码和对应编码 e.Graphics.DrawImage(GenerateQRCODE(dr[1].ToString()), imgRect); e.Graphics.DrawString(dr[1].ToString(), fontNormal, Brushes.Black, labelRect, sf); // 移动到下一列位置 curCol++; } } // 当前行数据所有份数打印完成 重置状态 curRow = row + 1; curCopy = 0; } } // 所有内容打印完成 恢复按钮状态 refreshprintbtn.Enabled = true; }
配置说明
- 调整
QrCodeSize可以修改单个二维码的显示大小,代码会自动重新计算每页可排布的列数 - 调整
ItemGap可以修改二维码块之间的留白距离,避免内容过于拥挤 - 如果需要固定列数,直接把
totalColumns的计算逻辑替换为固定数值即可,例如int totalColumns = 3;即为固定3列排布
内容的提问来源于stack exchange,提问作者Molnar Istvan
相关产品推荐
相关产品推荐

