VB.NET打印问题:超过64行的内容无法自动分页,如何解决?
EDI文件打印分页问题修复方案
你的问题出在每次打印新页面时,都会重新打开文件从头读取内容,导致新页面的内容覆盖到前一页的位置。要实现每页64行的分页打印,核心是记录已经打印过的总行数,下次打印时跳过这些行,从剩余的内容开始绘制。
问题代码的核心缺陷
每次触发e.HasMorePages = True后,打印事件会再次执行,但你的代码每次都重新创建StreamReader读取文件,从头开始绘制,自然会造成内容重叠。而且linesAlreadyPrinted的作用完全没发挥出来,没有用来跳过已打印的行。
修正后的代码
' 注意:把linesAlreadyPrinted设为模块级变量,确保跨打印事件保留值 ' 不要在每次处理文件时重置,而是在开始打印单个文件前(比如打印按钮点击事件里)设置linesAlreadyPrinted = 0 If File.Exists(pageFile) Then Using reader As New StreamReader(pageFile) ' 第一步:跳过已经打印过的行数 For i As Integer = 1 To linesAlreadyPrinted reader.ReadLine() Next linesPrinted = 0 ' 每页最多打印64行 While linesPrinted < 64 Dim line As String = reader.ReadLine() If line IsNot Nothing Then ' 绘制当前行 e.Graphics.DrawString(line, dataFont, Brushes.Black, leftMargin, topMargin + linesPrinted * dataFont.Height) linesPrinted += 1 linesAlreadyPrinted += 1 ' 遇到IEA标记,结束当前文件打印 If line.StartsWith("IEA") Then Debug.WriteLine("IEA" & vbCrLf & pageNum & vbCrLf & line) e.HasMorePages = False Exit While End If Else ' 文件已读完 Debug.WriteLine("End of file reached") e.HasMorePages = False Exit While End If End While ' 如果当前页刚好打满64行,说明还有内容没打印,触发下一页 If linesPrinted = 64 Then e.HasMorePages = True End If End Using ' 更新进度条 ProgressBar1.Value = CInt((currentIndex / EDILines.Count) * 100) Else e.Graphics.DrawString("File not found", dataFont, Brushes.Black, leftMargin, topMargin) currentIndex += 1 ProgressBar1.Value = CInt((currentIndex / EDILines.Count) * 100) End If
关键修改点
- 保留已打印行数:将
linesAlreadyPrinted设为模块级变量,仅在开始打印新文件时重置为0,确保跨打印事件能记住已经处理过的行数。 - 跳过已打印内容:每次进入打印事件,先读取并跳过
linesAlreadyPrinted行,直接从剩余内容开始绘制。 - 分页逻辑调整:当当前页打满64行且文件还有内容时,才设置
e.HasMorePages = True,触发下一页打印。 - 循环控制:用
linesPrinted < 64作为循环条件,严格控制每页最多打印64行。
额外注意事项
- 如果
dataFont.Height计算的行高不准确,可以手动设置固定行高(比如15),避免行间距问题导致页面内容超出范围。 - 确保在切换打印下一个文件时,重置
linesAlreadyPrinted为0,避免不同文件之间的行数干扰。
内容的提问来源于stack exchange,提问作者user22431169
相关产品推荐
相关产品推荐

