Imprimir utilizando PrintDocument y PrintDialog

Este pretende ser un ejemplo muy simple y breve en visual basic .net. Sencillo para que se entienda rapidamente su funcionamiento y breve (con muy poco código) para que nada nos estorbe a la hora de ponerle nuestro toque personal. Los programadores somos muy creativos y me a pasado muchas veces que me encontré con ejemplos muy complejos y llenos de código, los cuales tuve que desmenuzar y analizar por partes para poder entender su funcionamiento. Así que trato de poner en todos mis post ejemplos concretos, simples y que funcionen con solo copiar, pegar y hacer una mimina configuración a los controles.

Necesitamos:

Un Winform (Form1), un control PrintDocument (PrintDocument1), un control PrintDialog (PrintDialog1), un TextBox (TextBox1) y un Botón (Button1). El formulario debería tener un aspecto similar al de esta imagen:

Copiamos el siguiente código en el evento click de button1


If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
PrintDocument1.Print()
End If

que lo que hace es abrir el cuadro de dialogo para seleccionar la impresora y luego pasa pasa toda la configuración seleccionada al objeto printDocument y luego le dice que imprima. Lo que dispara el evento PrintPage de printDocument.

Ahora sobre el objeto PrintDocument1 hacemos doble clic y pegamos el siguiente código


e.Graphics.DrawString(TextBox1.Text, New Font("Verdana", 18, FontStyle.Bold), Brushes.Black, 10, 10)

For i As Integer = 1 To 10
e.Graphics.DrawString("Ejemplo de linea: " & i, New Font("Tahoma", 10, FontStyle.Bold), Brushes.Black, 10, 20 + (i * 30))
Next

Al ejecutar el programa este imprimirá el contenido de la caja de texto como titulo de la pagina y diez lineas de ejemplo utilizando distinta y furnte y tamaño. El resultado se verá similar al de la siguiente imagen:

más información sobre los controles…

PrintDialog (Componente, formularios Windows Forms)

El componente PrintDialog de formularios Windows Forms es un cuadro de diálogo preconfigurado que se utiliza para seleccionar una impresora, elegir las páginas que se van a imprimir y determinar otros valores de configuración relacionados con la impresión en aplicaciones basadas en Windows. Utilícelo como una solución sencilla para seleccionar configuraciones de la impresora o relacionadas con la impresora, en lugar de configurar un cuadro de diálogo propio. Puede permitir que los usuarios impriman diversas partes de sus documentos: imprimir todo, imprimir el intervalo de páginas especificado o imprimir una selección. Al basarse en cuadros de diálogo estándar de Windows, creará aplicaciones cuya funcionalidad básica les resultará inmediatamente familiar a los usuarios.

PrintDocument (Componente, formularios Windows Forms)

El componente PrintDocument de formularios Windows Forms se utiliza para establecer las propiedades que describen qué se imprime y, a continuación, para imprimir el documento dentro de aplicaciones basadas en Windows.



101 Responses to “Imprimir utilizando PrintDocument y PrintDialog”

  1. ZOLRAK.MX dice:

    Bueno como ya recorri todo el poste y nadie respondio sobre como se le hace para imprimir en mas hojas, me di a la tarea a investigar por otras paginas y me encontre con un codigo pero esta medio complejo para enterlo facilmente asi que lo modique al ejemplo que se esta manejando aqui asi que ahi esta mi granito de arena y espero y lo entiendan okas ;)

    ‘ Esta variable tiene que ser publica
    Dim linea As Integer = 1

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

    ‘ Definimos el tipo de fuente y de mas
    Dim Fuente As New Font(“arial”, 10)
    ‘ Definimos en que posicion se va iniciar la impresion
    Dim posicion As Integer = 20
    ‘ Contador de lineas que se van imprimiendo
    Dim lineaimpresa As Integer = 0
    ‘ Variable para ver cuando se va hacer un salto de pagina
    Dim salto_pagina As Boolean = False
    ‘ Variable para designar cuantos lineas se van a imprimir por hoja
    Dim NroLineasPagina As Integer = 70

    For i = linea To 150
    e.Graphics.DrawString(“Ejemplo de linea: ” & linea, Fuente, Brushes.Black, 10, posicion)
    posicion += 15
    linea += 1
    lineaimpresa += 1
    If lineaimpresa = NroLineasPagina Then
    salto_pagina = True
    Exit For
    End If
    Next

    If salto_pagina = True Then
    e.HasMorePages = True
    Else
    e.HasMorePages = False
    End If
    End Sub

    Bueno espero y les sirva y lo puedan adecuar a sus necesidad okas byes

  2. diego dice:

    como puedo imprimir

  3. renestimpy dice:

    Imports System.IO

    Public Class frmDesCaratula

    Private stringToPrint As String

    Private Sub frmDesCaratula_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Me.MdiParent = mdiPrincipal
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    If ptdConfiguracion.ShowDialog = Windows.Forms.DialogResult.OK Then
    ptdDocumento.PrinterSettings = ptdConfiguracion.PrinterSettings
    ptdDocumento.Print()
    End If
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles ptdDocumento.PrintPage

    e.Graphics.DrawString(TextBox1.Text, New Font(“Verdana”, 18, FontStyle.Bold), Brushes.Black, 10, 10)
    For i As Integer = 1 To 10
    e.Graphics.DrawString(“Ejemplo de linea: ” & i, New Font(“Tahoma”, 10, FontStyle.Bold), Brushes.Black, 10, 20 + (i * 30))
    Next

    ‘————–IMPRESION DE TODO UN DOCUMENTO

    ‘ 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

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    ReadFile()
    ptdDocumento.Print()
    End Sub

    Private Sub ReadFile()
    Dim docName As String = “INDICE.html”
    Dim docPath As String = “G:\”
    ptdDocumento.DocumentName = docName
    Dim stream As New FileStream(docPath + docName, FileMode.Open)
    Try
    Dim reader As New StreamReader(stream)
    Try
    stringToPrint = reader.ReadToEnd()
    Finally
    reader.Dispose()
    End Try
    Finally
    stream.Dispose()
    End Try
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    ppdVista.Document = ptdDocumento
    ppdVista.ShowDialog()
    End Sub

    End Class

    Este me funciono a mi, necesitas un texbox:TextBox1
    printdocument:ptdDocumento
    printpreviewcontrol:ppdVista
    printdialog:ptdConfiguracion

  4. Kevin Ramirez dice:

    Interesante articulo pero pregunto como actuariamos en entornos mas profesionales como la impresion de tickets, recibos, facturas o incluso cheques controlando si la impresora esta en linea o tiene papel o en mido de la impreison se detubo la impresion por algun error.

    Sabes algo hacerca de lo que te menciono ya que he intentado muchas veces esto y sin exito no he encontrado nada para resolver esta problematica.

    Saludos.
    Atte. Kevin Ramirez

  5. Franco C Sanchez dice:

    Buenos dias, queria saber si tenias algun tutorial para poder imprimir el contenido de un datagridview porque todo lo que encuentro en internet es mucho codigo y nada eh podido hacer funcionar !.
    Te agradeceria mucho si tuvieras informacion sobre esto.

    Saludos

  6. Manuel dice:

    Estimados, yo llevo mas de 10 años programando en Microsoft, pasé por Vb6 y ahora estoy con VS2010.
    Hasta ahora no he encontrado ninguna herramienta mas flexible que PrintDocument para hacer reportes, no hay nada que no haya podido hacer.

    Si tienen dudas pueden contactarme.
    saludos

  7. Edgar sa dice:

    Hola disculpen necesito ayuda urgente lo que pasa es que quisiera saber como puedo imprimir el contenido d un panel en el cual tengo una imagen (mas grande que el panel por lo k manejo scrollBar) y unos cuantos textBox…todo a partir de un PrintDocument.Hola disculpen necesito ayuda urgente lo que pasa es que quisiera saber como puedo imprimir el contenido d un panel en el cual tengo una imagen (mas grande que el panel por lo k manejo scrollBar) y unos cuantos textBox…todo a partir de un PrintDocument.Hola disculpen necesito ayuda urgente lo que pasa es que quisiera saber como puedo imprimir el contenido d un panel en el cual tengo una imagen (mas grande que el panel por lo k manejo scrollBar) y unos cuantos textBox…todo a partir de un PrintDocument.

  8. Torres dice:

    muchas gracias, primer ejemplo sencillo que funciona

  9. Alberto dice:

    Muchísimas gracias. Claridad y rigor. Estupendo. Ahora me queda hacer los ciclos y filtros necesarios para imprimir los registros de una base de datos, pero es que esto mismo que tan claramente has expuesto lo he encontrado en otros sitios muy confusamente expuesto. Tienes que ser un profesor sensacional.

  10. yack dice:

    si me sirvio tu ejemplo solo tengo una duda como puedo de cirle alprograma que imprima en la posicion indicada mi correo es yack7raro@gmail.com por si laguna poersona sabe como

  11. Joe dice:

    El post esta excelente, necesito un par de datos para terminar de imprimir mi etiqueta, en este caso el primer punto es imprimir lo que hay en la caja de texto, y segundo acomodar la posicion de la impresion, desde ya muchas gracias saludos…

    • Joe dice:

      P.D. El texto del textbox primero lo imprimo en barcode abajo del barcode necesito que se imprima en letras normales es la parte que no aclare, gracias…

  12. Ronalgino dice:

    gracias por el aporte me sera de mucha utilidad para el sistema que estoy empezando hacer.

  13. LEONEL POVEDA dice:

    Saludos desde Ecuador. Soy aficionado al Visual Basic y estoy aprendiendo; este ejercicio es muy claro y después de algunos días he encontrado algo concreto y sencillo. Sin embargo si me da una manito, pues quiero enviar el contenido de un formulario a la impresora, quizá me oriente, estoy recién leyendo las opciones prindocument, etc. GRACIAS.

  14. Jack dice:

    Perdon. Yo kiero imprimir un RichTextbox tal como esta en la pagina. sera eso posible??
    por que yo tengo diferentes colores de letra y cuando imprimo se imprime todo de NEGRO!! Me ayudan por favor!

    Gracias

  15. ernesto dice:

    Hola a a todos.

    Como puedo imprimir en 2 impresoras.
    Es decir, quiero imprimir un nombre en un gafete, los gafetes están en una impresora.
    Al mismo tiempo quiero imprimir un diploma en otra impresora.

    Como puedo hacer para primero enviar a imprimir en una impresora y luego imprimir otra.

    Saludos
    Ernesto

    • Narciso Cisneros dice:

      Imprimes impresora 1, cambias impresora predeterminada, imprimes impresora 2, regresas impresora predeterminada, al menos asi lo hago yo. Tengo un sistema en el que las ordenes de un restaurante se imprimen cada platillo en su area correspondiente, bebidas, cocina, (cockteleria, barra, caja)

  16. JUAN dice:

    PERO SI KISIERA HACER UNA VISTA PREVIA ANTES DE LA IMPRESION ALGUIEN ME PODRIA AYUDAR

  17. Alejandro Rodriguez dice:

    Hola, muchas gracias muy buen aporte pero me tira un error a la hora de imprimir…
    Private Sub ImprimirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImprimirToolStripMenuItem.Click
    PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings

    PrintDocument1.Print()
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim resultado As SqlCeDataReader
    Dim sentencia As String
    Dim a As Double
    sentencia = “Select * from Libros”
    Dim comando As New SqlCeCommand(sentencia, conexion)
    comando.Parameters.Add(New SqlCeParameter(“@Usuario”, SqlDbType.NVarChar))
    comando.Parameters(“@Usuario”).Value = ToolStripTextBox1.Text
    Try
    conexion.Open()
    Catch ex As SqlCeException
    conexion.Close()
    conexion.Open()
    End Try
    Try
    resultado = comando.ExecuteReader()
    a = 25
    While resultado.Read
    CodigoTextBox.Text = resultado(“Codigo”)
    NombreTextBox.Text = resultado(“Nombre”)
    ComboBox1.Text = resultado(“Autor”)
    ComboBox2.Text = resultado(“Editorial”)
    DateTimePicker1.Text = resultado(“Fecha”)
    LugarTextBox.Text = resultado(“Lugar”)
    e.Graphics.DrawString(CodigoTextBox.Text, CodigoTextBox.Font, Brushes.Black, 100, a)
    e.Graphics.DrawString(NombreTextBox.Text, NombreTextBox.Font, Brushes.Black, 150, a)
    e.Graphics.DrawString(ComboBox1.Text, ComboBox1.Font, Brushes.Black, 200, a)
    e.Graphics.DrawString(ComboBox2.Text, ComboBox2.Font, Brushes.Black, 275, a)
    e.Graphics.DrawString(DateTimePicker1.Text, DateTimePicker1.Font, Brushes.Black, 350, a)
    e.Graphics.DrawString(LugarTextBox.Text, LugarTextBox.Font, Brushes.Black, 550, a)
    a = a + 25
    End While
    resultado.Close()
    conexion.Close()
    Catch ex As SqlCeException

    End Try
    actualizar()
    If ToolStripTextBox1.Text CodigoTextBox.Text Then
    NombreTextBox.Clear()
    CodigoTextBox.Clear()
    ComboBox1.Text = “”
    ComboBox2.Text = “”
    DateTimePicker1.Text = Date.Today
    LugarTextBox.Clear()
    End If

    End Sub

    Private Sub ConfigurarPaginaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConfigurarPaginaToolStripMenuItem.Click
    PageSetupDialog1.PageSettings = PrintDocument1.DefaultPageSettings
    PageSetupDialog1.ShowDialog()
    PrintDocument1.DefaultPageSettings = PageSetupDialog1.PageSettings
    End Sub

    Private Sub VistaPreviaDeImpresionToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VistaPreviaDeImpresionToolStripMenuItem.Click
    PrintPreviewDialog1.Document = PrintDocument1
    PrintPreviewDialog1.ShowDialog()
    End Sub

    Private Sub ConfigurarImpresoraToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConfigurarImpresoraToolStripMenuItem.Click
    PrintDialog1.ShowDialog()
    PrintDocument1.DefaultPageSettings.PrinterSettings = PrintDialog1.PrinterSettings
    End Sub
    ese es mi codigo, aver si ustedes si encuentran el error… gracias de antemano

  18. Narciso Cisneros dice:

    Y por que no usan crystal reports, es mejor y mas rapido sin tantas lineas de codigo

  19. Jesica dice:

    Tengo un inconveniente al querer imprimir recibos en formulario continuo (entran 4 recibos en una hoja). El tema es que cuando imprimo uno, el carro de la matriz de punto larga la hoja como si fuera de tamaño A4. Ya le eh especificado el tamaño del papel con un objeto PaperSize. Pero sigue igual.
    Muchas Gracias por la ayuda!!

    • Narciso Cisneros dice:

      En Crystal reports, tienes una opcion al momento de hacer el diseño de seleccionar el tipo de impresora y papel, al igual k antes de mandarlo a imprimir… saludos

  20. Israel Marsilli dice:

    Hey, good post, fast, simple and easy, it’s exactly what I was looking for.
    Regards

  21. Edson Lhi Ugaz dice:

    Excelente aporte mi estimado.

    Lo he probado con PDF Creator que lo tengo configurado como impresorapredeterminada y funciona..

    Varios han preguntado lo mismo, y también lo hago… ¿Sirva para imprimir en Ticketera? ¿Cómo mando los datos de mi Grilla a la Ticketera? Ya que supuestamente los cargo desde un DataSet.

    Gracias.

  22. Edman dice:

    Hola, a todos los que ya hayan logrado imprimir sin mayores inconvenientes en papel continuo. Sea en papel blanco o con pre impresiòn, de hoja en hoja va “subiendo” de tal modo que se descuadra. En el caso del papel impreso (como una liquidación) el resultado es desastroso. La primera hoja, ok, la segunda ya se muestra un poco descolocada, la tercera ya peor, la cuarta ya no sirve. Se deben imprimir 200 hojas en papel continuo. Mi correo para cualquier ayuda evegalle@yahoo.com
    Aplico e.HasMorePages = False para indicar el fin de la impresión de cada liquidación, previamente configuro el tamaño de cada hoja del papel continuo. Urgente, por favor, pido vuestra ayuda para solucionar este problema. Gracias anticipadas

  23. rafael dice:

    oye amigo como aria si ya tengo pre-diseñado el tipo de letra y tamaño solo quiero imprimir lo que ya tengo en mi “TextBox” en ese momento asumiendo que la letra esta en ese momento azul u cualquier otro color o formato de letra?? responde me al correo de verdad quiero saber , responderme apenas puedas gracias de ante mano .

  24. navyivan dice:

    Hola, en Crystal reports puede prediseñar los reportes con el tipo de letra que quieras… si lo que buscas es algo “dinamico”, que puedas cambiarlo en modo de ejecucion (hasta ahorita no veo para que sea necesario) existe otra manera, que es enviando el texto en formato HTML… saludos

Comentar