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
相关产品推荐
相关产品推荐

