打印到多页

时间:2014-03-18 02:51:35

标签: vb.net printing

我得到了Stackoverflow的很多朋友的帮助,特别是Mark Hall(有一天我会拜访你的; - )......) 我已经达到了下面的代码,可以很好地打印图像和文本; 现在的问题是,如果填写页面,如何自动将打印移动到下一页; 也很高兴添加页码:

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    PrintPreviewDialog1.Document = PrintDocument1
    PrintPreviewDialog1.ShowDialog()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    PrintDocument1.Print()
End Sub

Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As  _
  System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim rect1 As Rectangle = New Rectangle(New Point(0, 0), PictureBox1.Image.Size)
    Dim rect2 As Rectangle = New Rectangle(New Point(100, 200), PictureBox1.Image.Size)
    Dim fmt As StringFormat = New StringFormat()
    e.Graphics.DrawImage(PictureBox1.Image, rect1)
    e.Graphics.DrawString(RichTextBox1.Text, RichTextBox1.Font, New SolidBrush(Color.Red), rect2, fmt)
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For S = 1 To 200
        RichTextBox1.AppendText("Test Line No. - " & S & vbCrLf)
    Next
End Sub

结束班

1 个答案:

答案 0 :(得分:0)

PrintPageEventArgs包含一个成员HasMorePages,您可以设置为True以在当前迭代结束时再次引发相同的事件。

要打印页码,您需要保留一个本地类变量来跟踪当前页码。然后使用e.Graphics.DrawString()重载在页面的任何位置打印页码。

使用您自己的代码的示例:

Private mPageNumber As Integer = 1

Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As  _
             System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim rect1 As Rectangle = New Rectangle(New Point(0, 0), PictureBox1.Image.Size)
    Dim rect2 As Rectangle = New Rectangle(New Point(100, 200), PictureBox1.Image.Size)
    Dim fmt As StringFormat = New StringFormat()
    e.Graphics.DrawImage(PictureBox1.Image, rect1)
    e.Graphics.DrawString(RichTextBox1.Text, RichTextBox1.Font, New SolidBrush(Color.Red), rect2, fmt)

    Using f as New Font("Arial" , 10)
        e.Graphics.DrawString(mPageNumber.ToString(), , Brushes.Black, 0, 0) 'Page number at top-left of the page
    End Using

    mPageNumber += 1        


    e.HasMorePages = (mPageNumber <= 10) 'Will keep printing till 10 pages are printed
 End Sub

转到下一页完全取决于您希望如何计算下一页。具体来说,您需要以自己的字体打印每个字符(因为它是RichTextBox),然后还要处理段落等。而且好像这还不够,你可能需要解决双向文本,文本包装,对齐等问题。欢迎来到印刷世界!!

我不会在这里写出确切的代码,但会给你一些提示,以便你可以开始你的旅程。 RichTextBox有一个名为GetPositionFromCharIndex()的方法,它为您提供指定字符索引的x,y坐标。您可以使用循环来确定e.MarginBounds.Height事件处理程序中Y坐标小于或等于PrintPage的最后一个字符,然后将该索引的所有字发送到DrawString()函数。您应该保留一个类级别变量来跟踪您在当前页面上打印的最后一个字符,然后在下一次迭代中从该点开始。您可以使用DrawString()重载,将布局矩形作为参数并向其发送e.MarginBounds,让它自动为您自动换行。

请记住,这只适用于RichTextBox,它具有用于其所有文本的单一字体,鉴于RichTextBox的用途,这种可能性极小。对于有多种字体的情况,您需要为包含单个字体的每个字符范围多次调用DrawString()。正如我所说,这里有很多细节(如字体字距,悬边和其他魔鬼),这里不能涵盖。继续阅读,你会在SO和其他地方找到很多好东西。