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


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

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

Примечание.

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

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

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

  2. На панели элементов дважды щелкните PrintDocument компонент, чтобы добавить его в форму. Это должно создать 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 компонент. На панели "Свойства" выберите фильтр событий и дважды щелкните PrintPage событие, чтобы создать обработчик событий.

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

См. также