jump to navigation

Convertir PDFs a texto (o por qué los PDFs no son un buen formato para eBooks) 29 agosto 2006

Posted by Jesús in Informática, Libros, Linux.
trackback

Siempre que se convierte un fichero PDF a texto, aparecen una serie de problemas que, aunque se pueden resolver, son francamente molestos. Básicamente son:

  • Problemas con la codificación de caracteres
  • Desastres con la maquetación: cada línea del txt de salida tiene un salto de línea manual al final, y otras lindezas como incluir encabezados y números de página entre el texto, etc.

Después de cacharrear un poco, me ha salido el siguiente proceso para tener un resultado aceptable:

1) Convertir a texto con el comando (linuxero, no sé en windows cómo iría la cosa):

pdftotext -layout -enc Latin1 -nopgbrk fichero.pdf

Así se creará un fichero.txt con la codificación de caracteres correcta (-enc), sin encabezados ni pies de página mezclados con el texto (-nopgbrk) y con una estructura parecida al fichero pdf original (-layout). Justamente esto último da muchos problemas, ya que, al respetar el maquetado original, añade saltos de línea a tutiplén que no deberían estar. Lo malo es que la alternativa (no poner el -layout) da como resultado un párrafo infinito, por lo que es preferible dejar que haga desastres con el maquetado y arreglarlos después.

2) Abrir el fichero de texto en nuestro editor favorito (que sea un poco potable, con expresiones regulares y tal, por ejemplo vi, kate u openoffice writer).

3) A partir de aquí la cosa depende de cómo haya quedado el resultado. El objetivo es el mismo en cualquier caso: identificar los saltos de línea “correctos” y marcarlos para distinguirlos del resto.

¿Cómo distinguir los saltos de línea “correctos”? Bueno, en muchos textos, la primera línea de cada párrafo tiene una sangría adicional, que en la conversión se habrá traducido a unos cuantos espacios más que el resto de líneas, que podemos aprovechar para distinguirlos. Otra forma es aprovechar que en muchas ocasiones se deja un espacio extra entre párrafos, que en el txt se convierte en saltos de línea adicionales. De esta manera, los saltos a conservar serán aquellos que aparezcan de dos en dos (uno el del párrafo, y otro el del espacio). En el peor caso (no hay manera de distinguirlos) se puede usar una regla no infalible pero que funciona bien en la mayoría de casos, que dice que un salto de línea correcto es el que va precedido de un punto (u otros caracteres como :, interrogantes, admiraciones y tal vez otras cosas).

Sea como sea, una vez sabemos cómo identificar el salto de línea que hay que conservar, lo sustituimos por una cadena arbitraria, por ejemplo INTROREAL. La idea es que si marcamos así todos los saltos de línea “buenos”, eliminamos el resto, y sustituimos estos marcadores que hemos añadido por un salto de línea, el resultado será un texto maquetado como toca.

4) Eliminar todos los saltos de línea innecesarios
Ahora toca quitar todos los saltos de línea, y aquí nos encontramos con una de las miserias del tratamiento de textos bajo linux. Lo ideal sería poder buscar todos los “\n”, sustituyéndolos por “” (o sea, nada), pero mucho me temo que las cosas no funcionan así.

La mayoría de editores de texto que he probado en linux funcionan línea a línea, lo cual quiere decir que, en búsquedas y demás, no se puede operar con textos en diferentes líneas. Esto hace que eliminar los saltos de línea sea algo más bien imposible, ya que en el tratamiento del texto línea a línea ya se da por implícito que la línea de texto es lo que va entre un intro y el siguiente, por lo que el intro en sí no se puede tocar. Así he visto que funcionan OpenOffice y Kate. Mi bienamado vi, por otra parte, si bien no tiene esta limitación, no parece muy optimizado para estas cosas, y en mi ordenador, a la que intento hacer algo así como eliminar todos los fines de línea, empieza a consumir memoria hasta que acaba con la RAM y el swap, por lo que no es muy usable que digamos.

Al final he resuelto la cosa escribiendo un mini-programa en Python (cómo me mola este lenguaje) que sustituye los saltos de línea de un texto por espacios. Al mismo tiempo, también va sustituyendo los marcadores que hemos puesto antes por un salto de línea, total, ¿para qué hacer las cosas dos veces cuando se pueden hacer de una vez? 🙂

import sys
import re

for l in sys.stdin:
	print re.sub("INTROREAL","n",l[:-1]),

El programa funciona a través de la entrada/salida estándar, por lo que se puede guardar con un nombre tipo quitaintros.py y ejecutar:

cat fichero.txt | python quitaintros.py > fichero_bien.txt

Y con esto ya estaría todo lo que se refiere al texto. Ahora faltaría idear alguna manera de arreglar los títulos de capítulo y demás, pero teniendo un poco de ojo se puede usar el mismo método (buscar algún rasgo que los distinga del resto del texto, y con un par de buscar/reemplazar bien puestos ponerlos como queramos).

Es verdad que es un poco trabajoso, pero el resultado final vale la pena. Lo triste es que recuerdo que en mis tiempos windowseros tenía automatizado todo esto como una macro de Word, pero mucho me temo que en el OpenOffice (dejando de lado el horrendo lenguaje de macros que tiene, que es tema para otro día), algunos de los pasos son imposibles de llevar a cabo, y hacen falta herramientas externas.

Moraleja: ¡No usar PDF para eBooks! La gracia de un eBook es poder adaptarlo a las necesidades de visualización de cada cual: unos querrán leer en pantalla, otros imprimírselo en A4, otros en A5, otros leer en un PDA… Esto requiere un mínimo de acceso al documento, que un PDF no da ni mucho menos y que obliga a hacer pirulas como las descritas arriba. Por tanto, es mucho más deseable, a la hora de trabajar con libros electrónicos, utilizar formatos como el ODT/DOC/RTF, HTML o el texto plano.

Anuncios

Comentarios»

No comments yet — be the first.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: