打印多页文本文件(Windows 窗体 .NET)

基于 Windows 的应用程序打印文本是很常见的。 Graphics 类提供将对象(图形或文本)绘制到设备(如屏幕或打印机)的方法。 以下部分详细介绍了打印文本文件的过程。 此方法不支持打印非纯文本文件,例如 Office Word 文档或 PDF 文件。

注意

TextRendererDrawText 方法不支持打印。 如以下代码示例所示,应始终使用 GraphicsDrawString 方法来绘制文本以供打印。

打印文本

  1. 在 Visual Studio 中,在“解决方案资源管理器”窗格中双击要从中打印的窗体。 此操作后将打开可视化设计器。

  2. 从“工具箱”中,双击 PrintDocument 组件以将其添加到窗体中。 这应创建名为 printDocument1PrintDocument 组件。

  3. Button 添加到窗体,或使用窗体上已存在的按钮。

  4. 在窗体的可视化设计器中,选择该按钮。 在“属性”窗格中,选择“事件”筛选器按钮,然后双击 Click 事件以生成事件处理程序。

  5. Click 事件代码应可见。 在事件处理程序的范围之外,将私有字符串变量添加到名为 stringToPrint 的类。

    private string stringToPrint="";
    
    'Private PrintDocument1 As New PrintDocument()
    Private stringToPrint As String
    
  6. 返回到 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
    
  7. 返回窗体的可视化设计器并选择 PrintDocument 组件。 在“属性”窗格上,选择“事件”筛选器,然后双击 PrintPage 事件以生成事件处理程序。

  8. PrintPage 事件处理程序中,使用 PrintPageEventArgs 类的 Graphics 属性和文档内容来计算行长度和每页行数。 绘制完每一页后,检查它是否是最后一页,并相应地设置 HasMorePagesPrintPageEventArgs 属性。 引发 PrintPage 事件,直到 HasMorePagesfalse

    在下面的代码示例中,事件处理程序用于打印“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
    

另请参阅