VB .NET -  Imprimindo múltiplas páginas de um arquivo texto

 


Neste artigo vou mostrar como podemos usar os recursos do System.Drawing.Printing para imprimir arquivos textos em muitas páginas.

Usar os recursos do GDI + é a maneira de desenhar formas, fontes, imagens ou geralmente qualquer coisa gráfica no Visual Basic .NET quer na tela quer em uma impressora.

Os namespaces em GDI + são:

O lugar para começar com GDI + é o objeto Graphics. Embora as coisas que você desenha apareçam em seu monitor ou em uma impressora, o objeto Graphics é a "tela" onde você desenha.

Mas o objeto Graphics é também uma das primeiras fontes de confusão ao usar GDI+. O objeto Graphics está sempre associado a um contexto de dispositivo particular.

Neste artigo vamos usar os recursos do System.Drawing.Printing para imprimir múltiplas páginas de um arquivo texto.

Recursos Usados

Criando o projeto no VS 2015 Community

Abra o VS 2015 Community clique em New Project;

Selecione a linguagem VB .NET e o template Windows Forms Application informando o nome VBNET_Impressao;

No formulário form1.vb inclua os seguintes controles:

Disponha os controle conforme o leiaute da figura abaixo:

Agora vamos implementar o código para ler um arquivo texto, exibir o seu conteúdo na caixa de texto e imprimir o arquivo.

Namespaces usados no formulário:

Imports System.Drawing.Printing
Imports
System.IO

No início do formulário vamos definir as variáveis objeto para visualizar, para imprimir e para receber o texto da impressão:

'define os objetos para visualizar a impressão(printPreview) e para imprimir o documento (pd)
Private printPreview As PrintPreviewDialog = New PrintPreviewDialog()
Private pd As PrintDocument = New PrintDocument()
Dim strImpressao As String

No evento Click do botão de comando Localizar temos o código que usa o controle OpenFileDialog (ofd1) para selecionar o arquivo texto:

  Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        If ofd1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            If File.Exists(ofd1.FileName) Then
                txtArquivo.Text = ofd1.FileName
                LerArquivoTexto()
            End If
        End If
    End Sub

O código do método LerArquivoTexto() é mostrado abaixo:

  Private Sub LerArquivoTexto()
        'verifica se o arquivo existe 
        If IO.File.Exists(txtArquivo.Text) Then
            'abre o arquivo e exibe na caixa de texto
            Dim objStreamReader As StreamReader = File.OpenText(txtArquivo.Text)
            Dim contents As String = objStreamReader.ReadToEnd()
            txtTexto.Text = contents
            objStreamReader.Close()
        Else
            MessageBox.Show("Arquivo não existe")
        End If
 End Sub

No evento Click do botão de comando Imprimir temos o código que abre a janela para visualizar a impressão e chama o evento PrintPage():

 Private Sub btnImprimir_Click(sender As Object, e As EventArgs) Handles btnImprimir.Click
        If Not String.IsNullOrWhiteSpace(txtArquivo.Text) Then
            ' exibe o nome do documento 
            pd.DocumentName = txtArquivo.Text
            ' associa o método PrintPage com o tratamento de evento
            AddHandler pd.PrintPage, AddressOf pd_PrintPage
            ' abre o documento
            Using fs As FileStream = New FileStream(pd.DocumentName, FileMode.Open)
                ' Le o conteúdo do documento em um stream
                Using sr As StreamReader = New StreamReader(fs)
                    strImpressao = sr.ReadToEnd()
                End Using
            End Using
            ' Atribui a instância de printdocumento a printpreview
            printPreview.Document = pd
            'exibe a caixa de diálogo 
            printPreview.ShowDialog()
        Else
            MessageBox.Show("Selecine um arquivo para imprimir")
        End If
    End Sub

Finalmente o código associado ao evento PrintPage() que efetivamente imprime os dados:

Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
        Dim contaCaractere As Integer = 0
        Dim contaLinha As Integer = 0

        ' 'strImpressao' - Faz a medida da string
        ' 'contaCaractere' - Calcula os caracteres por linha
        ' 'contaLinha' - Calcula as linhas por página que se enquadram dentro dos limites da pagina

        e.Graphics.MeasureString(strImpressao, Me.Font, e.MarginBounds.Size, StringFormat.GenericTypographic, contaCaractere, contaLinha)

        ' Determina os limite da página e desenha a string com base nisso
        e.Graphics.DrawString(strImpressao, Me.Font, Brushes.Black, e.MarginBounds, StringFormat.GenericTypographic)

        ' Remove parte da string que foi impressa
        strImpressao = strImpressao.Substring(contaCaractere)

        ' verifica se existem paginas a imprimir
        If strImpressao.Length > 0 Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
        End If
 End Sub

Executando o projeto iremos obter:

Pegue o projeto completo aqui : VBNET_Impressao.zip

Jesus Cristo é o mesmo, ontem, e hoje, e eternamente.
Hebreus 13:8

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti