none
Error al imprimir archivo RRS feed

  • Debate general

  • Buenas, estoy tratando de imprimir un .pdf , en 64bits no me da ningun problema pero en ordenadores mas lentos de 32bits me dice que el fichero no existe, mi codigo es:

            Dim pathToExecutable As String = "AcroRd32.exe"
            Dim sReport = path
            Dim SPrinter As String

            SPrinter = impresora 'Name Of printer

            Try

            Dim starter As New ProcessStartInfo(pathToExecutable, "/t " + sReport + " " + SPrinter + "")
            starter.WindowStyle = ProcessWindowStyle.Hidden

            Dim p As Process = Process.Start(starter)
            p.WaitForInputIdle()


            p.WaitForExit(900)

            If p.HasExited = False Then

                'El proceso continúa ejecutándose.
                'Prueba para ver si el proceso se bloqueó.
                If p.Responding Then
                    'El proceso estaba respondiendo; cierre la ventana principal.
                    p.CloseMainWindow()
                Else
                    'El proceso no estaba respondiendo; fuerce el cierre del proceso.
                    p.Kill()
                End If
            End If




                If quieroimprimir = 6 Then

                Else
                    My.Computer.FileSystem.DeleteFile(path)
                End If

            Catch ex As Exception

            End Try

    gracias

    martes, 29 de abril de 2014 16:23

Todas las respuestas

  • ¿Que valor tienes en la variable path?

    Si haces Dim sReport = "C:\Directorio\*.pdf"

    y en la carpeta C:\Directorio existen archivos .pdf no debe darte ningún error.



    Saludos, Javier J

    martes, 29 de abril de 2014 16:45
  • gracias por responder, si la ruta es absoluta y apunta al archivo, yo creo que es porque el pc es demasiado lento y el proceso finaliza antes de tiempo.

    Pongo dos msgbox y no muestra ninguno

      If p.Responding Then
                        'El proceso estaba respondiendo; cierre la ventana principal.
                        p.CloseMainWindow()
                        MsgBox("correcto")
                    Else
                        'El proceso no estaba respondiendo; fuerce el cierre del proceso.
                        MsgBox("muerto")
                        p.Kill()
                    End If


    • Editado Adm1990 martes, 29 de abril de 2014 16:57
    martes, 29 de abril de 2014 16:50
  • No creo que tenga que ver con la velocidad del PC que te diga que el fichero no existe.

    Prueba a ampliar al tiempo en 

     p.WaitForExit(900)


    Saludos, Javier J

    martes, 29 de abril de 2014 17:06
  • es que el fichero es creado mediante otro boton en un backgroundworkerDowork y en pcs mas potentes funciona sin problema, aqui el otro codigo

     Dim frm As New ticketres()
                frm.Titulo = "Ticket Resguardo"
                frm.Empresa = "Cliente"
                frm.Invoice.Add(invoice)
                frm.Detail = invoice.Detail
                ficheroa = "Rep_" & numero1 & ".pdf"
                frm.ReportViewer1.LocalReport.DataSources.Clear()
                '
                'Establezcamos los parametros que enviaremos al reporte
                'recuerde que son dos para el titulo del reporte y para el nombre de la empresa
                '
                Dim parameters As ReportParameter() = New ReportParameter(1) {}
                parameters(0) = New ReportParameter("parameterTitulo", frm.Titulo)
                parameters(1) = New ReportParameter("parameterEmpresa", frm.Empresa)

                '
                'Establezcamos la lista como Datasource del informe
                '
                frm.ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("encabezado", frm.Invoice))

                '
                'Enviemos la lista de parametros
                Dim parametros As New List(Of Microsoft.Reporting.WinForms.ReportParameter)

                parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("tienda", tienda))
                parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("telefonotienda", telefonotienda, False))

                frm.ReportViewer1.LocalReport.SetParameters(parametros)
                'ReportViewer1.LocalReport.SetParameters(parameters)



                frm.ReportViewer1.RefreshReport()


                ' exporto ese reporte a un pdf


                Dim bytes() As Byte
                Dim strDeviceInfo As String = ""
                Dim strMimeType As String = ""
                Dim strEncoding As String = ""
                Dim strExtension As String = ""
                Dim strStreams() As String
                Dim warnings() As Warning
                Dim oFileStream As FileStream
                Dim stream = New List(Of Stream)
                Try

                    path = My.Application.Info.DirectoryPath & "\Facturas\reparaciones\" & fichero
                    bytes = frm.ReportViewer1.LocalReport.Render("PDF", strDeviceInfo, strMimeType, strEncoding, strExtension, strStreams, warnings)

                    oFileStream = New FileStream(path, FileMode.Create)
                    oFileStream.Write(bytes, 0, bytes.Length)
                    stream.Add(oFileStream)
                Finally
                    If Not IsNothing(oFileStream) Then
                        oFileStream.Close()
                        oFileStream.Dispose()
                    End If
                End Try



    • Editado Adm1990 martes, 29 de abril de 2014 17:12
    martes, 29 de abril de 2014 17:10
  • Ponle la parte del 

    Catch ex As Exception
       MsgBox(ex.Message)

    También, en el botón anterior, antes de la línea 

    Dim p As Process = Process.Start(starter)

    Comprueba la existencia del fichero con

    If Not File.Exists(sReport ) Then

    msgbox "El fichero " & sReport & " no existe."

    End If


    Saludos, Javier J

    martes, 29 de abril de 2014 17:27
  • vale he puesto eso y no salta ninguno simplemente se abre reader y el mensaje de adobe de que no encuentra el fichero, pero si me lo crea

    • Editado Adm1990 martes, 29 de abril de 2014 18:17
    martes, 29 de abril de 2014 17:39
  • por si os sirve de algo, en el ordenador que me dice que no encuentra el pdf, tiene instalado xp.

    Gracias

    miércoles, 30 de abril de 2014 9:07
  • Solucionado, actualizas el reader, y listo vaya tela.
    miércoles, 30 de abril de 2014 10:24
  • Pense que lo tenia solucionado pero no es asi, aunque se que el problema esta cuando ejecuto la aplicacion desde un lugar distinto al USB, es decir si copio la carpeta de mi solucion al escritorio y la ejecuto, reader no encuentra el archivo, pero si la ejecuto desde el pendrive si lo encuentra, por lo que he decidido crear la carpeta  donde van los archivos en "Mis Documentos" pero de esta forma no va de ninguna forma.

    Alguna idea?

    Dim bytes() As Byte
                Dim strDeviceInfo As String = ""
                Dim strMimeType As String = ""
                Dim strEncoding As String = ""
                Dim strExtension As String = ""
                Dim strStreams() As String
                Dim warnings() As Warning
                Dim oFileStream As FileStream
                Dim stream = New List(Of Stream)
                Dim misdocumentos As String
                Dim directorio As String
                misdocumentos = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
                directorio = misdocumentos & "\Facturas\Tickets\"
                Try




                    If Directory.Exists(directorio) Then
                        MessageBox.Show("El directorio existe")
                    Else
                        MessageBox.Show("El directorio no existe")
                        System.IO.Directory.CreateDirectory(directorio)
                    End If

                    path = directorio & ficheroaeliminar

                    bytes = frm.ReportViewer1.LocalReport.Render("PDF", strDeviceInfo, strMimeType, strEncoding, strExtension, strStreams, warnings)

                    oFileStream = New FileStream(path, FileMode.Create)
                    oFileStream.Write(bytes, 0, bytes.Length)
                    stream.Add(oFileStream)
                Catch

                Finally
                    If Not IsNothing(oFileStream) Then
                        oFileStream.Close()
                        oFileStream.Dispose()
                    End If

                End Try

            Catch ex As Exception

            End Try

    Funcion imprimir:

    Public Sub imprimir(impresora As String)


            Dim pathToExecutable As String = "AcroRd32.exe"
            Dim sReport = path
            MsgBox(sReport)
            Dim SPrinter As String

            SPrinter = impresora 'Name Of printer

            Try

                Dim starter As New ProcessStartInfo(pathToExecutable, "/t " + sReport + " " + SPrinter + "")

                starter.WindowStyle = ProcessWindowStyle.Hidden

                If Not File.Exists(sReport) Then

                    MsgBox("El fichero " & sReport & " no existe.")
                Else
                End If

                Dim p As Process = Process.Start(starter)
                p.WaitForInputIdle()


                p.WaitForExit(1100)

                If p.HasExited = False Then

                    'El proceso continúa ejecutándose.
                    'Prueba para ver si el proceso se bloqueó.
                    If p.Responding Then
                        'El proceso estaba respondiendo; cierre la ventana principal.
                        p.CloseMainWindow()

                    Else
                        'El proceso no estaba respondiendo; fuerce el cierre del proceso.

                        p.Kill()
                    End If


                End If


                'If quieroimprimir = 6 Then

                'Else
                '    My.Computer.FileSystem.DeleteFile(path)
                'End If

            Catch ex As Exception

            End Try
        End Sub

    • Editado Adm1990 sábado, 3 de mayo de 2014 10:46
    sábado, 3 de mayo de 2014 10:43
  • Porque no usas Un Solo Proceso sin especificar la API 

    de esta Manera , El Archivo siempre imprimira a la default Printer sea la extension que sea siempre y cuando tenga el verbo 'Print' asi te evitas de estar creardo el archivo y eliminarlo puesto que el Archivo lo estas eliminando antes de que se imprima , Los procesadores aldunos son mas rapidos otros son mas lentos al cual no es garantia que te imprima siempre al tiempo que el pones

    El siguente codigo envia el archivo a la impresora y siempre imprimira porque el documento se pone el cola de impresion.

      Dim pr As New Process
            Dim processInfo As New ProcessStartInfo("C:\Users\user\Documents\File.pdf")
            processInfo.WindowStyle = ProcessWindowStyle.Hidden
            processInfo.Verb = "Print"
            pr.StartInfo = processInfo
            pr.Start()

    Saludos. Espero te ayude


    Website http://www.melvindev.com

    lunes, 12 de mayo de 2014 7:27