none
Imprimir Ticket de venta - Escritorio Remoto RRS feed

  • Pregunta

  • Buenas noches, con todos he estado investigando mucho sobre impresion texto sin formato, he logrado realizar ello, pero hay un detalle, encontre un codigo en windows que me sirve para imprimir.

    'Clase para mandara a imprimir texto plano a la impresora
    Public Class RawPrinterHelper
        ' Structure and API declarions:
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
        Public Class DOCINFOA
            <MarshalAs(UnmanagedType.LPStr)>
            Public pDocName As String
            <MarshalAs(UnmanagedType.LPStr)>
            Public pOutputFile As String
            <MarshalAs(UnmanagedType.LPStr)>
            Public pDataType As String
        End Class
        <DllImport("winspool.Drv", EntryPoint:="OpenPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> szPrinter As String, ByRef hPrinter As IntPtr, pd As IntPtr) As Boolean
        End Function
    
        <DllImport("winspool.Drv", EntryPoint:="ClosePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function ClosePrinter(hPrinter As IntPtr) As Boolean
        End Function
    
        <DllImport("winspool.Drv", EntryPoint:="StartDocPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function StartDocPrinter(hPrinter As IntPtr, level As Int32, <[In], MarshalAs(UnmanagedType.LPStruct)> di As DOCINFOA) As Boolean
        End Function
    
        <DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function EndDocPrinter(hPrinter As IntPtr) As Boolean
        End Function
    
        <DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function StartPagePrinter(hPrinter As IntPtr) As Boolean
        End Function
    
        <DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function EndPagePrinter(hPrinter As IntPtr) As Boolean
        End Function
    
        <DllImport("winspool.Drv", EntryPoint:="WritePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
        Public Shared Function WritePrinter(hPrinter As IntPtr, pBytes As IntPtr, dwCount As Int32, ByRef dwWritten As Int32) As Boolean
        End Function
    
        ' SendBytesToPrinter()
        ' When the function is given a printer name and an unmanaged array
        ' of bytes, the function sends those bytes to the print queue.
        ' Returns true on success, false on failure.
        Public Shared Function SendBytesToPrinter(szPrinterName As String, pBytes As IntPtr, dwCount As Int32) As Boolean
            Dim dwError As Int32 = 0, dwWritten As Int32 = 0
            Dim hPrinter As New IntPtr(0)
            Dim di As New DOCINFOA()
            Dim bSuccess As Boolean = False
            ' Assume failure unless you specifically succeed.
            di.pDocName = "Ticket de Venta"
            'Este es el nombre con el que guarda el archivo en caso de no imprimir a la impresora fisica.
            di.pDataType = "RAW"
            'de tipo texto plano
            ' Open the printer.
            If OpenPrinter(szPrinterName.Normalize(), hPrinter, IntPtr.Zero) Then
                ' Start a document.
                If StartDocPrinter(hPrinter, 1, di) Then
                    ' Start a page.
                    If StartPagePrinter(hPrinter) Then
                        ' Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)
                        EndPagePrinter(hPrinter)
                    End If
                    EndDocPrinter(hPrinter)
                End If
                ClosePrinter(hPrinter)
            End If
            ' If you did not succeed, GetLastError may give more information
            ' about why not.
            If bSuccess = False Then
                dwError = Marshal.GetLastWin32Error()
            End If
            Return bSuccess
        End Function
    
        Public Shared Function SendStringToPrinter(szPrinterName As String, szString As String) As Boolean
            Dim pBytes As IntPtr
            Dim dwCount As Int32
            ' How many characters are in the string?
            dwCount = szString.Length
            ' Assume that the printer is expecting ANSI text, and then convert
            ' the string to ANSI text.
            pBytes = Marshal.StringToCoTaskMemAnsi(szString)
            ' Send the converted ANSI string to the printer.
            SendBytesToPrinter(szPrinterName, pBytes, dwCount)
            Marshal.FreeCoTaskMem(pBytes)
            Return True
        End Function
    
    End Class

    Con esta clase puede imprimir, seguidamente pongo este codigo que esta en lineas inferiores para poder imprimir y mandar en la impresora señalada

        Public Sub ImprimirTicket(impresora As String)
            'Este metodo recibe el nombre de la impresora a la cual se mandara a imprimir y el texto que se imprimira.
            'Usaremos un código que nos proporciona Microsoft. https://support.microsoft.com/es-es/kb/322091
    
            RawPrinterHelper.SendStringToPrinter(impresora, linea.ToString())
            'Imprime texto.
            linea.Clear()
            'Al cabar de imprimir limpia la linea de todo el texto agregado.
        End Sub


            ticket.ImprimirTicket("POS")

    Localmente cuando corro el programa si imprimir pero el detalle es cuando esta en un escritorio remoto, la impresora cambia de nombre asi como en la imagen, y lo que yo logro ver que el problema es eso como cambia el nombre no lo imprime, lo que quiero saber es como puedo hacer para que llegue a imprimir desde un escritorio remoto.Gracias

    • Cambiado Joyce_AC lunes, 19 de junio de 2017 16:56
    viernes, 16 de junio de 2017 23:52

Todas las respuestas

  • Hola;

    Puedes probar habilitando la opción Windows Printer, en RDP-Tcp Properties:

    Saludos.


    Celso Javier Guzmán Díaz
    Blog Tecnico: https://elcegu.wordpress.com

    sábado, 8 de julio de 2017 1:23