Linux – Comandos básicos de administración del sistema (II)

Seguimos con el post iniciado el jueves pasado sobre administración básica de sistemas Linux. En esta ocasión trataremos el tema de la gestión de usuarios y permisos en Linux.

Gestión de usuarios y grupos de usuario

Añadir nuevo grupo de usuarios: addgroup

Añadir nuevo usuario: adduser

Con adduser añadimos usuarios. Podemos especificar un grupo si queremos crear y añadir el usuario directamente a un grupo existente:

Eliminar usuarios: deluser

Si además del usuario a eliminar añadimos el modificador -remove-home , nos cargaremos también la carpeta de dicho usuario:

Eliminar grupo de usuarios: delgroup

Cambiar contraseñas de usuarios: passwd

Si no especificamos el usuario, cambiará la contraseña del usuario actual:

Cambiar de usuario activo: su

Si no especificamos nombre de usuario, su cambiará al usuario root. Lógicamente, se nos pedirá la contraseña del usuario al que queremos cambiar:

Comandos útiles para obtener información sobre los usuarios del sistema

  1. Con users vemos los usuarios conectados en este momento.
  2. groups nos muestra los grupos a los que pertenece el usuario actual.
  3. Dentro del directorio /home hay una carpeta por cada usuario creado. OJO: Si se hubiera eliminado algún usuario SIN haber usado el modificador -remove-home , la carpeta seguiría existiendo.
  4. El archivo /etc/group contiene una lista de usuarios por cada grupo.
  5. El archivo /etc/passwd contiene los usuarios del sistema y sus contraseñas… encriptados 😉

Gestión de permisos

  1. Muestra los permisos actuales de ficheros y directorios.
  2. Cambiamos los permisos del fichero fich1 en modo octal.
  3. Cambiamos los permisos del fichero fich1 en modo carácter.
  4. Cambiamos el usuario y el grupo propietarios del fichero fich1.
  5. Cambiamos el grupo al que pertenece el fichero fich1.

Permisos en modo octal

Se basa en asignar 0 (denegado) o 1 (concedido) a cada uno de los siguientes permisos, en este orden: R (lectura), W (escritura) y X (ejecución). Estos 3 dígitos se deberán repetir para el propietario del fichero, para el grupo y para el resto de usuarios. Así pues, obtenemos las siguientes combinaciones:
Permisos en modo Octal

Ejemplos:

Los dígitos corresponden a: PROPIETARIO del fichero, GRUPO y RESTO de usuarios. Por tanto:

    • PROPIETARIO: 6 => 110 => (RWX) R:1 W:1 X:0 => El propietario puede leer (R) y escribir (W), pero no ejecutar (X) el fichero.
    • GRUPO: 3 => 011 => (RWX) => R:0 W:1 X:1 => El grupo no puede leer (R), pero puede escribir (W) y ejecutar (X) el fichero.
    • RESTO DE USUARIOS: 5 => 101 => (RWX) R:1 W:0 X:1 => El resto de usuarios pueden leer (R), no pueden escribir (W) y pueden ejecutar (X) el fichero.
    • PROPIETARIO: 7 => 111 => (RWX) R:1 W:1 X:1 => El propietario puede leer (R), escribir (W), y ejecutar (X) el fichero. Es decir, acceso total.
    • GRUPO: 6 => 110 => (RWX) => R:1 W:1 X:0 => El grupo puede leer (R) y escribir (W), pero no ejecutar (X) el fichero.
    • RESTO DE USUARIOS: 6 => 110 => (RWX) => R:1 W:1 X:0 => El resto de usuarios pueden leer (R) y escribir (W), pero no ejecutar (X) el fichero.
    • PROPIETARIO: 7 => 111 => (RWX) R:1 W:1 X:1 => El propietario puede leer (R), escribir (W), y ejecutar (X) el fichero. Es decir, acceso total.
    • GRUPO: 7 => 111 => (RWX) R:1 W:1 X:1 => El grupo puede leer (R), escribir (W), y ejecutar (X) el fichero. Es decir, también cuenta con acceso total.
    • RESTO DE USUARIOS: 0 => 000 => (RWX) => R:0 W:0 X:0 => El resto de usuarios no pueden leer (R), ni escribir (W) ni ejecutar (X) el fichero. Es decir acceso denegado completamente al fichero.

Permisos en modo carácter

En este modo el comando chmod recibe los siguientes modificadores, en este orden:

  1. Primero especificamos a quién queremos dar o eliminar el permiso:
    • u (user): usuario propietario del fichero.
    • g (group): grupo.
    • o (others): resto de usuarios.
    • a (all): para todos. Equivale a usar “ugo”.
  2. A continuación especificamos si queremos dar o retirar permisos:
    • + : Concedemos permiso.
    • – : Denegamos permiso.
    • = : Asignamos permiso sobreescribiendo al permiso existente en este momento.
  3. Por último indicamos qué tipo de permiso queremos dar o retirar:
    • r (read): Permiso de lectura.
    • w (write): Permiso de escritura.
    • x (ejecución): Permiso de ejecución.:

Por ejemplo, si queremos obtener los mismos permisos que en el apartado anterior pero en modo caracter, los comandos a emplear serían:

  1. El propietario puede leer y escribir, pero no ejecutar; el grupo no puede leer, pero puede escribir y ejecutar; el resto pueden leer y ejecutar, pero no escribir.
  2. El propietario puede leer, escribir y ejecutar; el grupo puede leer y escribir, pero no ejecutar; el resto pueden leer y escribir, pero no ejecutar.
  3. El propietario puede leer, escribir y ejecutar; el grupo puede leer, escribir y ejecutar; el resto no pueden ni leer, ni escribir ni ejecutar.

MySQL – Comandos básicos de SQL

Antes de conectar a una base de datos desde código es conveniente conocer algunos comandos básicos de SQL. En este post comentaré los más comunes, trabajando en MySQL Workbench sobre la base de datos dbjuegos que creamos en el post del pasado 19 de agosto. Así que ve abriendo dicha base de datos y pongámonos manos a la obra.

En Workbench, las sentencias se escriben en la ventana principal y se ejecutan haciendo click en el icono del rayo.

Desactivar modo seguro

Por defecto mysql viene con este parámetro activado para evitar pérdidas de datos. Sin embargo, a nosotros como administradores de la base de datos nos va a molestar más que otra cosa, ya que nos impedirá vaciar tablas, por ejemplo. Así que recomiendo ejecutar el siguiente comando:

Bases de datos

Mostrar las bases de datos

Cambiar de base de datos

Crear base de datos

Como ves, he incluido la cláusula IF EXISTS, que nos permite comprobar si existe la base de datos antes de ejecutar el comando DROP DATABASE.

Tablas

Crear tablas

La semana pasada vimos cómo crear tablas de forma visual. Ahora vamos a crear otra tabla llamada tbldistribuidoras usando exclusivamente el lenguaje SQL.
Nuestra nueva tabla tendrá un campo llamado “id_dist” (entero DE 4 dígitos y autoincremental; primary key) y otro llamado “nombre” (varchar de 45 caracteres).

Cambia a la base de datos dbjuegos (con USE dbjuegos; ) y escribe la sentencia siguiente para crear la nueva tabla:

Eliminar tablas

Rellenar tablas con datos

Introducimos los datos con el comando INSERT INTO . Deben estar en el orden en que tenemos los campos. Es decir, en nuestro caso, primero el id y luego el nombre. Como en este caso el id es autoincremental, lo podemos omitir:

Si queremos forzar el id hubiésemos introducido:

Por favor ten en cuenta que los valores del campo id_dist NO van entrecomillados porque son de tipo entero (INT), mientras que los del campo nombre sí, porque son cadenas (VARCHAR).

Mostrar todos los registros de una tabla

Vaciar datos de tablas

Con el comando DELETE podemos eliminar datos de una tabla (no la tabla en sí):

Los comandos anteriores son los mínimos indispensables para trabajar con mysql. En sucesivas entradas explicaré cómo refinar nuestras consultas, pero con esto ya tenemos suficiente hacer una conexión medio decente a nuestra base de datos.

Java Snippet – Pedir confirmación antes de salir en cuadro de diálogo

Ya sabemos que para salir de una aplicación Java podemos usar:

Pero puede que no sepas que con muy poquito código más puedes ofrecer al usuario una salida del programa mucho más elegante, mostrándole un simple cuadro de diálogo en el que él pueda decidir si efectivamente desea terminar la ejecución de nuestra aplicación o si por el contrario se lo ha pensado mejor y prefiere seguir trabajando en ella.

El código a utilizar sería el siguiente:

Mostrar cuadro de diálogo pidiendo confirmación (Aceptar – Cancelar)

Como te habrás percatado ya, hacemos uso de un JOptionPane, así que deberás importarlo (si usas un IDE como Eclipse o IntelliJIdea lo habrán hecho por ti):

La próxima semana, más 🙂

Linux – Comandos básicos de administración del sistema (I)

Inicio con este post una serie en la que trataré los comandos básicos de administración de un sistema Linux. En concreto, hoy voy a decirte cómo trabajar con directorios y ficheros. En la próxima entrega de la serie veremos cómo gestionar usuarios y permisos. Esta introducción nos servirá mucho para empezar a desarrollar scripts en bash, más adelante. Vamos a ello.

Comandos para trabajar con directorios

Crear directorios: mkdir

El comando mkdir nos permite crear directorios. Podemos crear varios directorios al mismo tiempo:

Cambiar a directorio: cd

Para cambiar a un directorio usamos el comando cd , especificando a continuación la ruta a la que queremos desplazarnos:

Para cambiar de forma rápida al directorio home del usuario actual podemos usar la tilde (AltGr + 4):

Eliminar directorios vacíos: rmdir

Para eliminar un directorio vacío se usa el comando rmdir . Al igual que antes, podemos eliminar varios a la vez, y además podemos usar comodines:

Comandos para trabajar con ficheros

Crear ficheros: touch

Existen varias formas de crear un fichero. Por ejemplo, puedes usar un editor de textos y guardarlo. Otra manera es usando el comando touch . touch nos permite cambiar la fecha en que ha sido modificado un fichero, pero si el fichero que le indicamos no existe, lo creará. Con touch también podemos crear múltiples ficheros a la vez:

Eliminar ficheros (y directorios NO vacíos): rm

rm elimina ficheros. Admite que le especifiquemos varios ficheros a la vez y el uso de comodines. Además, si usamos el modificador -r permite el borrado recursivo (incluyendo directorios, aunque no estén vacíos):

Copiar ficheros: cp

El comando para copiar ficheros es cp . Recibe como primer parámetro la ruta del fichero origen y como segundo la ruta destino. También admite el uso de comodines y puede copiar de forma recursiva con el modificador -r :

Mover y renombrar ficheros: mv

mv funciona de manera similar a cp, pero en lugar de copiar los archivos los mueve a un nuevo directorio. También lo podemos usar para renombrar archivos:

Comprimir y extraer ficheros: tar

El comando tar nos permite empaquetar (con compresión o sin ella) varios archivos en un único fichero, y extraer su contenido:

1: crea un paquete de archivos comprimiendo con ZIP
2: crea un paquete de archivos comprimiendo con BZIP2
3: extrae los contenidos de un paquete comprimido en ZIP

MySQL – Uso de Workbench

Continuando con la serie de posts iniciados el pasado 12 de agosto, ahora es turno de aprender a manejar, al menos de forma básica, MySQL Workbench. Para ello, vamos a crear nuestra propia base de datos e introduciremos algunos datos. Además, en siguientes posts aprenderemos cómo acceder a dichos datos desde código (bien sea en Java o Visual Basic).

Iniciar MySQL Server

Antes de iniciar MySQL Workbench tenemos que asegurarnos de que tenemos el servicio MySQL en ejecución. Esto se puede comprobar con un simple vistazo al icono de MySQL Notifier.

Si como yo hice, elegiste que Notifier NO se iniciara en el arranque de Windows, ahora tendrás que buscarlo y ejecutarlo:

Cuando aparezca el icono en la bandeja del sistema podremos ver el estado de MySQL Server:

Necesitamos que se encuentre en ejecución. Si no es tu caso, simplemente haz clic con el botón derecho sobre el icono, elige la opción “MySQL (…) – Stopped“, y luego “Start“:

Nos saldrá un mensaje advirtiéndonos de que el servicio a pasado a estar activo.

Inicio e interfaz de Workbench

Cuando ya está MySQL Server en ejecución podremos ejecutar Workbench. Por defecto nos va a salir la conexión a nuestra máquina local (localhost) usando el puerto 3306:

Haremos clic sobre esta conexión y nos pedirá el password que definimos cuando instalamos Workbench. Introducimos la contraseña y aceptamos, con lo cuál nos aparecerá la pantalla principal de Workbench, que se divide en 4 grandes bloques:

  • Parte superior: Menús de comandos y barra de iconos.
  • Parte izquierda: “Navegador”, donde elegiremos sobre qué parte de la base de datos queremos trabajar (servidor, usuarios, tablas, etc…).
  • Parte central: “Consultas”, donde escribiremos las sentencias SQL que deseamos ejecutar.
  • Parte inferior: “Salida”, donde se mostrarán los resultados tras ejecutar las sentencias SQL.

Crear una nueva base de datos

Aviso: todo lo que voy a contar a partir de este punto se puede realizar empleando el lenguaje SQL. De hecho, yo lo prefiero. Sin embargo, me gustaría dedicar un par de posts exclusivamente a este lenguaje, y por ello ahora me limitaré a emplear la manera visual.

    • Hacemos clic derecho sobre una (cualquiera) de las bases de datos que aparecen en la sección “SCHEMAS“, y elegimos la opción “Create schema“:
    • Name: a nuestra base de datos la vamos a llamar “dbjuegos“, y pulsamos “Apply“. Nos aparecerá el código SQL correspondiente. Volvemos a pulsar “Apply” y luego “Finish”.
    • Comprobamos que efectivamente se ha creado la nueva base de datos, que debería aparecer dentro de la sección “SCHEMAS“:

Crear una tabla

      1. Seleccionamos la base de datos “dbjuegos” haciendo doble click sobre su nombre, en la sección “SCHEMAS“. Veremos que se pone en negrita para indicar que ahora estamos trabajando sobre ella. Además, se expandirá su contenido.
      2. Dentro de “dbjuegos” hacemos clic derecho sobre “Tables” y elegimos la opción “Create Table“.
      3. Definimos el nombre de la tabla en “Table Name“. Yo la he llamado tbljuegos. En “Collation” y “Engine” dejamos las opciones que vienen por defecto.
      4. Ahora definimos los campos (o columnas) que tendrá la tabla. Simplemente haremos doble clic sobre la celda justo debajo de “Column Name” y nos permitirá editar su contenido. Con Tabulador o con el ratón podemos desplazarnos para elegir el tipo de dato (Datatype) o el resto de opciones, cuya explicación dejo para más adelante. De momento, nos basta con definir los siguientes campos:

      5. Cuando tengamos los campos definidos pulsamos en “Apply“, “Apply” de nuevo, y “Finish“. Si nos fijamos, a la izquierda y colgando de “Tables” ya tenemos nuestra nueva tabla “tbljuegos“.

Introducir datos en la tabla

      1. Clic derecho sobre “tbljuegos” en la sección “SCHEMAS” y elegimos la opción “Select Rows – Limit 1000“. Esta instrucción nos muestra los 1000 primeros registros (o filas) de la base de datos.
      2. En la parte principal de la pantalla aparecerán hasta los 1000 primeros registros que tengamos introducidos hasta ahora (es decir, cero xD) en forma de tabla. Haciendo doble clic sobre una celda podremos editar su contenido.
        OJO: El campo “id” lo había definido como “AI” (Autoincrementable), así que mejor no introduzcas NADA manualmente en él (en realidad sí puedes introducir un número entero como ID, pero te recomiendo que no lo hagas para evitar potenciales problemillas 😉 ).
      3. Desplazándonos con Tabulador o haciendo doble click con el ratón terminamos de rellenar nuestra tabla tbljuegos. A mí me ha quedado así:
      4. Apply“, de nuevo “Apply” y “Finish” para finalizar.

Y ya tenemos nuestra primera base de datos MySQL, con una sencilla tabla y unos cuantos registros. Todo ello creado de forma visual en Workbench. Mientras esperas al próximo post sobre MySQL te recomiendo que vayas haciendo pruebas sobre esta table y base de datos. Puedes aprender mucho simplemente haciendo clic derecho sobre los diferentes elementos que te aparecen en pantalla.

Eso es todo por hoy. Espero que te esté resultando interesante. Ya sabes que espero tu feedback como agua de mayo 😀

Java Snippet – Comprobar los tipos de datos

A veces resulta necesario comprobar los tipos de datos para evitar errores. De hecho, durante mis estudios desarrollé estas pequeñas funciones para comprobarlo de forma sencilla y rápida. Estas funciones reciben siempre un dato tipo string, intentan convertirlo al tipo de dato que nos interesa comprobar, y devuelven verdadero o falso según sea el caso.

Comprobar si es un entero

Comprobar si es un flotante

Uso de las funciones

Evidentemente, siguiendo este esquema puedes crear las funciones necesarias para cualquier otro tipo de dato.

Java Snippet – Menús en consola con switch/case

Con la estructura switch/case podemos indicar a nuestro programa que realice diferentes acciones en función del valor que tome una variable dada. Lo veremos mucho más claro con el siguiente ejemplo.

Qué hará nuestra aplicación

Esta aplicación está basada en un ejercicio que hicimos en primer curso. Simula las operaciones que se pueden realizar en un banco, como abrir o eliminar una cuenta, ingresar o reintegrar dinero, etc… Aunque para clase utilicé una interfaz gráfica en Swing, en este caso me interesa presentarlo todo por consola, para mostrar claramente el funcionamiento del menú usando switch/case. Además, he empleado ArrayLists e Iteradores, de los que ya hablé anteriormente..

Cuando se ejecute la aplicación, el menú será el siguiente:


He estructurado el programa en 2 clases:

  • Cuenta: Esta clase contiene los atributos (titular, id, saldo) y métodos (setters y getters) de una cuenta bancaria.
  • Banco: Esta clase muestra el menú de opciones y ejecuta las acciones.

Para no hacer el post demasiado extenso no voy a incluir el código completo, sino que he preferido colgarlo en mi cuenta de github. Puedes dirigirte a este enlace o clonar el repositorio directamente con el comando:

Objetos necesarios

En la clase Banco he creado los siguientes objetos, a los que voy a acceder desde diferentes puntos del programa:

La función mostrarMenu()

Esta función simplemente muestra por pantalla cada una de las opciones del menú. El usuario introducirá un string que luego pasaremos como parámetro al llamar a la función ejecutarAccion(). En lugar de un string puedes forzar a que el usuario introduzca un entero, por ejemplo, pero un string te da más versatilidad. En este caso, por ejemplo, para salir del programa espero a que el usuario introduzca una “X“.

Como ves, el valor que introduce el usuario lo guardo en el string “opcion” usando el método .next() del objeto Scanner (sc) creado justo al principio del programa. Como veremos después, el objeto sc lo cerraremos cuando el usuario elija la opción “X. Salir“.

La función ejecutarAccion(String accion)

Esta función recibe como parámetro la opción introducida por el usuario anteriormente. Lo primero que hago es convertir esta cadena a mayúsculas (si introduce cualquier otro caracter no se produce ningún error). A continuación, usando la cláusula switch/case especifico qué debe ejecutarse en cada caso.

La sintaxis de esta cláusula es la siguiente:

Creo que queda bastante claro. Dependiendo del valor que tome la variable “opcion” se ejecutará la acción correspondiente a ese valor. Si “opcion” toma un valor no contemplado, se ejecutarán las acciones dentro del bloque “default“. El comando “break” interrumpe la ejecución del bloque switch.

Como ves en mi código, dentro de cada opción llamo a la función correspondiente, y después vuelvo a mostrar el menú. Excepto cuando el usuario decide salir introduciendo una “X“, en cuyo caso cierro el objeto sc antes de salir.

MySQL Windows – Instalar Mysql, MySQL Connector J y MySQL Workbench

Una de las cosas que más temprano que tarde vas a tener que abordar como desarrollador, aunque seas principiante, es el tratamiento de bases de datos. Uno de los motores de gestión de bases de datos más utilizados hoy en día es MySQL, que además es totalmente gratuito y de código abierto.

El propósito de este post es proveerte con las instrucciones necesarias para instalar los siguientes componentes básicos de MySQL en Windows:

  1. MySQL Server: el servidor de bases de datos.
  2. MySQL Workbench: Interfaz gráfica para gestionar las bases de datos MySQL.
  3. MySQL Notifier: Icono que se instala en la bandeja del sistema que nos indica en qué estado se encuentra el servidor MySQL.
  4. MySQL Connector J: Controlador que nos permitirá acceder a MySQL desde código Java.

Aunque se pueden descargar e instalar todos los componentes por separado desde la página oficial de MySQL, resulta mucho más cómodo hacer uso del Instalador MySQL.

Instalar MySQL para Windows

Deberemos descargar el MySQL Installer desde ESTE ENLACE. Como plataforma elegiremos “Microsoft Windows” y veremos que hay 2 opciones de descarga: el instalador web que ocupa unos 2 megas, o el instalador completo, de unos 250 megas aproximadamente. Aunque resulta indiferente qué versión elijas, yo voy a usar el instalador web.

Pinchamos en el botón “Download” y nos aparecerá otra página, en la que NO HACE FALTA REGISTRARSE. Si te fijas, justo debajo de los botones Login y Sign Up existe la opción “No thanks, just start my download”. Pinchamos aquí y guardamos el archivo donde nos interese. Una vez descargado lo ejecutamos y seguimos el proceso de instalación paso a paso. Por favor, ten en cuenta que dependiendo de la versión o de si ya tienes productos MySQL instalados, los pasos siguientes pueden no ser exactamente los mismos:

  1. Como no tengo nada instalado aún, elijo la opción “Add/Modify Products and Features“. Aceptamos los termínos y “Next”.
  2. En la siguiente pantalla elegimos qué aplicaciones, controladores y documentación deseamos instalar. Marcaremos las siguientes opciones:
    • MySQL Server [Versión]
    • Desplegamos “Applications” y marcamos “MySQL Workbench CE [Versión]” y “MySQL Notifier [Versión]“.
    • Desplegamos “MySQL Connectors” y marcamos “Connector/J [Versión]

    Debería verse algo así:

    Seguidamente pinchamos en “Next“.

  3. A continuación se comprueba que tengamos instalados todos los requisitos previos (librerías de ejecución .Net Framework y Visual C++ 2010 en mi caso). “Next“.
  4. En la siguiente pantalla se nos detallan qué productos van a ser descargados. Pulsaremos en “Execute” para proceder. Esperamos a que se completen las descargas y pulsamos en “Next“.
  5. Volvemos a pulsar “Next” y dará comienzo la configuración del servidor MySQL.
  6. En la pantalla “MySQL Server Configuration“, las opciones que vienen por defecto són válidas. Así que únicamente nos limitaremos a pulsar “Next” para proceder:
  7. En la siguiente pantalla introduciremos la contraseña para el usuario root y, si lo deseamos, pulsando en el botón “Add User” podemos configurar nuevos usuarios. Yo he introducido como password “root” y no he añadido ningún usuario adicional. Lógicamente, esta configuración no debería aplicarse más que en entornos de aprendizaje o testeo, ya que no ofrece ningún tipo de seguridad. Cuando hayamos terminado de introducir todo esto, pinchamos en “Next“.
  8. Ahora podemos definir el nombre del servicio Windows que administrará el uso de MySQL y decidir si queremos que dicho servicio se ejecute automáticamente al iniciarse el sistema o no. Pulsamos “Next“:
  9. Esperamos a que se apliquen las configuraciones que acabamos de especificar y de nuevo pulsamos “Next“, y en la siguiente pantalla elegiremos si queremos iniciar Workbench o no. Luego pulsamos “Finish” para finalizar la instalación.

MySQL Notifier

En la bandeja del sistema tenemos el icono de MySQL Notifier. De un simple vistazo podemos ver si el servicio de MySQL se está ejecutando (icono blanco y verde) o si está detenido (icono rojo). Además, haciendo clic derecho sobre el notificador tenemos acceso a las funciones más comunes, como son precisamente iniciar o detener este servicio, entre otras.


Cuando el servicio de MySQL se encuentre en ejecución podremos iniciar Workbench o acceder a las base de datos MySQL a través del conector. Aunque pueda parecer obvio, a veces nos ocurre que Java empieza a soltarnos errores de conexión y simplemente es porque se nos ha olvidado iniciar el servicio 🙂

En próximas entregas, manejo básico de Workbench y conexión a MySQL desde Java.

Visual Basic – Generar archivo PDF desde código

Continuando con el post que inicié el pasado 1 de Agosto (“Visual Basic – Leer y obtener datos de Excel”), ahora voy a explicar cómo resolví el problema de generar la “pseudo-factura” en PDF que me exigían.

El resultado esperado debía ser algo similar al siguiente:

De los requisitos que especifiqué en el primer post, te recuerdo los que vamos a usar ahora:

  • Una imagen para el logo (“logo.png”, por ejemplo).
  • Librerías iTextSharp.

Pongámonos y manos a la obra.

Descargar y configurar iTextSharp en nuestro proyecto

  1. Descarga las librerías iTextSharp desde este enlace.
  2. Una vez descargado, extrae los siguientes archivos dentro de la carpeta de tu proyecto:
    • itextsharp.dll
    • itextsharp.pdfa.dll
    • iTextSharp.xml
    • itextsharp.xtra.dll

  3. Agregamos las referencias a iTextSharp a nuestro proyecto:
    • Menú “PROYECTO” – “Propiedades de xls2pdf”.
    • En la parte izquierda de la ventana, pinchamos la pestaña “Referencias”.
    • En la parte inferior, pinchamos en “Agregar.”
    • Con el botón “Examinar” buscamos dónde habíamos extraído los archivos anteriormente descargados y los agregamos como referencia.
  4. Importamos las referencias en nuestro proyecto. Con un doble click en cualquier parte vacía de nuestro formulario, justo encima de donde empieza la clase frmPrincipal teclearemos (la primera de las siguientes líneas ya deberías tenerla si seguiste la primera parte de este tutorial):

Generar el PDF

Recordemos cómo funcionaba nuestro formulario.

  1. Cargábamos el archivo Excel con el botón btnCargar.
  2. Leíamos el archivo Excel con el botón btnLeer. Con esto se rellenaba la lista de facturas.
  3. Haciendo doble click en una línea de la lista lstFacturas se generará un archivo PDF con el nombre que le indiquemos a través de un cuadro de diálogo.

El funcionamiento de los botones btnCargar y btnLeer (también btnSalir) ya lo programamos en la primera parte de este tutorial. Ahora pues corresponde codificar el evento de doble click sobre lstFacturas.

Doble click sobre un elemento de la lista lstFacturas

En nuestra ventana de código, copia las siguientes líneas (recuerda cambiar lstFacturas por el nombre que le hayas dado a tu lista):

Como vemos, el código anterior podría dividirse en 3 bloques:

  1. Líneas 02 a 30: obtenemos los datos de la factura seleccionada.
  2. Líneas 32 a 36: mostramos un mensaje con los detalles de la factura, pidiendo confirmación al usuario.
  3. A partir de la línea 37: si el usuario acepta, llamamos al método que efectivamente genera el PDF (concretamente la llamada se realiza en la línea 44).

El método generarPDF

Este método recibe como parámetros todos los detalles de la factura, como acabamos de ver en la mencionada línea 44 del código anterior. Es en este método dónde hacemos uso efectivo de las librerías iTextSharp. La idea para obtener un formato similar al de una factura, como se ve en la imagen al inicio de este post, es dividir el futuro PDF en una tabla. Trabajando con celdas resulta mucho más cómodo.

Así pues, copia el siguiente código en tu proyecto:

Aunque creo que con los comentarios incluidos en el propio código será suficiente, me gustaría destacar los siguientes puntos por ser específicos de las librerías iTextSharp:

Preparar el nuevo documento

  1. Línea 05: Declaramos un objeto tipo Document.
  2. Línea 06: Declaramos un objeto tipo PdfWriter, y le asignamos los datos del fichero PDF que deberá escribir.
  3. Línea 13: Una vez hemos preparado el nuevo documento, lo abrimos.
  4. Línea 110: Añadimos al documento todos los elementos con el método .Add(). En este ejemplo únicamente añadimos nuestra tabla (ya que ésta contiene a su vez todo lo que nos interesa).
  5. Línea 111: Cerramos el documento con el método .Close()

Imágenes

  1. Línea 04: Declaramos una variable tipo Image.
  2. Línea 10: A esta variable, mediante el método GetInstance le asignamos la ruta donde se halla la imagen en nuestro equipo.
  3. Línea 17: Definimos la celda que va a contener la imagen.

Tablas

  1. Línea 16: Definimos una nueva tabla, pasando como parámetro el número de columnas que va a contener (en nuestro caso 4).
  2. Líneas 57 a 107: A la tabla le vamos añadiendo celdas con el método .AddCell(). Este método puede recibir como parámetro un texto que se mostrará dentro de la celda, o bien un objeto Celda (pdfPCell) definido previamente.
  3. Línea 110: Recordar añadir el objeto tabla al documento.

Celdas

  1. Líneas 17 a 26: Definimos una nueva celda como “New PdfPCell()”. Como parámetros puede recibir cualquier tipo de objeto de iTextSharp (Image, Phrase, Paragraph…)
  2. Líneas 29 a 54: Asignamos los atributos de cada celda. Por ejemplo, en este ejemplo yo he definido las siguientes propiedades:
    • .Colspan: número de columnas que ocupará la celda (celdas combinadas).
    • .Padding: margen interior de la celda.
    • .Border: estilo del borde de la celda.
    • .HorizontalAlignment: tipo de alineación horizontal.
  3. Líneas 57 a 107: Como he dicho anteriormente, las celdas se añaden a la tabla mediante el método AddCell()

Al final ha resultado un post más extenso de lo que pensaba en un principio. Incluso puede que algo confuso. Por ello, pongo a tu disposición el código completo del proyecto en el siguiente repositorio de github: https://github.com/garciafigueres/xls2pdf.git

Además, aprovecho para recordarte que AQUÍ tienes una introducción muy básica del uso de repositorios git.

Como siempre, espero tus sugerencias, aportaciones, críticas…

Muchas gracias.

Ubuntu – Instalar JDK y Eclipse

En este post voy a detallar los pasos a seguir para instalar el JDK y la última versión (a agosto de 2014) de Eclipse en nuestro sistema Linux. A fecha de hoy las últimas versiones (y las que estoy utilizando) son:

  • Ubuntu: 14.04
  • OpenJDK: 1.7.0_55
  • Eclipse: Luna

Instalar el JDK

sudo apt-get install openjdk-7-jdk

Instalar Eclipse

  1. Descargar la última versión de Eclipse desde este enlace. Cuando el navegador pregunte, elegir Guardar Archivo. Yo he elegido guardarlo en el directorio ~/Downloads
  2. Una vez descargado, desde un terminal vamos a mover el archivo descargado al directorio /opt .

  3. A continuación debemos descomprimir los contenidos del archivo. Ten en cuenta que tu versión del archivo puede variar. Por favor, adapta el siguiente comando a la versión que tengas en este momento.

Crear un lanzador en el Escritorio

En este post expliqué cómo crear un acceso directo en Ubuntu de forma sencilla y cómoda haciendo uso de una interfaz gráfica. En esta ocasión, vamos a crearlo editando directamente el fichero correspondiente.

  1. Crear un nuevo archivo llamado ‘eclipse.desktop‘ en el directorio /usr/share/applications/

  2. Cuando se abra el editor de textos gedit, copiar las siguientes líneas y guardar el archivo:

  3. Para instalarlo en Unity, ejecutaremos los siguientes comandos:

  4. Y para que aparezca en el dash de Ubuntu, ejecutaremos: