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

如何在打印预览中实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:31:11