Tag Archives: howto

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>.

Copiar y pegar en Linux

Listado de conocimientos técnicos necesarios para entender este post con éxito:

  • Hay que saber seleccionar un texto
  • Hay que saber pulsar botones en un mouse
  • Hay que saber lo que es un ordenador y como interactuar con él

Podría empezar diciendo algo así como: ¡No se asusten, es igual que en Ruindows!… pero la verdad es que el hecho de copiar y pegar en GNU/Linux (o en cualquier otro sistema operativo tipo UNIX) tiene su gracia. Por supuesto que podemos hacer el clásico Ctrl+C para copiar y Ctrl+V para pegar, y también con el menú Edición –> Copiar, etc. Pero esto no nos importa porque ya sabemos hacerlo :D

Vamos a hablar del tercer botón del mouse. El tercer botón del mouse es, generalmente, el que hay en la ruedecita de scroll, no pienso analizar el resto de posibilidades. Tanto si estamos en modo texto o en modo gráfico. Tanto si estamos usando un programa de edición de textos, un navegador, una terminal o cualquier otra cosa con textos seleccionables, un clic con el tercer botón (o botón del medio) del mouse pegará el texto que tengamos seleccionado. Así de simple. No hay más.

Por si no ha quedado claro pondré un ejemplo a nivel de parbulario. Seleccionamos una palabra, frase, párrafo, texto, página web, etc como lo hemos hecho toda la vida y hacemos clic con el botón del medio en el lugar donde queramos copiar el contenido.

Si nuestro mouse no tiene más que dos botones, hacer clic con los dos a la vez genera el mismo evento que hacerlo con el tercer botón.

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.

Cómo espeficar el teclado en español en Xorg

Teclado EspañolEste post puede parecer una tonteria, por evindente, pero recuerdo hace tiempo haberme encontrado con ese problema y no tener ni idea de cómo solucionarlo. Si usas KDE o Gnome, tienes un bonito menú donde configurar el layout del teclado y ponerlo en español.

Pero si eres usuario de algun window manager más simple y DIY, tienes que añadir lo siguiente al fichero /etc/X11/xorg.conf dentro del apartado Section “InputDevice” que hace referencia al teclado. Tenemos que poner el modelo de teclado (número de teclas) y por supuesto el mapeo de teclado “es”.

Option "XkbModel" "pc105"

Option "XkbLayout" "es"

Ahora puedes usar tu mapeo de teclado en cualquier aplicación gráfica sin tener que configurar nada más. Otra forma de hacer lo mismo sería usar el comando setxkbmap:

# setxkbmap -model pc105 -layout es

Ya que hablo del fichero xorg.conf, aprovecho para anunciar xorg-conf.org, un nuevo proyecto que espera realizar una base de datos de configuraciones para xorg.conf, podéis enviar allí vuestros ficheros de configuración.

Alta resolución en la consola de FreeBSD

Una de las cosas que no me gustaba de FreeBSD cuando empezé es que por defecto usa una consola típica de 80 columnas x 25 líneas. En Linux esto depende del bootloader (GRUB o LILO), que es donde se define la resolución de pantalla y la profundidad de color que usará el sistema corriendo en modo texto. Volviendo a FreeBSD, lo que no sabía yo es que esto podía cambiarse fácilmente, para eso usaremos vidcontrol.

Vidcontrol es el comando que comunica con syscons (el driver que proporciona las terminales virtuales) y especifica modos de video y color.

Para empezar, vemos cuáles son los modos disponibles con el siguiendo comando:

# vidcontrol -i mode

En este momento nos cagamos en los desarrolladores de FreeBSD y en sus respectivas famílias. Vemos que, si los modos son esto que vemos, empezamos mal. Efectivamente, estamos empezando por el final casi, lo primero que tenemos que hacer es añadir ciertas opciones al Kernel. Añadimos lo siguiente a nuestro fichero de configuración del Kernel.

options VESA # Añadimos el módulo VESA al kernel

options SC_PIXEL_MODE # Syscons actuando en modo píxel

Si no sabes compilar un nuevo kernel no te preocupes, el otro dia expliqué cómo hacerlo. Ahora podemos volver a vidcontrol:

# vidcontrol -i mode

Vemos que la lista es ahora considerable. Escojemos un modo que sea de nuestro gusto y lo probamos, en mi caso uso el 279, que viene a ser 1024×768 con 16 bits de color. Lo probamos:

# vidcontrol MODE_279

Si esto no funciona (o no nos gusta el resultado) seguimos probando modos hasta tropezar con lo que queremos. Por ejemplo, si tenéis activado el mouse en consola, veréis que en algunos modos concretos no os funciona, no tengo ni idea del porqué pero supongo que habrá una buena explicación. Por último sólo falta añadirlo a /etc/rc.conf (configuración general del sistema) para que el modo se aplique al inicio.

allscreens_flags="MODE_279"

Reiniciemos y seamos felices.

Compilando el kernel de FreeBSD

Esta semana he instalado FreeBSD en el portátil y llevo algunos dias configurándolo todo, actualizando el sistema, instalando aplicaciones des de los ports, etc. Antes sólo habia usado FreeBSD como servidor y me he decidido a probarlo mas a fondo como sistema de escritorio. Una de las cosas que nunca antes habia hecho en FreeBSD es compilar el kernel. En Linux sólo lo hice un par de veces para añadir algo en concreto en la época en que usaba Slackware.

FreeBSD

Básicamente he añadido:

  • Soporte para la tarjeta de sonido sin tener que cargar el driver en /etc/rc.conf
  • Soporte para altas resoluciones en la consola
  • Especificar que la CPU es i686

Cosas que he quitado de hardware que no tengo (o no uso):

  • Soporte para CDROM
  • Soporte para Disquetera
  • Soporte para SCSI
  • Soporte para cintas
  • Soporte para alto número de particiones en el disco
  • Soporte para RAID
  • Soporte para puertos COM, LPT, etc

También he quitado el soporte para:

  • NFS
  • IPV6
  • Drivers Ethernet o Wireless que no necesito

¿Cómo compilar el kernel en FreeBSD?

El proceso de compilación del kernel en FreeBSD es muy simple. En /usr/src/sys se encuentra el código fuente del kernel. Si tenemos bien configurado el cvsup podemos actualizar el código a la última versión de esta forma:

# cd /usr/src

# make update

Con esto hemos actualizado el código fuente de todo el sistema base, ahora entramos en /usr/src/sys/i386/conf y hacemos una copia del fichero de configuración del kernel que viene por defecto:

# cd /usr/src/sys/i386/conf

# cp GENERIC NUEVOKERNEL

NUEVOKERNEL es un fichero de texto plano al que sólo tenemos que comentar (#) o descomentar las lineas adecuadas dependiendo de lo que estemos buscando. Para esto nos será extremadamente útil leer The Configuration File en el Handbook de FreeBSD. Lo editamos con ee (“easy editor”, viene por defecto en la instalación base) o con vi (lo prefiero pero a veces uso ee por pereza), y hacemos las modificaciones:

# ee NUEVOKERNEL

Ahora ya podemos compilar el nuevo kernel:

# cd /usr/src

# make buildkernel KERNCONF=NUEVOKERNEL

Instalamos:

# make installkernel KERNCONF=NUEVOKERNEL

Ahora el nuevo kernel se ha instalado en /boot/kernel/kernel y el antiguo se ha movido a /boot/kernel.old/kernel

Reiniciamos:

# reboot

Y si lo hemos hecho todo bien ya podemos disfrutar de un kernel a medida en nuestro sistema FreeBSD.

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.