2

そのため、VB.NET プログラムから直接印刷中に改ページを強制しようとしています。私は基本的に、MSDN の次のコードを使用してドキュメントを印刷しています。

Private Sub printDocument1_PrintPage(ByVal sender As Object, _
    ByVal e As PrintPageEventArgs)

    Dim charactersOnPage As Integer = 0
    Dim linesPerPage As Integer = 0

    ' Sets the value of charactersOnPage to the number of characters 
    ' of stringToPrint that will fit within the bounds of the page.
    e.Graphics.MeasureString(stringToPrint, Me.Font, e.MarginBounds.Size, _
        StringFormat.GenericTypographic, charactersOnPage, linesPerPage)

    ' Draws the string within the bounds of the page
    e.Graphics.DrawString(stringToPrint, Me.Font, Brushes.Black, _
    e.MarginBounds, StringFormat.GenericTypographic)

   ' Remove the portion of the string that has been printed.
    stringToPrint = stringToPrint.Substring(charactersOnPage)

    ' Check to see if more pages are to be printed.
    e.HasMorePages = stringToPrint.Length > 0

End Sub

これで問題なく印刷できますが、特定の場所に改ページを入れたいと考えています。e.HasMorePages = true を試してみましたが、特定の場所でブレークする方法がわかりません。私のstringToPrintの長さが5000文字で、1000文字の後に新しいページを開始し、次の2500文字の後に再びページを開始したいとします。どうすればいいですか?

また、linesOnPage と charactersOnPage を他の値に変更しても、何も変わらないようです。

編集:私のプログラムが何をするかについてもう少し情報が役立つと思います。基本的には、プログラムが約 4 ページ分のデータを作成し、それを .txt ファイルに出力します。ここで、.txt ファイル全体を印刷したいと思います。これを行う方法を知っている唯一の方法は、文字列を出力することです。そのため、.txt ファイル全体を 1 行ずつ読み取り、すべてを 1 つの文字列 (stringToPrint) として保存します。上記のコードを使用して、stringToPrint を出力します。

4

1 に答える 1

0

現在のコードは、長方形への印刷に基づいています。e.MarginBounds

テストには、次のコードを使用しました。

Private pageNum As Integer

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
                          Handles Button1.Click
  Dim sb As New StringBuilder
  For i As Integer = 1 To 100
    sb.AppendLine(i.ToString & ") This is a line.")
  Next
  stringToPrint = sb.ToString

  pageNum = 0
  Using pvw As New PrintPreviewDialog()
    pvw.Document = printDocument1
    pvw.ShowDialog()
  End Using
End Sub

次に、最初のページで小さい長方形を使用するようにルーチンを変更しました。

Private Sub printDocument1_PrintPage(ByVal sender As Object, _
                                     ByVal e As PrintPageEventArgs) _
                                     Handles printDocument1.PrintPage
  Dim charactersOnPage As Integer = 0
  Dim linesPerPage As Integer = 0

  pageNum += 1

  Dim printSize As Size = e.MarginBounds.Size
  If pageNum = 1 Then
    printSize = New Size(printSize.Width, printSize.Height / 2)
  End If
  e.Graphics.MeasureString(stringToPrint, Me.Font, printSize, _
      StringFormat.GenericTypographic, charactersOnPage, linesPerPage)

  ' Draws the string within the bounds of the page
  e.Graphics.DrawString(stringToPrint, Me.Font, Brushes.Black, _
    New Rectangle(e.MarginBounds.Location, printSize), _
    StringFormat.GenericTypographic)

  ' Remove the portion of the string that has been printed.
  stringToPrint = stringToPrint.Substring(charactersOnPage)

  ' Check to see if more pages are to be printed.
  e.HasMorePages = stringToPrint.Length > 0
End Sub

文字に基づいて印刷を制御する必要がある場合は、テキストのブロックを印刷するコードを捨てて、すべてを1行ずつ印刷する必要があります。

于 2012-07-26T14:52:42.287 に答える