C#中Bitmap数组图片批量打印问题:单对话框完成多页打印
解决C#中Bitmap数组批量打印(单次对话框完成多页打印)的问题
我来帮你搞定这个批量打印的问题——你现在遇到的每打印一页弹一次对话框的问题,根源是你在循环里每次都重新绑定打印事件、弹出对话框并触发打印,等于每一页都走了一遍完整的打印流程。咱们调整下逻辑,把所有图片的打印整合到一次会话里,用PrintPage事件的HasMorePages属性来实现多页打印,只弹一次对话框就搞定所有页面。
核心修改思路
- 把要打印的Bitmap数组和当前打印的索引设为类级别的变量,让打印事件能在多次触发中持续访问这些状态
- 利用
PrintPageEventArgs.HasMorePages属性告诉打印框架:是否还有下一页需要打印 - 只在最开始弹出一次打印对话框,触发整个多页打印流程,不需要循环处理每一页
修改后的完整代码示例
第一步:定义类级变量
在你的窗体类里添加这两个变量,用来存储打印队列和当前进度:
// 存储所有要打印的Bitmap private Bitmap[] _printBitmaps; // 记录当前打印到第几页 private int _currentPrintIndex = 0;
第二步:修改触发打印的代码
把原来的循环打印逻辑改成下面这样,只触发一次打印流程:
// 假设你已经创建好bitm数组(Bitmap[] bitm = new Bitmap[dataGridView1.RowCount]) _printBitmaps = bitm; _currentPrintIndex = 0; // 每次打印前重置索引 // 注意:避免重复绑定事件,先移除再添加(防止多次触发打印时事件叠加) myPrintDocument2.PrintPage -= printDocument1_PrintPage; myPrintDocument2.PrintPage += printDocument1_PrintPage; // 只弹出一次打印对话框 myPrinDialog2.Document = myPrintDocument2; if (myPrinDialog2.ShowDialog() == DialogResult.OK) { myPrintDocument2.Print(); }
第三步:重写PrintPage事件处理方法
修改原来的打印事件,实现多页打印逻辑:
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { // 检查是否还有未打印的图片 if (_currentPrintIndex < _printBitmaps.Length) { Bitmap currentBmp = _printBitmaps[_currentPrintIndex]; // 直接打印当前Bitmap(不需要通过PictureBox中转,如果你不需要预览可以去掉下面的PictureBox代码) e.Graphics.DrawImage(currentBmp, new Rectangle(0, 0, currentBmp.Width, currentBmp.Height)); // 如果你需要同步预览,更新PictureBox pictureBox2.Image = currentBmp; pictureBox2.Width = currentBmp.Width; pictureBox2.Height = currentBmp.Height; // 推进到下一页 _currentPrintIndex++; // 告诉打印框架:还有更多页面要打印(如果还有剩余的话) e.HasMorePages = (_currentPrintIndex < _printBitmaps.Length); } else { // 没有更多页面了,重置索引方便下次打印 e.HasMorePages = false; _currentPrintIndex = 0; } }
额外注意事项
- 资源释放:打印完成后记得释放Bitmap资源,避免内存泄漏。可以给PrintDocument添加
EndPrint事件来处理:
myPrintDocument2.EndPrint += (sender, args) => { if (_printBitmaps != null) { foreach (Bitmap bmp in _printBitmaps) { bmp.Dispose(); } _printBitmaps = null; } };
- 空值检查:确保
_printBitmaps数组里的每个元素都不为null,否则打印时会抛出异常 - 事件绑定:每次打印前务必先移除再添加
PrintPage事件,防止重复绑定导致同一张图片打印多次
内容的提问来源于stack exchange,提问作者vinayagamoorthy balalojanan
相关产品推荐
相关产品推荐

