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.



82 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

Comentar