none
ReportDocument y Diferentes impresoras. RRS feed

  • 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

    miércoles, 6 de diciembre de 2017 21:37

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) AInteger

            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

    jueves, 7 de diciembre de 2017 12:45

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.

    miércoles, 6 de diciembre de 2017 22:38
  • 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

    jueves, 7 de diciembre de 2017 1:46
  • 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) AInteger

            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

    jueves, 7 de diciembre de 2017 12:45