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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:47:08