Generar PDF usando RML y TRML2PDF de Python desde PHP

rml php python reportlab rml2pdf

En esta entrada generaremos un archivo PDF desde PHP mediante la implementación libre de Tiny RML2PDF que convierte  Report Markup Language (RML) de ReportLab de Python en PDF. Para ello usaremos trml2pdf. Básicamente tendremos una interfaz web lograda con PHP la cual hará un llamado al terminal (consola) para invocar a trml2pdf para leer la plantilla RML y presentar de vuelta en la interfaz web el PDF generado. Sigue leyendo

Solución a error de decode en combinación Python QT PyQT ReportLab – AttributeError: ‘QString’ object has no attribute ‘decode’

El sistema Komunal que desarrolle en el 2013 usando Python, QT4, PyQT4 y SQLite con el código disponible en GitHub: https://github.com/leninmhs/komunal hoy probándolo no generaba los PDF. Para generar los pdf desde python use ReportLab que es excelente solución para esta tarea. En su momento cuando publique el código en GitHub los pdf se exportaban sin problema, hoy volviendo a levantar ese código fallaba intentando guardar el archivo pdf, el error fue el siguiente:

File “/usr/lib/python2.7/dist-packages/reportlab/lib/utils.py”, line 1395, in makeFileName
s = s.decode(‘utf8’)
AttributeError: ‘QString’ object has no attribute ‘decode’

Sigue leyendo

Describe Table en SQLite + Muestra en Python

sqlite-describe-table-python
Sorprendentemente no hay describe table o show table en sqlite.

La solución es la siguiente consulta:

SELECT * FROM sqlite_master;

SELECT * FROM sqlite_master where type = ‘table’;

SELECT type,name, tbl_name FROM sqlite_master where type = ‘table’;

PRAGMA table_info(familia);

This pragma returns one row for each column in the named table. Columns in the result set include the column name, data type, whether or not the column can be NULL, and the default value for the column.

PRAGMA foreign_key_list(familia);

This pragma returns one row for each foreign key that references a column in the argument table.

http://www.sqlite.org/pragma.html

SELECT seq FROM sqlite_sequence where name = ‘familia’

SELECT seq + 1 FROM sqlite_sequence where name = ‘familia’

Fragmento de muestra en Python:

import sqlite3

db = sqlite3.connect("basededatos.db")
dbconn = db.cursor()
print "Next Value: " + str(dbconn.execute("SELECT seq FROM sqlite_sequence where name = 'familia'").fetchone()[0]+1)
print "Proximo Valor: " + str(dbconn.execute("SELECT seq + 1 FROM sqlite_sequence where name = 'familia'").fetchone()[0])</pre>

lhernandez@DskLhernandez:~$ python sqlite.py
Next Value: 64
Proximo Valor: 64

http://www.sqlite.org/sqlite.html

http://sqlite.org/lang_corefunc.html

Poblando SQLite con valores aleatorios en Python

programación lenguaje identacion python sqlite

Siguiendo esta entrada seremos capaces de poblar una tabla creada en SQLite, cuyos valores (usuario, nombre, apellido, password, cédula, fecha nacimiento, sexo, etc…) de cada campo serán generados de forma aleatoria, es decir seleccionando un valor de un arreglo o un rango determinado. El encargado de hacer todo esto será un sencillo script en python que recibe como argumento la cantidad de inserciones que le queremos realizar a la base de datos, lal cual creará el script en caso de que no exista. Este código fue escrito originalmente para probar las capacidades de carga y volumen de SQLite, fue adaptado a esta entrada con fines didácticos.

Por lo tanto esta sencilla práctica nos servirá básicamente entre otras cosas para:

  • Aprender a usar SQLite con Python (conexión, crear tabla y hacer insert).
  • Aprender a generar o seleccionar valores aleatorios con Python.
  • Aprender a pasar y recibir argumentos en un script Python.
  • Otros tips sobre Python.

 

Código Fuente


#!/usr/bin/python
# -*- coding: utf-8 -*-
# como usar: $time python test-sqlite.py 1000
import sys, datetime, sqlite3, hashlib
from random import *

db = sqlite3.connect("populate.sqlite")
dbconn = db.cursor()

crear_tabla = "CREATE TABLE IF NOT EXISTS usuarios( id_usuario INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, usuario varchar NOT NULL,"
crear_tabla = crear_tabla + "passwd VARCHAR NOT NULL, nombre VARCHAR NOT NULL, apellido VARCHAR NOT NULL, cedula VARCHAR NOT NULL,"
crear_tabla = crear_tabla + " fecha_nacimiento DATETIME NOT NULL, sexo char NOT NULL, perfil VARCHAR NOT NULL)"
str(dbconn.execute(crear_tabla))

list_nombre = ['Lenin','Ramiro','Alan','Rey','Elicer','Ana','Hugo','Ramon','Radames',
'Rosa','Dayana','Maria','Josefina','Pedro','Juan','Jose','Andres','Andrea']
list_apellido = ['Hernandez','Avalo','Rondon','Lima','Ponce','Gonzalez','Sifontes',
'Bello','Cardozo','Bermudez','Barreto','Fernandez','Delgado','Rodriguez']

if len(sys.argv) >= 2:
print "A continuacion se ingresaran ",sys.argv[1]," registros.";
else:
print "Este programa necesita el parametro de cantidad de registros a ingresar. Abortando Operacion.";
exit()

for i in range(int(sys.argv[1])):

fecha_nacimiento = datetime.datetime.today() - datetime.timedelta(days = randrange(1500, 25000))
nombre = choice(list_nombre)
apellido = choice(list_apellido)
cedula = str(randint(4000000, 21000000) )

sql = "INSERT INTO usuarios ('usuario','passwd','nombre', 'apellido', 'cedula', 'fecha_nacimiento', 'sexo', 'perfil') VALUES( "
sql = sql + "'" + nombre[0].lower() + apellido.lower() + "'"
sql = sql + ",'" + hashlib.md5(cedula).hexdigest() + "'"
sql = sql + ",'" + nombre +"','" + apellido + "'"
sql = sql + ",'" + cedula +  "'"
sql = sql + ",'" + fecha_nacimiento.strftime('%Y-%m-%d') + "'"
sql = sql + ",'" + choice(['M','F']) + "'"
sql = sql + ",'" + choice(['ADMIN','ANALISTA','CONSULTA']) + "')"

try:
dbconn.execute(str(sql))
print "Se ingreso correctamentente el registro Nº " + str(i+1) + ": " + nombre + " " + apellido
except:
print sql + "\n Ocurrio un error", "Guardando los datos del usuario."
exit()

db.commit()

Sigue leyendo

Explicación somera de Tweets de Tecnología

Es muy común para los que usamos twitter pensar:

¿Los tweets enviados simplemente pasan a la historia?

¿Quién los leerá pasado un tiempo? y ¿Como harán para llegar a ellos?

¿Alguien podrá encontrar esos 140 caracteres transcendentales que enviamos en algún momento?

A la fecha de este artículo mi cuenta @leninmhs tiene solo 650 tweets enviados (140*650 = cerca de 91.000 caracteres aproximadamente), siquiera yo puedo encontrar alguno que me interese como referencia de un tema técnico,  para dárselos a un conocido, o para volverlo a transitar. La propuesta que traigo es sencilla, seleccioné los tweets orientados a tecnologías libres (privativas solo para criticarlas) sobre los que he escrito, de esta forma pueden encontrarlos a partir de un punto de referencia o de partida, buscando fácilmente desde San Google.

01-08-12 Cuando tengan que limpiar #html usen #Perl así: s/<(?:[^>'”]*|([‘”]).*?\1)*> faltaría limpiar &nbsp; cc @NelsonFx @iamemhn
Una expresión regular que quita o limpia etiquetas HTML de la cadena o bloque de texto que nos interesa, adicional se elimino el muy usado aun &nbsp; mediante otra expresión de sustitución. Muy útil y importante tener a la mano el siguiente código:
#!/usr/bin/perl -w

my $html = '
<html dir="ltr" lang="es">
<head><meta charset="UTF-8" /></head>
<body style="font-family: small-caps;">
<br/><b> HTML A TEXTO  / HTML TO TEXT   </b><br/>
<br/><b> limpiar cadena de texto de html  / clean html text string  </b><br/>
<br/><div style="border-radius:5px;box-shadow:2px #DFDFDF;"><b> quitar etiquetas html / remove html tags </b></div><br/>
<img src="img/perl-regex-html.jpg" /><br/>
<br/><div><b><font color="red">&nbsp;Lenin Hernandez&nbsp;</font></b></div>
<etiquetafalsa><b>Twitter: @leninmhs </b></etiquetafalsa><br/>
<b>Lenguaje de Programación: &nbsp;&nbsp;</b>Perl<br/>
<b>Sistema Operativo:&nbsp;&nbsp;&nbsp;</b> todos en los que se interprete Perl.
</body>
</html>';
$html=~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gs; #regex que limpia el html
$html=~ s/&nbsp;//g; #regex que limpia el &nbsp;
print $html;
Listado de Entornos de Desarrollo (IDE) para programar en Python, en lo particular he usado y me gusta Komodo Edit. Muy ligero y practico comparado con NetBeans ó Eclipse (escritos ambos en Java de ahí el consumo exagerado de recursos…)
Conocemos manejadores de contenidos muchos en PHP, en Perl hay, en Python también hay, pero en Python y haciendo uso del Framework de Desarrollo por excelencia en Python Django es como mucho pedir para los que lo usan, pero si los hay.
16-06-12 @diadebian mi opción es la “D” me toca hoy terminar unos pdfs usando #Reportlab de #Python
La librería ReportLab es excelente para generar PDF en el lenguaje Python. Si usan alguna distro basada en Debian pueden comenzar a usarla con:
#aptitude install python-reportlab
Después de tenerla instalada, a programar en python y leer la documentación de reportlab. El pdf que programe hacia mucho uso de tablas, se inserto imagen y algún otro detalle. Quedo así:
reportlab-python-table-sqlite

reportlab-python-table-sqlite