列印多頁文字檔 (Windows Forms .NET)
Windows 應用程式列印文字的情況很常見。 Graphics 類別提供將物件 (圖形或文字) 繪製到螢幕或印表機等裝置的方法。 下一節詳細說明列印文字檔的流程。 此方法不支援列印非純文字檔,例如 Office Word 文件或 PDF 檔案。
注意
TextRenderer 的 DrawText 方法不支援列印。 您應該一律使用 Graphics 的 DrawString 方法,來繪製要用於列印的文字,如下列程式碼範例所示:
列印文字
在 Visual Studio 中,按兩下 [方案總管] 窗格中您要從中列印的表單。 這會開啟視覺化設計工具。
從 [工具箱],按兩下 PrintDocument 元件,將它新增至表單。 這應該會建立名稱為
printDocument1
的PrintDocument
元件。將
Button
新增至表單,或使用已經在表單上的按鈕。在表單的視覺化設計工具中,選取按鈕。 在 [屬性] 窗格中,選取 [事件] 篩選按鈕,然後按兩下
Click
事件以產生事件處理常式。Click
事件程式碼應該會顯示。 在事件處理常式的範圍之外,將私人字串變數新增至名為stringToPrint
的類別。private string stringToPrint="";
'Private PrintDocument1 As New PrintDocument() Private stringToPrint As String
回到
Click
事件處理常式程式碼中,將 DocumentName 屬性設定為文件的名稱。 這項資訊會傳送至印表機。 接下來,讀取文件文字內容,並將其儲存在stringToPrint
字串中。 最後,呼叫 Print 方法以引發 PrintPage 事件。Print
方法會在底下醒目提示。private void button1_Click(object sender, EventArgs e) { string docName = "testPage.txt"; string docPath = @"C:\"; string fullPath = System.IO.Path.Combine(docPath, docName); printDocument1.DocumentName = docName; stringToPrint = System.IO.File.ReadAllText(fullPath); printDocument1.Print(); }
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim docName As String = "testPage.txt" Dim docPath As String = "C:\" Dim fullPath As String = System.IO.Path.Combine(docPath, docName) PrintDocument1.DocumentName = docName stringToPrint = System.IO.File.ReadAllText(fullPath) PrintDocument1.Print() End Sub
返回表單的視覺化設計工具,然後選取
PrintDocument
元件。 在 [屬性] 窗格上,選取 [事件] 篩選,然後按兩下PrintPage
事件以產生事件處理常式。在 PrintPage 事件處理常式中,使用 PrintPageEventArgs 類別的 Graphics 屬性和文件內容來計算行的長度和每頁的行數。 在繪製每一頁之後,檢查該頁面是否為最後一頁,並且據此設定 HasMorePages 的
PrintPageEventArgs
屬性。 在PrintPage
成為HasMorePages
之前,會持續引發false
事件。在下列程式碼範例中,會使用事件處理常式以表單上所使用的相同字型來列印 "testPage.txt" 檔案的內容。
private void PrintDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { int charactersOnPage = 0; int linesPerPage = 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, this.Font, e.MarginBounds.Size, StringFormat.GenericTypographic, out charactersOnPage, out linesPerPage); // Draws the string within the bounds of the page e.Graphics.DrawString(stringToPrint, this.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); }
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 ' 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