Access - Escaner y Objeto OLE

 
Vista:

Escaner y Objeto OLE

Publicado por César Díaz (1 intervención) el 15/12/2006 00:47:48
En estas fechas que tengan una feliz navidad a todos, veran, me dieron un código en acces, bueno baje una aplicación en access que su función es escanear cualquier imagen en el escaner y guardala en una dirección predeterminada, bueno ya se como hacer la función para que escanee, lo que quiero es que me ayuden a que en ver de guardar dicha imagen mejor que la pase a un objeto ole dentro de una tabla en access, a continuación coloco el código para que lo puedan examinar, esta aplicación consta de dos cuadros de textos y un botón de comando, vuelvo a repetir, lo que quiero es que en ver de guardar la imagen un lugar predeterminado, quiero que pase dicha imagen escaneada a un objeto ole. le he dado vuelta al código y siento que me estoy volviendo loco, espero que me puedana ayudar.

Option Compare Database
Option Explicit
Dim CommonDialog1 As Object
Dim img As Object, Imagen As Object 'As Image
Dim IP, IP1 'As New ImageProcess
Dim PrimeraHoja As Boolean, NumeroHojas As Integer
Dim gl_double As Double, gl_cadena As String, gl_codigo As String

Const wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"

Private Sub Comando23_Click()
Call Proceso_Escaner
End Sub

Private Sub Form_Open(Cancel As Integer)
'* ponemos valores a capón para probar, en un proceso las variables globales gl_cadena y gl_codigo contendrán
'* la ruta donde guardamos los archivos y el nombre del archivo a escanear

gl_cadena = CurrentProject.Path & "\"
gl_codigo = "prueba.tif"

Me.RutaDocumentoEscanear = gl_cadena
Me.NombreDocumentoEscanear = gl_codigo

'Call Proceso_Escaner ----------- esto es para lanzarlo automaticamente desde otros procesos

End Sub

Private Sub Proceso_Escaner()

'* creamos el objeto escaner y la imagen contenedora
Set CommonDialog1 = CreateObject("WIA.CommonDialog")
Set Imagen = CreateObject("WIA.imagefile")

'*
On Error GoTo Err_Escanear_Click

EtiquetaProceso:
'* Lo primero nos aseguramos que no exista la imagen
Call Proceso_Borrar_Fichero

'* capturamos imagen
Set img = CommonDialog1.ShowAcquireImage

'* la convertimos a TIF
If img.FormatID <> wiaFormatTIFF Then
Set IP = CreateObject("Wia.ImageProcess")
IP.Filters.Add IP.FilterInfos("Convert").FilterID
IP.Filters(1).Properties("FormatID").Value = wiaFormatTIFF
Set img = IP.Apply(img)
Set IP = Nothing
End If

'* si es la primera hoja la asignamos a la imagen contenedora
If PrimeraHoja = False Then
PrimeraHoja = True
Set Imagen = img
NumeroHojas = 1 'contador hojas, para el control de tamaño
Else
'* si es a partir de la segunda añadimos la hoja escaneada a la anterior
Set IP1 = CreateObject("Wia.ImageProcess")
IP1.Filters.Add IP1.FilterInfos("Frame").FilterID
Set IP1.Filters(IP1.Filters.Count).Properties("ImageFile") = img
IP1.Filters.Add IP1.FilterInfos("Convert").FilterID
IP1.Filters(IP1.Filters.Count).Properties("FormatID") = wiaFormatTIFF
Set Imagen = IP1.Apply(Imagen)
Set IP1 = Nothing

NumeroHojas = NumeroHojas + 1
End If

'* repetimos ???
If MsgBox("¿ Desea escanear más páginas ?", vbQuestion + vbYesNo + vbDefaultButton2, Me.Caption) = vbYes Then
GoTo EtiquetaProceso
End If

'** Salvamos el fichero
Imagen.SaveFile Me.RutaDocumentoEscanear & Me.NombreDocumentoEscanear

'** Comprobamos el tamaño, para evitar los errores de seleccion. Si es menor de 100 Kb pasa, si es mayor preguntamos
gl_double = TamañoArchivo(Me.RutaDocumentoEscanear & Me.NombreDocumentoEscanear)
If gl_double > NumeroHojas * 100 Then
If MsgBox("El archivo tiene " & gl_double & " Kb" & vbCrLf & vbCrLf & "¿ Volvemos a escanear ?", vbQuestion + vbYesNo + vbDefaultButton1, "El chino dice...") = vbYes Then
GoTo EtiquetaProceso
End If
End If

'* anulamos objetos y salimos
Etiqueta_Salir:
Set Imagen = Nothing
Set CommonDialog1 = Nothing
DoCmd.Close acForm, Me.Name
Exit Sub

Err_Escanear_Click:
If Err.Number = 91 Then 'El usuario cancela la acción
Resume Etiqueta_Salir
Else
MsgBox "Error " & Err.Number & ": " & Err.Description
End If

End Sub

Private Sub Proceso_Borrar_Fichero()
'** borramos el archivo (por siaca)
On Error Resume Next
Kill Me.RutaDocumentoEscanear & Me.NombreDocumentoEscanear
On Error GoTo 0
End Sub

Public Function TamañoArchivo(strRuta As String) As Single
Dim fso As Object, Archivo As Object

Set fso = CreateObject("Scripting.FileSystemObject")
'* comprobamos que el archivo exista, si no existe devolvemos 0
If Len(Dir(strRuta)) > 0 Then
Set Archivo = fso.GetFile(strRuta)
'* devolvemos el tamaño en Kb
TamañoArchivo = Round(Archivo.Size / 1024, "0")
Else
TamañoArchivo = 0
End If

Set Archivo = Nothing
Set fso = Nothing

End Function

estare esperando su ayuda gracias. feliz navidad.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Escaneo e inserción de imágenes como objetos OLE en una tabla

Publicado por Alejandro (4142 intervenciones) el 31/07/2023 22:14:53
Para modificar el código y guardar la imagen escaneada como un objeto OLE en lugar de guardarla como un archivo independiente, necesitarás realizar algunos cambios en el código existente. Aquí te presento una versión modificada del código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
Option Compare Database
Option Explicit
Dim CommonDialog1 As Object
Dim img As Object, Imagen As Object 'As Image
Dim IP, IP1 'As New ImageProcess
Dim PrimeraHoja As Boolean, NumeroHojas As Integer
Dim gl_double As Double, gl_cadena As String, gl_codigo As String
 
Const wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
 
Private Sub Comando23_Click()
    Call Proceso_Escanear
End Sub
 
Private Sub Form_Open(Cancel As Integer)
    '* ponemos valores a capón para probar, en un proceso las variables globales gl_cadena y gl_codigo contendrán
    '* la ruta donde guardamos los archivos y el nombre del archivo a escanear
 
    gl_cadena = CurrentProject.Path & "\"
    gl_codigo = "prueba.tif"
 
    Me.RutaDocumentoEscanear = gl_cadena
    Me.NombreDocumentoEscanear = gl_codigo
 
    'Call Proceso_Escaner ----------- esto es para lanzarlo automaticamente desde otros procesos
End Sub
 
Private Sub Proceso_Escaner()
    '* creamos el objeto escaner y la imagen contenedora
    Set CommonDialog1 = CreateObject("WIA.CommonDialog")
    Set Imagen = CreateObject("WIA.imagefile")
 
    '*
    On Error GoTo Err_Escanear_Click
 
EtiquetaProceso:
    '* Lo primero nos aseguramos que no exista la imagen
    Call Proceso_Borrar_Fichero
 
    '* capturamos imagen
    Set img = CommonDialog1.ShowAcquireImage
 
    '* la convertimos a TIF
    If img.FormatID <> wiaFormatTIFF Then
        Set IP = CreateObject("Wia.ImageProcess")
        IP.Filters.Add IP.FilterInfos("Convert").FilterID
        IP.Filters(1).Properties("FormatID").Value = wiaFormatTIFF
        Set img = IP.Apply(img)
        Set IP = Nothing
    End If
 
    '* si es la primera hoja la asignamos a la imagen contenedora
    If PrimeraHoja = False Then
        PrimeraHoja = True
        Set Imagen = img
        NumeroHojas = 1 'contador hojas, para el control de tamaño
    Else
        '* si es a partir de la segunda añadimos la hoja escaneada a la anterior
        Set IP1 = CreateObject("Wia.ImageProcess")
        IP1.Filters.Add IP1.FilterInfos("Frame").FilterID
        Set IP1.Filters(IP1.Filters.Count).Properties("ImageFile") = img
        IP1.Filters.Add IP1.FilterInfos("Convert").FilterID
        IP1.Filters(IP1.Filters.Count).Properties("FormatID") = wiaFormatTIFF
        Set Imagen = IP1.Apply(Imagen)
        Set IP1 = Nothing
 
        NumeroHojas = NumeroHojas + 1
    End If
 
    '* repetimos ???
    If MsgBox("¿ Desea escanear más páginas ?", vbQuestion + vbYesNo + vbDefaultButton2, Me.Caption) = vbYes Then
        GoTo EtiquetaProceso
    End If
 
    '* Convertimos la imagen en un objeto OLE
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("NombreDeTuTabla")
    With rs
        .AddNew
        .Fields("CampoImagenOLE").LoadFromFile Me.RutaDocumentoEscanear & Me.NombreDocumentoEscanear
        .Update
        .Close
    End With
 
    '* anulamos objetos y salimos
    Etiqueta_Salir:
    Set Imagen = Nothing
    Set CommonDialog1 = Nothing
    DoCmd.Close acForm, Me.Name
    Exit Sub
 
    Err_Escanear_Click:
    If Err.Number = 91 Then 'El usuario cancela la acción
        Resume Etiqueta_Salir
    Else
        MsgBox "Error " & Err.Number & ": " & Err.Description
    End If
End Sub
 
Private Sub Proceso_Borrar_Fichero()
    '** borramos el archivo (por siaca)
    On Error Resume Next
    Kill Me.RutaDocumentoEscanear & Me.NombreDocumentoEscanear
    On Error GoTo 0
End Sub
 
Public Function TamañoArchivo(strRuta As String) As Single
    Dim fso As Object, Archivo As Object
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    '* comprobamos que el archivo exista, si no existe devolvemos 0
    If Len(Dir(strRuta)) > 0 Then
        Set Archivo = fso.GetFile(strRuta)
        '* devolvemos el tamaño en Kb
        TamañoArchivo = Round(Archivo.Size / 1024, "0")
    Else
        TamañoArchivo = 0
    End If
 
    Set Archivo = Nothing
    Set fso = Nothing
End Function

En el código modificado, hemos agregado una sección adicional que convierte la imagen escaneada en un objeto OLE y lo guarda en la tabla. Para lograr esto, debes reemplazar "NombreDeTuTabla" con el nombre de la tabla donde deseas guardar el objeto OLE, y "CampoImagenOLE" con el nombre del campo en esa tabla donde deseas almacenar el objeto OLE.

Espero que esta solución te sea útil y te permita guardar las imágenes escaneadas como objetos OLE en tu base de datos de Access. ¡Feliz Navidad!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar