Category Archives: Utilidades

Cómo unir varios documentos PDF, extraer páginas y mucho más

Una amiga me comentaba hace unos días la necesidad de crear un documento en PDF a partir de muchos documentos PDF sueltos, tenía que entregar un trabajo en PDF y lo tenía hecho página por página. Busqué por internet y encontré una solución simple: una utilidad llamada PdfTk que es libre (GPL) y multiplataforma (funciona en GNU/Linux, FreeBSD, Solaris, Mac OS X y Windows), y además nos permite hacer muchas más cosas, aquí la lista:

  • Unir distintos PDFs en uno solo
  • Dividir un PDF para extraer sus páginas
  • Rellenar formularios PDF
  • Extraer los metadatos
  • Extraer los archivos adjuntos de un documento PDF
  • Reparar PDFs corruptos cuando es posible
  • Cifrar/descifrar documentos mediante contraseña
  • Aplicar una marca de agua al fondo del documento
  • etc

Este programa funciona en línea de comandos (hay una GUI que no es oficial y que yo no he probado). Lo que viene a continuación son algunos ejemplos prácticos de las opciones que yo he probado, que són las más básicas, lo demás lo probaré el dia que lo necesite:

Unir distontos documentos PDF en un documento PDF final:

$ pdftk doc1.pdf doc2.pdf doc3.pdf cat output doc-unido.pdf

También podríamos usar comodines (*, ?, [a-z], etc), este es el ejemplo más sencillo:

$ pdftk doc?.pdf cat output doc-unido.pdf

Incluso podemos usar variables, esto es tremendamente útil si lo usamos en scripts o si el comando se vuelve realmente largo. Además nos permite seleccionar páginas concretas de cada documento. En el siguiente ejemplo crearemos un documento combinado que contendrá las 3 primeras páginas de doc1.pdf, las 2 primeras de doc2.pdf y la cuarta de doc3.pdf:

$ pdftk  A=doc1.pdf B=doc2.pdf C=doc3.pdf cat A1-3 B1-2 C4 output doc-combinado.pdf

Podemos usar este sistema para invertir las páginas de un documento, en este caso supondremos que doc1.pdf tiene 5 páginas:

$ pdftk A=doc1.pdf cat A5-1 output doc1-inverso.pdf

Incluso podemos extraer por separado todas las páginas de un PDF. Este comando crea archivos con nombres pg_01.pdf, pg_02.pdf, etc… y otro archivo llamado doc_data.txt con los metadatos del PDF en nuestro directorio actual.

$ pdftk doc1.pdf burst

Si sólo queremos extraer los metadatos del documento, como por ejemplo el programa que se usó para crear el PDF, la fecha de creación, autor, número de páginas, etc podemos usar el parámetro dump_data:

$ pdftk doc1.pdf dump_data output metadatos.txt

Esto sólo es el principio, no olvidéis consultar la página man para más información, podéis ojearla online. Espero que os haya sido de utilidad.

Transferencia encriptada de archivos mediante SCP

SCP (Secure Copy) es un programa que viene con la mayoría de instalaciones de SSH y que nos permite transferir archivos entre 2 máquinas de forma encriptada. Su uso es muy simple, pero hay que tener en cuenta que nuestro host debe tener el cliente SSH instalado y el host remoto debe tener el servidor SSH habilitado.

Copiar un archivo de nuestro ordenador a un ordenador remoto:

$  scp archivo.tgz usuario@host_remoto:/ruta/remota/

Se nos pedirá la contraseña de ‘usurio’ en ‘host_remoto’ y se procederá a la transferencia del archivo hacia ‘/ruta/remota/’ si es que ‘usuario’ tiene permisos de escritura en esa ruta.

Copiar un archivo de un ordenador remoto a nuestro ordenador:

$ scp usuario@host_remoto:/ruta/remota/archivo.tgz /ruta/local/

También se nos pedirá la contraseña de ‘usuario’ en ‘host_remoto’ y se procederá a la transferencia del archivo hacia ‘/ruta/local’ si es que nuestro usuario tiene permisos de escritura en esta ruta.

En cualquiera de los dos casos, si el puerto TCP del servidor SSH no es el 22 (por defecto siempre es el 22) tendremos que especificarlo con el parámetro -p <número_de_puerto>.

Guardando la salida por pantalla en un fichero con el comando tee

A veces, administrando servidores por linea de comandos, voy a hacer una tarea que se va a demorar mucho tiempo, quizás horas. Por ejemplo, compilar todas las actualizaciones e instalarlas en *BSD, sincronizar un repositorio, etc.

Muchas veces al ejecutar comandos importantes para el sistema es necesario estar atento a la pantalla por si salen mensajes de alerta que nos pueden ser de ayuda, pero es evidente que no podemos estar atentos al 100% con tareas de este tipo. Una solución cutre sería redireccionar el STDOUT (>) a un fichero, usaremos el comando find sólo como ejemplo, por poner algo:

# find / -name *.conf > salida

En este caso, salida contiene toda la salida que hubiese hecho por pantalla el comando en concreto, pero… ¿y si queremos ver la salida en tiempo real, y al mismo tiempo almacenarla en un fichero? Muy facil, vamos a usar tee:

# find / -name *.conf | tee salida

tee envía lo que recibe por el pipe hacia la salida standard STDOUT (la pantalla) y al mismo tiempo lo envia al fichero que le pasemos por parámetro… ¡voilà! Pero supongamos que no queremos escribir de cero el fichero salida como lo haríamos con > sinó añadir esos datos al final como haríamos con >>. En este caso tenemos que usar el parámetro -a (append):

# find / -name *.conf | tee -a salida

Hasta aquí esta mini-explicación de un comando muy útil pero muchas veces desconocido, olvidado o simplemente poco usado.

Detour: nuevo theme para e17

Detour es un tema para el escritorio Enlightenment 0.17, y para qualquier aplicación que use las librerías EWL y ETK. Usa los ya clásicos iconos Tango y es realmente precioso y simple, como tiene que ser.

Yo personalmente llevo algunos meses usando el theme Cthulhain en mi portátil, pero viendo esto, me paso a Detour. Aquí podéis ver una captura de pantalla. La maquinita es un Pentium III 600 Mhz, 128RAM y uso FreeBSD 6.2.

Detour

Página oficial del proyecto (incluye varias capturas de pantalla)

Copias de seguridad del MBR y la tabla de particiones en GNU/Linux

En primer lugar tenemos que plantearnos si realmente necesitamos guardar en un fichero el contenido de nuestro Master Boot Record y de nuestra Tabla de Particiones, posiblemente no. Se me ocurren dos casos, a modo de ejemplo, en que puede ser muy útil.

El primero estaria destinado a la clonación de discos, puedes guardar una imagen de cada partición junto con una imagen del sector de arranque. Luego ir al disco destino y volcar esa información sin problemas, consiguiendo un perfecto clon (los dos discos tienen que ser iguales). A mi la clonación de discos no me interesa especialmente, pero ahí queda eso.

El segundo caso es cuando se trata de una copia de seguridad, simplemente. Si eres un fanático de tu distribución favorita y llevas con la misma instalación desde hace 4 años (subsistiendo como un héroe a base de actualizaciones), supongo que no debes tocar a menudo el MBR y mucho menos crear y eliminar particiones. Pero si eres como yo y te dedicas a instalar todo lo que te cae en las manos (físicamente, sin usar virtualización), tendrás el disco bien partido y repartido (Linux permite instalarse en particiones lógicas, por lo que podrías instalar decenas de distribuciones en un sólo disco duro). En este caso es recomendable hacer copias de seguridad del sector de arranque por lo que pueda pasar.

Creando copia de seguridad del MBR:

# dd if=/dev/sda of=/root/backups/mbr bs=512 count=1

Recuperando el MBR a partir de la copia de seguridad:

# dd if=/root/backups/mbr of=/dev/sda bs=512 count=1

dd es una utilidad que, simplemente, copia el contenido de la entrada estándar if en la salida estándar of. En mi caso el disco duro /dev/sda es la entrada y el fichero /root/backups/mbr es la salida (y viceversa para la recuperación). bs es un parámetro que contiene el número de bytes que se van a copiar (el MBR está situado en la pista zero del disco duro, los primeros 512 bytes) y count es un parámetro que contiene el número de bloques que se van a copiar (los bloques son de 512 bytes, por lo que vamos a copiar solo uno, el primero).

Creando copia de seguridad de la Tabla de Particiones:

# sfdisk -d /dev/sda > /root/backups/tabla_part

Recuperando la Tabla de Particiones a partir de la copia de seguridad:

# sdfisk /dev/sda < /root/backups/tabla_part

sfdisk sirve para manipular tablas de particiones en Linux. En la creación de la copia de seguridad usamos el parámetro [-d] para que nos dé una salida en texto plano que pueda ser usada luego para regenerar la tabla. Pasamos esta salida al fichero /root/backups/tabla_part mediante el redireccionador de STDOUT [>]. Para recuperar la tabla sólo hay que usar ese fichero pasándolo por el redireccionador de STDIN [<] hacia el comando sfdisk.

En los ejemplos he usado /dev/sda como disco duro porque es así en mi caso, pero esto puede ser diferente dependiendo de si el disco es IDE, SATA, SCSI o USB. Hay varias formas de saber a qué disco nos estamos refiriendo. una es usar el comando mount para ver las particiones montadas, otra seria leyendo el fichero /etc/fstab donde están las instrucciones de montaje de discos para el arranque. Pero estas opciones no funcionarian por ejemplo des de un Live CD. La solución mas útil para ver todos los discos y particiones (aunque no estén montadas) es:

# fdisk -l

Este comando nos listará todas las particiones (muy útil para detectar un pendrive por ejemplo). Hasta aquí este mini manual, espero que a alguien le pueda ser útil.

Fish: el shell interactivo amigable

fish shellCuando empezé a usar sistemas operativos tipo-UNIX aluciné con Bash, realmente no tenía nada que ver con usar la linea de comandos en Windows (aunque yo en Windows nunca la usé demasiado, supongo que precisamente por ser poco amigable). Al poco de usar Bash descubrí podia usar otras opciones como zsh, ksh, tcsh pero ninguna me convenció demasiado.

Hasta hace un par de meses, que fué cuando descubrí al grandioso Fish (Friendly Interactive SHell). A diferencia de las otras que probé, esta sí se parecía mucho a Bash, o sea que no tuve que aprender NADA. Solo tuve que usarla durante un tiempo para ir descubriendo poco a poco sus ventajas, entre las cuales están:

  1. No solo autocompleta directorios, ficheros y comandos como Bash, ¡lo autocompleta todo! Por ejemplo: ssh te autocompleta con tus hosts conocidos o lugares donde conectaste en el pasado; el autocompletado de comandos incluye brebe descripción del ejecutable en cuestión; autocompletado de variables de entorno; autocompletado de las páginas man y help… y mucho más, y todo esto con paginación de los resultados de autocompletado.
  2. Uso y abuso de colores. El prompt consta de: usuario@host (en blanco) + directorio actual (en verde). Parece cansino pero te acostumbras a los pocos minutos. Cada tipo de fichero tiene su color, por ejemplo los directorios se en azul, los de texto (txt, pdf, rtf…) en violeta, los multimedia (imágenes, musica, video) en un violeta mas rosado, los binarios en verde, los enlaces blandos en azul, los enlazados en rojo, etc.
  3. Uso de negrita y subrayado para remarcar rutas correctas, ficheros importantes (imágenes, multimedia, directorios, ejecutables), etc
  4. Atención al error en tiempo real, si lo que estás escribiendo no es un comando (aún), lo marca en rojo, cuando pasa a ser algo coherente lo pinta de verde. Lo mismo se aplica a directorios o ficheros (aunque estos pasan a blanco).
  5. Ayuda en modo gráfico, por lo que si escribes help te sale un mensaje de “Help is being displayed in firefox” y efectivamente se abre Firefox (o el navegador que uses por defecto) y te muestra esta completísima ayuda.

Casi se me escapa decirlo, toda esta información que Fish añade (descripciones de los ejecutables, hosts conocidos, páginas man y help, etc) no es estática sinó que se busca en tiempo real. Por este motivo puede suponer un problema si se abusa de sus posibilidades en un ordenador antiguo.Por todo esto y mucho más que voy aprendiendo con el tiempo, prefiero Fish a Bash y cuando uso Bash noto que me falta algo.

Podéis ver algunas capturas de pantalla (y más información sobre Fish) en esta página. Para terminar solo decir que Fish no es perfecto, pero merece mucho la pena probarlo.

Indent

Hoy en el menéame han enviado una noticia sobre el International Obfuscated C Code Contest, que como su nombre indica es un concurso de ofuscación de código en C. A los programas ganadores les ponen títulos como: Best of show, Most Obfuscated Algorithm, Best abuse of the rules, Astronomically Obfuscated, Best abuse of system calls, Most Humorous, Best one liner, etc

Para que veáis algunos ejemplos de los programas ganadores, os linkeo algunos:

[1] [2] [3]

He pensado rápidamente en el programa indent, que sirve para autoindentar correctamente el código en C. Lo he instalado en mi querido Arch

# pacman -S indent

…he des-ofuscado algunos de los programas ganadores y me he reido un montón viendo lo que hace la gente para conseguir esos resultados. Pero aunque indent es tan fácil de usar como escribir en el prompt…

# indent file.c

…la mayoría de programas me han dado errores en lineas concretas, y algunos seguian ilegibles incluso después de indentar. Tengo que decir que no me he atrevido a compilar ninguno de ellos ;) así que si alguien se atreve, que lo cuente!