Quantcast
Channel: André Alves de Lima
Viewing all articles
Browse latest Browse all 210

Imprimindo informações direto na impressora com C#

$
0
0

Alguns anos atrás eu escrevi um artigo sobre impressão direto na impressora com C#. Esse artigo acabou ficando bastante popular aqui no site, por isso resolvi gravar uma versão em vídeo desse artigo. Aqui vai o resultado:

Listando as impressoras instaladas

A lista de impressoras instaladas no sistema operacional está disponível no .NET a partir da propriedade “InstalledPrinters” da classe “PrinterSettings“, que fica localizada dentro do namespace “System.Drawing.Printing“:

        // C#
        public Form1()
        {
            InitializeComponent();

            CarregarImpressoras();
        }

        private void CarregarImpressoras()
        {
            impressoraComboBox.Items.Clear();

            foreach (var impressora in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                impressoraComboBox.Items.Add(impressora);
            }
        }
    ' VB.NET
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CarregarImpressoras()
    End Sub

    Private Sub CarregarImpressoras()
        ImpressoraComboBox.Items.Clear()

        For Each Impressora In System.Drawing.Printing.PrinterSettings.InstalledPrinters
            ImpressoraComboBox.Items.Add(Impressora)
        Next
    End Sub

Imprimindo texto em uma página

Para imprimirmos informações direto na impressora no .NET, temos que utilizar a classe “PrintDocument“. Uma vez criada uma instância dessa classe, temos que implementar o código do evento “PrintPage” e chamar o método “Print” para iniciar a impressão. O evento “PrintPage” será chamado uma vez para cada página a ser impressa:

        // C#
        private void imprimirButton_Click(object sender, EventArgs e)
        {
            using (var pd = new System.Drawing.Printing.PrintDocument())
            {
                pd.PrinterSettings.PrinterName = impressoraComboBox.SelectedItem.ToString();
                pd.PrintPage += Pd_PrintPage;
                pd.Print();
            }
        }

        private void Pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {

        }
    ' VB.NET
    Private Sub ImprimirButton_Click(sender As Object, e As EventArgs) Handles ImprimirButton.Click
        Using Pd = New System.Drawing.Printing.PrintDocument()
            Pd.PrinterSettings.PrinterName = ImpressoraComboBox.SelectedItem.ToString()
            AddHandler Pd.PrintPage, AddressOf Pd_PrintPage
            Pd.Print()
        End Using
    End Sub

    Private Sub Pd_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs)

    End Sub

Dentro do evento “PrintPage“, nós temos à nossa disposição a área gráfica da página (que fica acessível através do parâmetro do evento “e.Graphics“). Com esse objeto do tipo “Graphics“, nós conseguimos desenhar figuras geométricas, imagens e texto, utilizando os métodos “Draw*“:

O método para desenharmos texto na página é o “DrawString“. Além do texto, nós precisamos passar como parâmetro desse método a fonte, cor e área onde o texto deverá ser impresso na página. Nesse exemplo, vamos criar uma instância da fonte “Times New Roman” tamanho 14 e um “SolidBrush” de cor preta. O texto deverá ser impresso na área total da página, desconsiderando as margens (essa informação está disponível através dos parâmetros do evento – “e.MarginBounds“):

        // C#
        private void Pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            using (var font = new Font("Times New Roman", 14))
            using (var brush = new SolidBrush(Color.Black))
            {
                e.Graphics.DrawString(impressaoTextBox.Text, font, brush, e.MarginBounds);
            }
        }
    ' VB.NET
    Private Sub Pd_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs)
        Using Font = New Font("Times New Roman", 14)
            Using Brush = New SolidBrush(Color.Black)
                e.Graphics.DrawString(ImpressaoTextBox.Text, Font, Brush, e.MarginBounds)
            End Using
        End Using
    End Sub

Imprimindo texto em múltiplas páginas

A implementação apresentada acima funciona muito bem desde que o texto caiba em uma única página. Caso o texto seja maior, aí temos que fazer alguns ajustes. Primeiramente, temos que calcular a quantidade de texto que poderá ser impressa em cada página. Isso pode ser feito através do método “MeasureString” da classe “Graphics“. Esse método retornará a quantidade de caracteres que cabem em uma determinada área da página.

Além disso, teremos que criar uma variável no nível do formulário para controlarmos o texto que ainda está faltando para ser impresso. Essa variável será inicializada antes da impressão com o texto completo e será reduzida a cada página que for sendo impressa.

Por fim, nós precisamos informar de alguma maneira para o PrintDocument que existem mais páginas para serem impressas. Isso é feito através da propriedade “e.HasMorePages“, que deve ser configurada como “true” caso ainda exista texto para ser impresso. Quando essa propriedade é configurada como “true“, o evento “PrintPage” será disparado novamente e o restante do texto será impresso na próxima página.

Veja só como fica o código completo com suporte a múltiplas páginas:

        // C#
        private void imprimirButton_Click(object sender, EventArgs e)
        {
            using (var pd = new System.Drawing.Printing.PrintDocument())
            {
                pd.PrinterSettings.PrinterName = impressoraComboBox.SelectedItem.ToString();
                pd.PrintPage += Pd_PrintPage;
                _texto = impressaoTextBox.Text;
                pd.Print();
            }
        }

        private string _texto;
        private void Pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            using (var font = new Font("Times New Roman", 14))
            using (var brush = new SolidBrush(Color.Black))
            {
                int caracteres = 0;
                int linhas = 0;

                e.Graphics.MeasureString(_texto, font, new Size(e.MarginBounds.Width, e.MarginBounds.Height - font.Height + 1), StringFormat.GenericTypographic, out caracteres, out linhas);

                e.Graphics.DrawString(_texto.Substring(0, caracteres), font, brush, e.MarginBounds);

                _texto = _texto.Substring(caracteres);

                e.HasMorePages = !string.IsNullOrWhiteSpace(_texto);
            }
        }
    ' VB.NET
    Private Sub ImprimirButton_Click(sender As Object, e As EventArgs) Handles ImprimirButton.Click
        Using Pd = New System.Drawing.Printing.PrintDocument()
            Pd.PrinterSettings.PrinterName = ImpressoraComboBox.SelectedItem.ToString()
            AddHandler Pd.PrintPage, AddressOf Pd_PrintPage
            Texto = ImpressaoTextBox.Text
            Pd.Print()
        End Using
    End Sub

    Private Texto As String
    Private Sub Pd_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs)
        Using Font = New Font("Times New Roman", 14)
            Using Brush = New SolidBrush(Color.Black)
                Dim Caracteres As Integer = 0
                Dim Linhas As Integer = 0

                e.Graphics.MeasureString(Texto, Font, New Size(e.MarginBounds.Width, e.MarginBounds.Height - Font.Height + 1), StringFormat.GenericTypographic, Caracteres, Linhas)

                e.Graphics.DrawString(Texto.Substring(0, Caracteres), Font, Brush, e.MarginBounds)

                Texto = Texto.Substring(Caracteres)

                e.HasMorePages = Not String.IsNullOrWhiteSpace(Texto)
            End Using
        End Using
    End Sub

Baixe o projeto de exemplo

Para baixar o projeto de exemplo desse artigo, assine a minha newsletter. Ao fazer isso, além de ter acesso ao projeto, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário no final do artigo.

Concluindo

Imprimir informações direto na impressora com C# e VB.NET não é uma tarefa muito difícil. Através da classe “PrintDocument” nós conseguimos imprimir figuras geométricas, imagens e texto diretamente na impressora, sem necessitar de uma janela de “preview“. No vídeo de hoje você aprendeu a listar as impressoras instaladas no sistema operacional e a utilizar a classe “PrintDocument” para imprimirmos texto em uma única página e em múltiplas páginas.

E você, já precisou imprimir informações direto na impressora? Utilizou a classe “PrintDocument“? Como é que foi a sua experiência? Conte-nos mais detalhes na caixa de comentários abaixo!

Até a próxima!

André Lima

Photo by Peter Shanks used under Creative Commons
https://pixabay.com/en/startup-start-up-notebooks-creative-593327/

Song Rocket Power Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/

Newsletter do André Lima

* indicates required



Powered by MailChimp

The post Imprimindo informações direto na impressora com C# appeared first on André Alves de Lima.


Viewing all articles
Browse latest Browse all 210