imprimir utilizando printdocument y printdialog

15
Imprimir utilizando PrintDocument y PrintDialog ste 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 1.If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 2.PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings 3.PrintDocument1.Print() 4.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

Upload: fredy-alonzo-rojas-berrospi

Post on 16-Jan-2016

596 views

Category:

Documents


15 download

DESCRIPTION

PrintDocument y PrintDialog

TRANSCRIPT

Page 1: Imprimir Utilizando PrintDocument y PrintDialog

Imprimir utilizando PrintDocument y PrintDialogste 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

1.If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then2.PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings3.PrintDocument1.Print()4.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

1.e.Graphics.DrawString(TextBox1.Text, New Font("Verdana", 18, FontStyle.Bold), Brushes.Black, 10, 10)2. 3.For i As Integer = 1 To 10

Page 2: Imprimir Utilizando PrintDocument y PrintDialog

4.e.Graphics.DrawString("Ejemplo de linea: " & i, New Font("Tahoma", 10, FontStyle.Bold), Brushes.Black, 10, 20 + (i * 30))5.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)

Page 3: Imprimir Utilizando PrintDocument y PrintDialog

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.

Imprimir el contenido de un DataGridView con PrintDocument (en VB.NET)

Dada la cantidad de comentarios (más de 10 :P) que se produjeron en el post en el

que explicaba como imprimir el contenido de un datagrid, me veo en la obligación a

hacer el mismo ejemplo en VB.NET, sobre todo porque el código que puse en los

comentarios tenía algún error.

Recordando el ejemplo, se trata de un formulario que contiene:

- un datagrid llamado DataGridView1 

- un botón llamado Button1

- un PrintDocument llamado PrintDocument1

Y aquí tenéis el código:

Public Class Form1

' Variable a nivel de clase para recordar en qué punto nos hemos

quedado

Dim i As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

Me.Fill_DataGrid()

End Sub

Private Sub Fill_DataGrid()

' TODO: rellenar con el código que obtiene los datos de donde

sea necesario

' Por ejemplo:

Me.DataGridView1.DataSource = dataSet

Me.DataGridView1.DataMember = "Table"

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles Button1.Click

Page 4: Imprimir Utilizando PrintDocument y PrintDialog

Me.PrintDocument1.Print()

End Sub

Private Sub printDocument1_PrintPage(ByVal sender As Object, ByVal

e As System.Drawing.Printing.PrintPageEventArgs) Handles

PrintDocument1.PrintPage

' Definimos la fuente que vamos a usar para imprimir

' en este caso Arial de 10

Dim printFont As System.Drawing.Font = New Font("Arial", 10)

Dim topMargin As Double = e.MarginBounds.Top

Dim yPos As Double = 0

Dim linesPerPage As Double = 0

Dim count As Integer = 0

Dim texto As String = ""

Dim row As System.Windows.Forms.DataGridViewRow

' Calculamos el número de líneas que caben en cada página

linesPerPage = e.MarginBounds.Height /

printFont.GetHeight(e.Graphics)

' Imprimimos las cabeceras

Dim header As DataGridViewHeaderCell

For Each column As DataGridViewColumn In DataGridView1.Columns

header = column.HeaderCell

texto += vbTab + header.FormattedValue.ToString()

Next

yPos = topMargin + (count * printFont.GetHeight(e.Graphics))

e.Graphics.DrawString(texto, printFont,

System.Drawing.Brushes.Black, 10, yPos)

' Dejamos una línea de separación

count += 2

' Recorremos las filas del DataGridView hasta que llegemos

' a las líneas que nos caben en cada página o al final del

grid.

While count < linesPerPage AndAlso i <

DataGridView1.Rows.Count

row = DataGridView1.Rows(i)

texto = ""

For Each celda As System.Windows.Forms.DataGridViewCell In

row.Cells

'Comprobamos que la celda tenga algún valor, en caso

de

Page 5: Imprimir Utilizando PrintDocument y PrintDialog

'permitir añadir filas esto es muy importante

If celda.Value IsNot Nothing Then

texto += vbTab + celda.Value.ToString()

End If

Next

' Calculamos la posición en la que se escribe la línea

yPos = topMargin + (count *

printFont.GetHeight(e.Graphics))

' Escribimos la línea con el objeto Graphics

e.Graphics.DrawString(texto, printFont,

System.Drawing.Brushes.Black, 10, yPos)

' Incrementamos los contadores

count += 1

i += 1

End While

' Una vez fuera del bucle comprobamos si nos quedan más filas

' por imprimir, si quedan saldrán en la siguente página

If i < DataGridView1.Rows.Count Then

e.HasMorePages = True

Else

' si llegamos al final, se establece HasMorePages a

' false para que se acabe la impresión

e.HasMorePages = False

' Es necesario poner el contador a 0 porque, por ejemplo

si se hace

' una impresión desde PrintPreviewDialog, se vuelve

disparar este

' evento como si fuese la primera vez, y si i está con el

valor de la

' última fila del grid no se imprime nada

i = 0

End If

End Sub

Page 6: Imprimir Utilizando PrintDocument y PrintDialog

imprimir varias páginas con el printdocument en vb.net

1. Private Sub prt_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)

2.         ' La fuente que vamos a usar para imprimir.3.        Dim printFont As System.Drawing.Font = New Font("Arial", 8)

'prtFont4.        Dim topMargin As Double = e.MarginBounds.Top5.         Dim yPos As Double = 06.         Dim linesPerPage As Double = 07.         Dim count As Integer = 08.         Dim texto As String = ""9.  10.         ' Calculamos el número de líneas que caben en cada página. 11.        linesPerPage = e.MarginBounds.Height /

printFont.GetHeight(e.Graphics)12.  13.         While count < linesPerPage AndAlso i < Datos.Count14.             Dim info As BoInfoBOLETA = Datos(i)15.             e.Graphics.DrawRectangle(New Pen(Color.Red, 1), -75, -75,

1585, 639)16.             e.Graphics.DrawString("24 del 01/01/2011 al 31/02/2011",

printFont, Brushes.Black, 170, 60)17.             e.Graphics.DrawString(CStr(Format(Date.Now, "dd/MM/yyy")),

printFont, Brushes.Black, 470, 60)18.             e.Graphics.DrawString(info.codigo, printFont, Brushes.Black,

70, 80)19.             e.Graphics.DrawString(info.nombres, printFont,

Brushes.Black, 200, 80)20. .21. .22. .23. .24. .25. .26. .27. .28. .29.             count = CInt(count + 35.61)30.             i = i + 131.  32.         End While33.  34.         If i < Datos.Count Then35.             e.HasMorePages = True36.         Else37.             e.HasMorePages = False38.             i = 039.         End If

Page 7: Imprimir Utilizando PrintDocument y PrintDialog

Impresiones con Visual Basic 2010

Pese a que vivimos en una era digital y todo (bueno, casi todo) se

hace por internet y con la computadora, aún hay momentos en

que el papel es necesario.  Hace tiempo escribí un post donde

indicaba cómo imprimir usando Visual Basic 6, pero no había

tenido la oportunidad de hacer lo mismo con el Visual Basic .net. 

Y eso precisamente es lo que pienso hacer en esta ocasión: mostrar como usar los

controles y cajas de diálogo para imprimir y la forma de imprimir tanto texto como

imágenes.

Antes de continuar con rollo, código, ejemplos y demases, voy a describir

brevemente los componentes que tiene Visual Basic 2010 para imprimir.

Control PrintDocument

Este control se debe agregar a cualquier proyecto en el que se quiera imprimir

algo.  Haz de cuenta que es la hoja en blanco donde puedes dibujar diferentes

objetos, escribir texto y colocar imágenes de mapa de bits.  Cuando acabes de

dibujar, escribir, etc., se llama el método Print para que la impresora escupa la

hoja.  Acepta todos los métodos de dibujo que usa el objeto Graphics (mismo del

que di ejemplos aquí y aquí), es decir que si tienes que escribir texto, usas el

método DrawString; si quieres dibujar un marco alrededor del texto, puedes

usar DrawLine o DrawRectangle.  Aunque el control es invisible (no aparece en la

ventana ni hay forma de ir viendo conforme se va dibujando), es muy útil.

Control PrintDialog

Este control hace aparecer la ventana default que te permite elegir y configurar la

impresora que se desea emplear.  Si no se usa, la impresión se hace en la

impresora que se tiene definida como default con las propiedades que trae por

default (o sea con lo default de lo default  ).  Para que aparezca, se debe usar el

método ShowDialog.

Page 8: Imprimir Utilizando PrintDocument y PrintDialog

Control PageSetupDialog

Este control hace aparecer la ventana que te permite configurar el papel a usar:

tamaño, orientación, márgenes, etc.  Se debe usar su método ShowDialog para que

aparezca, igual que con el control PrintDialog.

Control PrintPreviewDialog

Este control hace aparecer una vista previa de lo que se va a imprimir.  Como

mostraré más adelante, se debe vincular este control con lo el

control PrintDocument para que todo lo que se va a imprimir, en lugar de ir a la

impresora, aparezca en esta ventana.  También hay que tener cuidado: si no se

tiene acceso a la impresora que está seleccionada (por ejemplo, una impresora de

la red a la cual no tengo acceso en este momento o la que tengo conectada está

apagada), no aparece la ventana y te marca error.  Es necesario recibir este error

(con un Try…Catch) para que no termine abruptamente el programa solo porque no

halla la impresora (cosa que no hago en este post, por cierto).

Ejemplo de su uso

Después de este rollo (que espero que haya sido breve), voy a ejemplificar el uso

de estos controles en un programa que hice con mis queridísimos alumnos de

4TPO.  Es un ejemplo muy simple que solo muestra como se usan los controles. 

Sin embargo, creo que con estas bases ya le pueden echar vuelo a la imaginación

para aplicarlo en otros contextos.

Antes que nada, les muestro el diseño de la ventana principal.  Consta de 3

etiquetas, 3 cajas de texto (txtNombre, txtDir y txtRFC), un PictureBox

(picCanoa) que sirve para mostrar como imprimir una imagen de mapa de bits, 7

botones cuyo código explicaré más adelante, 2 controles PrintDocument,

un PrintDialog, un PageSetup y unPrintPreviewDialog.  Estos 5 últimos no

aparecen en la ventana: cuando los agregas a la ventana aparecen en la parte

inferior.

Page 9: Imprimir Utilizando PrintDocument y PrintDialog

Para que un PrintDocument funcione, es necesario editar su evento PrintPage.  Si

le das doble clic al icono PrintDocument1, verás este código:

Básicamente uso el parámetro e, que es “la hoja invisible” sobre la que voy a

dibujar, para escribir 3 cadenas, un rectángulo y la imagen de la canoa.  Como

mencioné con anterioridad, son las mismas funciones que se usan para dibujar

gráficos sobre la ventana cosa que ya escribí en este post y en este también.

Una vez que tienes este evento listo, puedes mandar imprimir con la

función Print.  Yo lo hago con el botón cuya etiqueta dice Imprimir y este es el

código:

El PrintDocument2 muestra una idea para imprimir formatos.  Dibujé el esqueleto

de un formato, lo guardé como PNG, lo importé a Visual Basic y lo puse en

Page 10: Imprimir Utilizando PrintDocument y PrintDialog

un PictureBox(llamado PictureBox1) en la ventana frmPicts.  Aquí está la

ventana frmPicts y abajo el código que lo usa (primero el el botón que tiene la

etiqueta Imprimir formato,btnImprime2, y luego PrintPage).

Configurar la impresora es muy simple usando el control PrintDialog.  Este es el

código del botón con la etiqueta Configurar impresora.  Fíjate en la manera en que

copio las propiedades puestas por el usuario en este cuadro de diálogo en los dos

controlesPrintDocument (en las 2 últimas instrucciones):

A la hora de ejecutarse, el control PrintDialog hace que aparezca esta ventana:

Page 11: Imprimir Utilizando PrintDocument y PrintDialog

También es sencillo modificar la configuración de la página.  Este es el código del

botón etiquetado Configurar página:

Antes del ShowDialog es necesario igualar sus propiedades a los que ya tiene

unPrintDocument (en las dos instrucciones que siguen al comentario).  Al correr

este evento, aparece esta ventana:

Page 12: Imprimir Utilizando PrintDocument y PrintDialog

Una vista previa (o presentación preeliminar) de lo que se va a imprimir suele ser

bastante útil para muchos usuarios.  Hacer que aparezca es sencillísimo.  Lo único

que hay que hacer es hacer que, en lugar de que el evento PrintPage de

un PrintDocument lo mande a la impresora, se le envía a esta caja de diálogo. 

Abajo pongo el código y luego la ventana que aparece que muestra la vista

preeliminar:

Page 13: Imprimir Utilizando PrintDocument y PrintDialog

También es posible jugar con la configuración de la impresora.  Para leer algunas

propiedades de las impresoras, hice el botón etiquetado Lista de impresoras que

abre la ventana frmImpresoras desde donde se pueden ver la lista de impresoras

instaladas y al seleccionar una de ellas, se ven algunas de sus propiedades.  Esta

es la ventanafrmImpresoras en la vista diseño:

Tiene una lista donde voy a escribir la lista de impresoras (ListBox1), etiquetas

que muestran los valores de las copias, si es duplex (si puede imprimir por ambas

caras de la hoja), el número máximo de copias permitidas y si puede recibir

documentos a color (lblCopias, lblDuplex, lblCopiasMax y lblColor,

respectivamente).  También es necesario un PrintDocument para poder ver estas

propiedades.  Pero antes que nada, veamos el código con que llena ListBox1:

Page 14: Imprimir Utilizando PrintDocument y PrintDialog

Nótese que estoy haciendo uso de la

colecciónPrinting.PrinterSettings.InstalledPrinters misma que contiene la

lista de todas las impresoras instaladas en el equipo donde se está ejecutando. 

Estoy usando la instrucción With para abreviar un poco y no escribir este rollo a

cada rato.

No necesito escribir un evento PrintPage para el PrintDocument1 porque no voy a 

imprimir nada: solo lo necesito para poder mostrar las propiedades.  Por esta razón el otro código 

interesante es el que se ejecuta cuando ListBox1 cambia de elemento seleccionado:

Este es un ejemplo de como se ve esta ventana con una impresora seleccionada:

Espero que este documento te sea útil.  ¡Hasta la próxima!

Page 15: Imprimir Utilizando PrintDocument y PrintDialog