none
Mostrar un archivo PDF guardado en una BD RRS feed

  • Pregunta

  • Buen día.

    Tengo mi base de datos en la cual en una tabla estan almacenados en un campo tipo varbinary archivos BMP y JPEG. no tengo problemas con estos tipos de archivo porque la función que cree para mostrarlos acepta estos tipos de archivos, el problema se da cuando cargo archivos PDF.

    Public Function GetImage(ByVal pict As String)

            Dim bmp As Bitmap = JMG30VB.My.Resources.photo_delete

            Dim sqlCommand As New SqlCommand("SELECT Chart FROM JMGCommon.dbo.Images WHERE SerialNumber = '" + pict + "'", conex(99))
            Dim sqlCommOK = sqlCommand.ExecuteScalar

            If TypeOf sqlCommOK Is System.Array Then
                Dim buffer As Byte() = sqlCommand.ExecuteScalar
                Dim ms As MemoryStream = New MemoryStream(buffer)
                bmp = New Bitmap(ms)  ' se produce el error porque Bitmap no acepta archivos PDF
            End If

            Return bmp

        End Function

    Bueno es lo que puede crear, me podrían ayudar para que esta función trabaje con PDF.

    Gracias de antemano.

    Saludos,

    Jaime.


    saludos.

    martes, 2 de septiembre de 2014 14:21

Respuestas

  • Hola:

    Ejemplo para extraer el contenido de un campo VarBinary y generar el fichero con el contenido de ese campo.
    Tambien para poder verlo

    En un Form con 2 Button y 1 TextBox, copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Imports System.IO
    Imports System.Data.SqlClient

    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"

        Private Sub btnCrear_Click(sender As System.Object, e As System.EventArgs) Handles btnCrear.Click
            ' recuperamos el documento de la base de datos y lo pasamos a un fichero
            Dim drDocumentos As SqlDataReader
            Dim aBytDocumento() As Byte = Nothing
            Dim oFileStream As FileStream
            Try
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim lsQuery As String = "Select CAMPO_VARBINARY From TU_TABLA Where ID=@Id"
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@Id", Me.TextBox1.Text))
                        loConexion.Open()
                        drDocumentos = loComando.ExecuteReader(CommandBehavior.SingleRow)
                    End Using
                    If drDocumentos.Read() Then
                        aBytDocumento = CType(drDocumentos("CAMPO_VARBINARY"), Byte())
                    End If
                    drDocumentos.Close()
                    oFileStream = New FileStream("C:\TU_CARPETA\TU_NOMBRE.PDF", FileMode.CreateNew, FileAccess.Write)
                    oFileStream.Write(aBytDocumento, 0, aBytDocumento.Length)
                    oFileStream.Close()
                    MessageBox.Show("Fichero generado con éxito", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Sub btnVer_Click(sender As System.Object, e As System.EventArgs) Handles btnVer.Click
            Dim loPSI As New ProcessStartInfo
            Dim loProceso As New Process
            loPSI.FileName = "C:\TU_CARPETA\TU_NOMBRE.PDF"
            Try
                loProceso = Process.Start(loPSI)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
    End Class

    P.D.
    El campo que extraes, previamente ha sido guardado con un fichero PDF

    Un saludo desde Bilbo
    Carlos

    miércoles, 3 de septiembre de 2014 7:55

Todas las respuestas

  • emm no soy experto en programacion pero yo tuve que convertir un pdf a imagen pero usando un dll externo que se llama pdf focus desgraciadamente no es gratuita pero esta la version de prueba que solo te añade una leyenda arriba de la imagen creada pero yo edito la imagen desde el mismo codigo para cortarle ese pedazo

    te muestro mas o menos como lo hice

    Dim f As New SautinSoft.PdfFocus()
            
            pdfPath = "aqui va la direccion del pdf (incluyendo extensión) como string"
            imagePath = "aqui va la direccion en donde quieres guardar la imagen incluyendo el nombre y extension de la imagen como string" 
    
            f.OpenPdf(pdfPath)
    
            If f.PageCount > 0 Then
                'save 1st page to bmp file, 120 dpi
                f.ImageOptions.ImageFormat = System.Drawing.Imaging.ImageFormat.Bmp
                f.ImageOptions.Dpi = 120
    
                If f.ToImage(imagePath, 1) = 0 Then
                    ' 0 - converting successfully                
                    ' 2 - can't create output file, check the output path
                    ' 3 - converting failed
                    
    
    'hasta aqui ya debio haberse convertido el pdf en imagen
    'lo que sigue fue lo que hice para quitarle la leyenda
    'de version de prueva usando un picturebox invisible
    '(como acabas de confirmar no soy un experto)
                    Dim A As System.Drawing.Image
                    Dim B As System.Drawing.Rectangle
                    Dim c As System.Drawing.Rectangle
                    PictureBox2.Image = New Bitmap(imagePath)
    
                    'asigno A con la imagen del picturebox1
                    A = PictureBox2.Image
    
                    B = New Rectangle(0, 0, PictureBox2.Width, PictureBox2.Height)
    
                    ' copio rectángulo del picturebox1 pero cortado y lo asigno a c
                    c = New Rectangle(0, 70, PictureBox2.Width, PictureBox2.Height)
    
                    'redibujo la imagen en el picturebox2 pero ya con la modificacion
                    Dim D As Bitmap = New Bitmap(PictureBox2.Width, PictureBox2.Height)
                    Dim g As Graphics = Graphics.FromImage(D)
                    g.Clear(Color.White) '
                    g.DrawImage(A, B, c, GraphicsUnit.Pixel)
                    g.Dispose()
                    PictureBox2.Image.Dispose()
                    PictureBox2.Image = D
                    PictureBox2.Image.Save(imagePath, Drawing.Imaging.ImageFormat.Bmp)

    creo que es demasiado complicado para lo que querías 

    esta es pa lagina donde puedes descargar el dll: http://www.sautinsoft.com/products/pdf-focus/index.php

    miércoles, 3 de septiembre de 2014 0:06
  • Hola:

    Ejemplo para extraer el contenido de un campo VarBinary y generar el fichero con el contenido de ese campo.
    Tambien para poder verlo

    En un Form con 2 Button y 1 TextBox, copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Imports System.IO
    Imports System.Data.SqlClient

    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"

        Private Sub btnCrear_Click(sender As System.Object, e As System.EventArgs) Handles btnCrear.Click
            ' recuperamos el documento de la base de datos y lo pasamos a un fichero
            Dim drDocumentos As SqlDataReader
            Dim aBytDocumento() As Byte = Nothing
            Dim oFileStream As FileStream
            Try
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim lsQuery As String = "Select CAMPO_VARBINARY From TU_TABLA Where ID=@Id"
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@Id", Me.TextBox1.Text))
                        loConexion.Open()
                        drDocumentos = loComando.ExecuteReader(CommandBehavior.SingleRow)
                    End Using
                    If drDocumentos.Read() Then
                        aBytDocumento = CType(drDocumentos("CAMPO_VARBINARY"), Byte())
                    End If
                    drDocumentos.Close()
                    oFileStream = New FileStream("C:\TU_CARPETA\TU_NOMBRE.PDF", FileMode.CreateNew, FileAccess.Write)
                    oFileStream.Write(aBytDocumento, 0, aBytDocumento.Length)
                    oFileStream.Close()
                    MessageBox.Show("Fichero generado con éxito", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Sub btnVer_Click(sender As System.Object, e As System.EventArgs) Handles btnVer.Click
            Dim loPSI As New ProcessStartInfo
            Dim loProceso As New Process
            loPSI.FileName = "C:\TU_CARPETA\TU_NOMBRE.PDF"
            Try
                loProceso = Process.Start(loPSI)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
    End Class

    P.D.
    El campo que extraes, previamente ha sido guardado con un fichero PDF

    Un saludo desde Bilbo
    Carlos

    miércoles, 3 de septiembre de 2014 7:55