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

