Поделиться через


Печать многостраничного текстового файла (Windows Forms .NET)

Обычно приложения на основе Windows печатают текст. Класс Graphics предоставляет методы рисования объектов (графики или текста) устройству, например экрана или принтера. В следующем разделе подробно описывается процесс печати текстового файла. Этот метод не поддерживает печать неструктурированных текстовых файлов, таких как документ Office Word или PDF-файл.

Заметка

Методы DrawText у TextRenderer не поддерживаются для печати. Для рисования текста в целях печати всегда следует использовать методы DrawStringGraphics, как показано в следующем примере кода.

Печать текста

  1. В Visual Studio дважды щелкните форму, которую вы хотите распечатать, в панели обозревателя решений. Откроется визуальный конструктор.

  2. Впанели элементов дважды щелкните компонент , чтобы добавить его в форму. Это должно создать компонент PrintDocument с именем printDocument1.

  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. На панели свойств выберите фильтр событий , а затем дважды щелкните событие , чтобы создать обработчик события.

  8. В обработчике событий PrintPage используйте свойство Graphics класса PrintPageEventArgs и содержимого документа для вычисления длины и строк на страницу. После рисования каждой страницы проверьте, является ли она последней и задайте свойство 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
    

См. также