martes, 15 de noviembre de 2016

ASP Clásico: QR en PNG convertirlo en JPG

Obtener la imagen del QR de una url y convertirla de PNG a JPG

En asp clásico para obtener la imagen del QR de una url he hecho lo siguiente:

dim enlace : enlace = "http://vegamatrica.blogspot.com.es/"
'URL de creación del QR
dim url : url = "https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl="&enlace&"&choe=UTF-8"


Indicar que a pesar de que la API de Google Charts está obsoleta, pensaba utilizarla. 
Ver: https://developers.google.com/chart/image/docs/making_charts

'DONDE:
'chs->tamaño del código QR (longitud x altura)
'cht->con su valor de argumento "qr" indica que el API Google Charts debe generar un código QR.
'chl->contiene la URL a la que se generará el QR.
'choe->(opcional) indica la codificación del código QR, por defecto UTF-8.


'ruta donde guardo la imagen del QR.
dim rutaGuardarQR : rutaGuardarQR = "C:\proyectos"

'Nombre de la imagen del QR que se guarda como PNG
dim nombreImagenQR : nombreImagenQR = "imagenQR.png"

call saveImageFromUrl(url, rutaGuardarQR, nombreImagenQR)

'La función saveImageFromUrl permite guardar la imagen del QR en la carpeta correspondiente. Convirtiendo la imagen de PNG a JPG


function saveImageFromUrl(strFileURL, imageLocation, image)

    server.scripttimeout = 60 * 20


    ' Fetch the file
    Dim objXMLHTTP : Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
    objXMLHTTP.open "GET", strFileURL, false
    objXMLHTTP.send()

    If objXMLHTTP.Status = 200 Then
        Dim objADOStream :  Set objADOStream = CreateObject("ADODB.Stream")
        objADOStream.Open
        objADOStream.Type = 1 'adTypeBinary
        objADOStream.Write objXMLHTTP.ResponseBody
        objADOStream.Position = 0 'Set the stream position to the start
   
   
        Dim objFSO : Set objFSO = Createobject("Scripting.FileSystemObject")
        If objFSO.Fileexists(imageLocation) Then objFSO.DeleteFile imageLocation
   
            Set objFSO = Nothing
            objADOStream.SaveToFile imageLocation & "/" & image
            objADOStream.Close
            Set objADOStream = Nothing


            'Convertir la imagen del QR PNG en JPG
            dim imageMagick: Set imageMagick = CreateObject("ImageMagickObject.MagickImage.1")
            dim imageConverted
            imageConverted = imageMagick.Convert(imageLocation & "/" image, imageLocation & "/" & "imagenQR.jpg")

        End if
    Set objXMLHTTP = Nothing
end function   


Al ejecutar la función "saveImageFromUrl" lanzó el siguiente error:

"El componente ActiveX no puede crear el objeto: 'ImageMagickObject.MagickImage.1'" a pesar de haberlo registrado con el siguiente comando:

 regsvr32 "C:\Archivos de programa\ImageMagick-6.2.3-Q8\ImageMagickObject.dll"

*Lo que se puede ver en la siguiente imagen de regsvr32.exe



Como necesito convertir la imagen del QR de PNG en JPG, y después de dedicarle un día en intentar solucionar ese problema y sin obtener soluciones, he decidido hacer la función en php y llamar a ese php desde el asp.

Para hacer la función en php utilicé el código de "PHP QR Code" http://phpqrcode.sourceforge.net por su facilidad de uso.

  1. Me descargué la biblioteca "phpqrcode"
  2.  En mi PHP:
include('../phpqrcode/qrlib.php');

$url = "http://vegamatrica.blogspot.com.es/"
$filePath = "C:\proyectos"

QRcode::png($url, $filePath); //$filePath ruta donde guardaré la imagen del QR en formato


if (!file_exists($filePath."\imagenQR.png")) {      
    QRcode::png($urlCompletaTurispain, $pngAbsoluteFilePath);
    $image = imagecreatefrompng($filePath."\imagenQR.png");
    imagejpeg($image, $filePath."\imagenQR.jpg", 70); 


     //convertimos la imagen png a jpg con calidad 70%   
    imagedestroy($image);

 
    //Borramos la imagen png       
    unlink($pngAbsoluteFilePath);
        

}else{
    echo "La ruta no existe";
}   

Y finalmente pude utilizarla en el ASP.




jueves, 10 de noviembre de 2016

ASP Clásico: Descarga y eliminación de fichero y Redirección de url



En ASP Clásico para descargar un fichero, por ejemplo PDF, y luego eliminarlo, encontré este código en Internet:

  • downloadFile es una función que permite descargar el fichero, pasándole como parámetros la ruta del fichero  y el nombre del fichero. Ejemplo: strPathAndFile= "C:\ficheros /nombreFichero.pdf" y strFileName= "nombreFichero.pdf"  

function downloadFile(strPathAndFile, strFileName)
  Dim objFso
  Dim objStream
  If strPathAndFile <> "" Then
    Set objFso = Server.CreateObject("Scripting.FileSystemObject")
    If objFso.FileExists(strPathAndFile) Then
     Response.AddHeader "Content-disposition", "filename=" & strFileName
      Response.ContentType = "application/octet-stream"
      Response.AddHeader "Pragma", "no-cache"
      Response.AddHeader "Expires", "0"
      Set objStream = Server.CreateObject("ADODB.Stream")
      objStream.Type = 1
      objStream.Open
      objStream.LoadFromFile strPathAndFile
      Response.BinaryWrite(objStream.Read())
      objStream.Close
      Set objStream = Nothing
    Else
      Response.Write "La ruta del fichero no existe."
    End If
    Set objFso = Nothing
  End If
End Function

  • Y para eliminar el fichero, esta función deleteFileFromServer donde fileRoute= "C:\ficheros /nombreFichero.pdf" (por ejemplo).

function deleteFileFromServer (fileRoute)
    Dim objFSO : Set objFSO = Createobject("Scripting.FileSystemObject")
    If objFSO.Fileexists(fileRoute) Then
       objFSO.DeleteFile fileRoute
       Set objFSO = Nothing
    else      
        response.write "No existe el fichero en la ruta especificada."
    end if
end function    

Ahora bien, en mi fichero asp llamé a las funciones de 

call downloadFile(rutaArchivo, nombreArchivo)
call deleteFileFromServer(rutaArchivo)

Y luego ponía una tercera línea response.end()y funcionaba perfectamente, sin embargo, al quitar el response.end()y redireccionar a la página:
response.redirect("miPagina.asp?accion=ok”) la descarga y eliminación dejaban de funcionar.

Si te ha pasado esto alguna vez, te cuento cómo lo solucioné:

Me cree un nuevo fichero .asp que contenía la descarga y eliminación del fichero y desde Jquery llamé a ese fichero utilizando
                                              
window.open(‘descargaEliminaFichero.asp’);

Y a continuación puse la redirección a mi página:

window.location.href = ‘miPagina.asp?accion=ok’;
               
Y listo, ya tenemos la descarga del fichero (en mi caso PDF), eliminación y  redirección.