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

如何在C#的PrintDocument方法中跳转到下一个打印页?附代码尝试

在C# PrintDocument中跳转到下一页的解决方法

嘿,我来帮你搞定这个打印分页的问题~ 你已经摸到门道了,就是用PrintPageEventArgs里的HasMorePages属性来控制分页,不过咱们得把逻辑理清楚,不然内容会要么截断要么重复打印。

核心原理

PrintDocument的PrintPage事件每一页打印都会触发一次:

  • 当你设置e.HasMorePages = true时,PrintDocument会立刻再次触发PrintPage事件,打印下一页
  • 当所有内容都打印完,设置e.HasMorePages = false,打印就会停止

修正你的代码

首先,咱们需要一个类级别的变量来跟踪打印进度(不然每次触发PrintPage都会重新打印第一页的内容),然后判断内容是否超出当前页的可打印区域,再决定是否开启下一页。

完整代码示例:

// 类级变量,记录当前打印到哪一项
private int _currentPrintItem = 0;

private void button1_Click(object sender, EventArgs e)
{
    // 打印前重置进度,避免重复打印上次的内容
    _currentPrintItem = 0;
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += printDocument_PrintPage1;
    pd.Print();
}

private void printDocument_PrintPage1(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    // 获取页面的可打印区域底部Y坐标(考虑了打印机边距)
    int pageBottom = e.MarginBounds.Bottom;
    // 当前绘制的Y起始位置
    int currentY = 50;
    Font printFont = new Font("Arial", 8, FontStyle.Regular);

    // 打印第一项
    if (_currentPrintItem == 0)
    {
        e.Graphics.DrawString("Test 1", printFont, Brushes.Black, 50, currentY);
        // 计算下一行的位置(加上行间距)
        currentY += (int)printFont.GetHeight(e.Graphics) + 5;
        _currentPrintItem++;
    }

    // 检查下一项是否会超出当前页
    if (currentY + printFont.GetHeight(e.Graphics) > pageBottom)
    {
        // 还有内容要打印,开启下一页
        e.HasMorePages = true;
        return;
    }

    // 打印第二项
    if (_currentPrintItem == 1)
    {
        e.Graphics.DrawString("Test 2", printFont, Brushes.Black, 50, currentY);
        _currentPrintItem++;
    }

    // 所有内容打印完成,关闭分页
    e.HasMorePages = false;
}

关键注意点

  • 跟踪打印进度:必须用外部变量(比如_currentPrintItem)记录已经打印了哪些内容,否则每次PrintPage触发都会重新打印所有内容
  • 判断分页时机:用e.MarginBounds获取真实的可打印区域,不要硬写Y坐标(不同打印机的边距可能不一样)
  • 字体高度计算:用printFont.GetHeight(e.Graphics)来准确计算字体的高度,避免行间距设置不合理导致内容重叠或浪费空间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:50:52