Principales respuestas
ReportDocument y Diferentes impresoras.

Pregunta
-
Estimados, tengo un ReportDocument, que carga un .rpt hecho en Crystal Reports y se previsualiza en un CrystalReportViewer. En las propiedades de mi aplicación, guardo mapeo de impresoras para diferentes tipo de comprobantes, por ejemplo: Facturas en Impresora1, Cotizaciones en Impresora2... Etc. En éste caso, el mapeo es para utilizar una impresora de Etiquetas Zebra. Tengo una HP predeterminada, que está instalada en otra PC y configurada en la máquina en cuestión a través de recursos compartidos, y la Zebra por USB. Ahora bien, cuando se muestra el reporte, en un botón le doy al usuario la posibilidad de imprimir en la impresora mapeada para el comprobante que esté visualizando, haciendo lo siguiente antes de mostrar el reporte:
ReportDocument (Variable Global al Formulario)
1. ReportDocument.PrintOptions.PrinterName = ImpresoraEtiquetas (La impresora mapeada)
2. CrystalReportViewer.ReportSource = rpt (Con ésto se Previsualiza)
Cuando le doy al botón imprimir:
3. ReportDocument.PrintToPrinter(1, False, 0, 0) (Teoricamente debería imprimirse en la impresora que le asigné en la primer instrucción)
El problema cuál es: La impresora compartida HP configurada en la PC local, en propiedades, puertos, me sale: USB001 y la Zebra (Etiquetas) en propiedades, puertos, también sale: USB001. Sin posibilidad de asignarla a otro USB porque no me figura ninguno más en la lista de puertos, salvo los LTP, COM, XPS, etc... Entonces, al imprimir a través de la última instrucción, sale por la HP en vez de la etiquetadora.
De antemano, agradezco cualquier sugerencia que puedan aportar.
Saludos.
Renzo Pique
Respuestas
-
Bueno lo resolví de la siguiente manera:
En las propiedades de la aplicación, donde mapeo la impresora, generé nuevos campos para indicar nombre y dimensiones del papel (existentes claro, en las propiedades del servidor de impresión), por un lado.
Y por el otro cambié el código:
Private Sub ImprimeArticulosEtiquetasImpPredeterminada(intCopias As Integer, EtiPapel As String, EtiAncho As Decimal, EtiAlto As Decimal)
If intCopias = 0 Then intCopias = 1
Dim ImpSet As New Printing.PrinterSettings
ImpSet.PrinterName = ImpresoraFinal
ImpSet.Copies = intCopias
Dim PageSet As New Printing.PageSettings
PageSet.PrinterSettings.Copies = intCopias
PageSet.PaperSize = New Printing.PaperSize(EtiPapel, EtiAncho, EtiAlto)
ImpSet.DefaultPageSettings.PaperSize = PageSet.PaperSize
rpt.PrintOptions.PaperSize = GetPapersizeID(rpt.PrintOptions.PrinterName, EtiPapel)
rpt.PrintToPrinter(ImpSet, PageSet, False)
End Sub
Public Function GetPapersizeID(ByVal PrinterName As String, ByVal PaperSizeName As String) As Integer
Dim pdprint As New System.Drawing.Printing.PrintDocument()
Dim PaperSizeID As Integer = 0
Dim ppname As String = ""
pdprint.PrinterSettings.PrinterName = PrinterName
For i As Integer = 0 To pdprint.PrinterSettings.PaperSizes.Count - 1
Dim rawKind As Integer
ppname = PaperSizeName
If pdprint.PrinterSettings.PaperSizes(i).PaperName = ppname Then
rawKind = CInt(pdprint.PrinterSettings.PaperSizes(i).RawKind)
PaperSizeID = rawKind
Exit For
End If
Next
Return PaperSizeID
End Function
En vez de utilizar:
1. ReportDocument.PrintOptions.PrinterName = ImpresoraEtiquetas (La impresora mapeada)
3. ReportDocument.PrintToPrinter(1, False, 0, 0)
Creo los objetos correspondientes para pasarle parámetros a PrintToPrinter.
Saludos.
Renzo Pique
- Marcado como respuesta Juan MondragónModerator jueves, 7 de diciembre de 2017 15:50
Todas las respuestas
-
Hola Renzo Piqué Barbieri
Con base a tu consulta, revisa que tus drivers estén actualizados, muchas veces esto se debe debido a una des configuración.
Quedamos al pendiente de cualquier actualización de tu parte.
Saludos Cordiales.
Gracias por usar los foros de MSDN.
Pablo Rubio
_____Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
-
Hola. Gracias por la sugerencia. Los drivers utilizados están bajados de la página de cada fabricante, tanto HP como Zebra. No creo que sea un problema de controladores. Ambas impresoras, reitero, tanto la Zebra (Instalación Local), como la HP (Instalación desde Compartida), figuran en el USB001 (No aparece otro tampoco como para cambiarle el puerto a la impresora, es W7 x86 por cierto), y por más que al ReportDocument le indique el nombre de la impresora sobre la que quiero que imprima, siempre me saca el informe por la predeterminada, sea la Zebra o la HP.
Instalé un doPDF, que crea su propio puerto virtual (DOP7), para probar. Puse esa impresora como predeterminada, y en las propiedades de la aplicación, mapee la sección de etiquetas sobre la Zebra. Entonces sí, imprimo cualquier comprobante y va a la impresora doPDF, imprimo etiquetas y va a la Zebra.
El conflicto está entre la Zebra y la HP, insisto, ambas en USB001, pero no puedo separarlas. :(
Renzo Pique
-
Bueno lo resolví de la siguiente manera:
En las propiedades de la aplicación, donde mapeo la impresora, generé nuevos campos para indicar nombre y dimensiones del papel (existentes claro, en las propiedades del servidor de impresión), por un lado.
Y por el otro cambié el código:
Private Sub ImprimeArticulosEtiquetasImpPredeterminada(intCopias As Integer, EtiPapel As String, EtiAncho As Decimal, EtiAlto As Decimal)
If intCopias = 0 Then intCopias = 1
Dim ImpSet As New Printing.PrinterSettings
ImpSet.PrinterName = ImpresoraFinal
ImpSet.Copies = intCopias
Dim PageSet As New Printing.PageSettings
PageSet.PrinterSettings.Copies = intCopias
PageSet.PaperSize = New Printing.PaperSize(EtiPapel, EtiAncho, EtiAlto)
ImpSet.DefaultPageSettings.PaperSize = PageSet.PaperSize
rpt.PrintOptions.PaperSize = GetPapersizeID(rpt.PrintOptions.PrinterName, EtiPapel)
rpt.PrintToPrinter(ImpSet, PageSet, False)
End Sub
Public Function GetPapersizeID(ByVal PrinterName As String, ByVal PaperSizeName As String) As Integer
Dim pdprint As New System.Drawing.Printing.PrintDocument()
Dim PaperSizeID As Integer = 0
Dim ppname As String = ""
pdprint.PrinterSettings.PrinterName = PrinterName
For i As Integer = 0 To pdprint.PrinterSettings.PaperSizes.Count - 1
Dim rawKind As Integer
ppname = PaperSizeName
If pdprint.PrinterSettings.PaperSizes(i).PaperName = ppname Then
rawKind = CInt(pdprint.PrinterSettings.PaperSizes(i).RawKind)
PaperSizeID = rawKind
Exit For
End If
Next
Return PaperSizeID
End Function
En vez de utilizar:
1. ReportDocument.PrintOptions.PrinterName = ImpresoraEtiquetas (La impresora mapeada)
3. ReportDocument.PrintToPrinter(1, False, 0, 0)
Creo los objetos correspondientes para pasarle parámetros a PrintToPrinter.
Saludos.
Renzo Pique
- Marcado como respuesta Juan MondragónModerator jueves, 7 de diciembre de 2017 15:50