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

C#中PrintDocument打印多份副本时如何实现连续页码

问题根因

通过PrinterSettings.Copies设置多副本时,系统只会将单页渲染结果传输1次给打印机,由打印机硬件自行完成重复输出。该流程下PrintPage事件仅触发1次,页码计数器仅累加1次,所有副本的页码都是首次渲染时的固定值,无法连续递增。

修复方案

核心逻辑是放弃打印机硬件多副本能力,改为在代码层逐页渲染所有副本,确保每一份副本的渲染都能触发PrintPage事件,让页码计数器正常递增:

  • 打印任务启动前,初始化页码计数器为起始值(通常为1),同时记录需要打印的总副本数
  • 每完成1页渲染后,判断是否还有未打印的副本:有则设置e.HasMorePages = true触发下一页渲染,无则设为false结束打印任务
  • 移除原有PrinterSettings.Copies的赋值逻辑,保持默认单份打印即可
修正后代码
// 页码计数器
private int pagenum;
// 总需要打印的副本数
private int totalCopies;

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    using (var g = e.Graphics)
    {
        using (var fnt = new Font("Courier New", 10, FontStyle.Bold))
        {
            string content = Contenido.Text;

            Barcode codigo = new Barcode();
            codigo.Alignment = AlignmentPositions.CENTER;
            codigo.LabelFont = new Font(FontFamily.GenericMonospace, 8, FontStyle.Bold);
            codigo.IncludeLabel = true;

            Image img = codigo.Encode(TYPE.CODE128, content, Color.Black, Color.White, 250, 70);
            pictureBox.Image = img;

            var f = new Font("Courier New", 8, FontStyle.Bold);

            g.DrawString("SEMayr", fnt, Brushes.Black, 147, 10);
            g.DrawString("1er. Turno", fnt, Brushes.Black, 150, 40);
            g.DrawImage(pictureBox.Image, 98, 168, 201, 55);
            // 绘制当前页码
            e.Graphics.DrawString("Pg " + pagenum, f, Brushes.Black, 215, 230);

            var caption = textBox1.Text;
            g.DrawString(caption, fnt, Brushes.Black, 118, 70);

            // 页码自增
            pagenum++;
            // 仍有未打印副本时,触发下一页打印
            e.HasMorePages = pagenum <= totalCopies;
        }
    }
}

private void button2_Click(object sender, EventArgs e)
{
    try
    {
        // 打印前初始化参数
        totalCopies = Convert.ToInt32(label4.Text);
        pagenum = 1; // 页码从1开始计数

        PrintDocument pd = new PrintDocument();
        pd.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);
        pd.PrinterSettings.PrinterName = "Datamax";
        // 不再设置Copies属性,保持默认值1即可
        PageSettings pa = new PageSettings();
        pa.Margins = new Margins(0, 0, 0, 0);
        pd.DefaultPageSettings.Margins = pa.Margins;
        PaperSize ps = new PaperSize("Custom", 403, 244);
        pd.DefaultPageSettings.PaperSize = ps;

        pd.Print();
    }
    catch (Exception exp)
    {
        MessageBox.Show("Printing " + exp.Message);
    }
}
扩展说明

如果单份副本包含多页内容,只需按照「总打印页数 = 总副本数 * 单份页数」的规则计算总页数,在PrintPage事件中区分单份内的内容渲染逻辑和跨副本的连续页码逻辑即可,核心思路不变。


内容的提问来源于stack exchange,提问作者Eric cosme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:33:38