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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:54:23