
A veces un pdf está trazado en vez de ser texto. Es decir, no fue guardado como texto plano sino como imagen. En base a esta premisa me propuse encontrar una buena estrategia para convertir un número de pdfs elevado (unos 8 documentos) en archivos de caracteres identificables. La idea era que en archivos de texto en los que no podía realizar búsquedas ni copiar el texto se pudiesen leer pasándoles un OCR.
Un OCR (Optical character recognition), extrae de una imagen los caracteres que componen un texto para almacenarlos en un formato con el cual puedan interactuar programas de edición de texto.
Mientras que en una imagen los caracteres se describen indicando cada uno de los píxeles que los forman, al convertirlos a un formato de texto (por ejemplo ASCII o Unicode), pasan a estar descritos por un solo número, por lo que se produce una reducción significativa del espacio en memoria que ocupan.
Antes de que sigas leyendo estas indicaciones para solventar el problema de ese pdf, te sugiero que si lo que buscas es la forma de "desbloquear un pdf" que ha sido protegido para que no se pueda copiar, en esta dirección
www.ensode.net/pdf-crack.jsf
Tienes un programa que lo hace online. Es muy útil y muy sencillo de usar, lo subes y el te lo devuelve desprotegido.
Bien, sigamos con el OCR. Voy a presentaros dos softwares para ello y sus soluciones correspondientes. Una de ellas es libre y la usaremos bajo Linux y la otra es de pago la usaremos baja windows.
Empezaremos por la que es libre. No es mejor, pero es más versátil, libre y por tanto podremos usarla sin problemas de licencias. Iremos por pasos.
En primer lugar, lo que vamos a hacer es un script que se ejecute desde el shell y al que le pasaremos el nombre del archivo pdf a convertir y el número de páginas del archivo. Yo lo he hecho así porque no he encontrado un método para saber el número de páginas del pdf mediante el código, pero me imagino que existirán formas de hacerlo.
Creamos el archivo con un programa de edición de textos, yo lo voy a hacer con gedit.
Una vez creado lo rellenamos con la siguiente linea:
Hemos usado Sh, habitualmente uso Bash, Bash (bourne again shell) es una evolución/ampliación de sh
(también conocida como shell de bourne, por David Bourne su creador). Por lo tanto algunas construcciones/funciones que funcionan en bash puede que no funcionen en sh mientras que todo lo que funciona en sh debería
funcionar en bash. Sh no es más que la shell original de Unix mientras que bash es un proyecto desarrollado por GNU. Bash y Sh son el shell de Unix (intérprete de órdenes de Unix) y lo que le estamos especificando en la línea es que sea él quien ejecute las órdenes.
Los parámetros los recibirá a continuación del nombre del archivo y se numerarán como $1, $2….$N, donde $0 es el nombre del programa y $n el parámetro n.
Después crearemos una serie de directorios para ir almacenando los archivos resultado del proceso. Para eso sirven estas lineas:
-
-
-
mkdir ./directorio$
1/tiff/
-
mkdir ./directorio$
1/paginas/
-
mkdir ./directorio$
1/paginasTratadas/
-
mkdir ./directorio$
1/textos/
Ahora convertimos el archivo de pdf a tiff. Para ello vamos a emplear convert. Es un programa de imageMagick, un paquete de programas para tratar imágenes en linux. Para ello vamos a tener que instalar el programa, en ubuntu es fácil hacerlo con:
Añadimos esta línea al script:
-
-
convert -density 150×150 -compress Group4 $1 ./$1/tiff/convertido.tiff
-
Esta línea lo que hace es convertir el pdf en un archivo tiff. La denominación en inglés "Tagged Image File Format" (formato de archivo de imágenes con etiquetas) se debe a que los ficheros TIFF contienen, además de los datos de la imagen propiamente dicha, "etiquetas" en las que se archiva información sobre las características de la imagen, que sirve para su tratamiento posterior.
Tiff es un formato vinculado a photoshop porque además de ser propiedad de adobe permite guardar la información de capas de este programa de edición de imágenes. En esta última linea le indicamos la densidad, que determina la resolución en píxeles en base a la resolución que define por defecto el programa. Si no lo hacemos así nos lo escanea a baja resolución y no nos servirá para reconocer con ocr. El compress es otra opción para la compresión del archivo resultante.
Y seguimos añadiendo líneas a nuestro programa:
-
-
for i in $(seq –format=%003.f 1 $2); do
-
convert -depth 8 ./directorio$1/tiff/convertido.tiff[$i] ./directorio$1/paginas/pagina-$i.pnm
-
done
En estas líneas hemos hecho un bucle que recorre los tiffs y los convierte archivos pnm. Lo hemos hecho accediendo a cada hoja del tiff con "convertido.tiff[$i]", es decir usando el operador corchetes. La línea de depth 8, es necesaria porque se ha de guardar en 8 bits y no en 16 o fallará el programa unpapper que usaremos después. Ahora tenemos el pdf separado en archivos .pnm, pnm es un archivo similar al mapa de bits, no usa compresión y se suele usar para guardar archivos de páginas.
Estamos acabando. Vamos a usar Tesseract para el ocr, Tesseract fue creado por Hewlett Packard Laboratories entre 1985 y 1995. En 1995 obtubo el lugar 3 entre los de mejor comportamiento en la contienda preparada por la UNLV(University of Nevada in Las Vegas), google la utiliza para buscar texto en los libros que ya no tienen CopyRight. Fue liberado en 2005 bajo la licencia de OpenSource y lo podéis encontrar en el repositorio de google, como es libre usarlo como lo estoy usando yo.
Pero debemos hacer un para de arreglos antes. Separamos el tiff en pnm, porque un tiff de varias hojas no lo podía leer Tesseract, pero Tesseract no admite otro formato que no sea tiff. Asi que convertiremos los pnm a tiff, ahora en archivos separados. Pero además de eso le haremos un tratamiento previo con unpapper para dejar la hoja lista. Unpapper umbralizará la hoja para que los caracteres se identifiquen mejor.
-
-
for i in $(seq –format=%003.f 1 $2); do
-
#aplicamos unpapper (–overwritte hace que si ya existe el archivo lo sobreescriba)
-
unpaper –overwrite ./directorio$1/paginas/pagina-$i.pnm ./directorio$1/paginas/unpapered-$i.pnm
-
-
#convertimos el pnm a tiff y luego lo eliminamos
-
convert ./directorio$1/paginas/unpapered-$i.pnm ./directorio$1/paginasTratadas/prepared-$i.tif && rm ./directorio$1/paginas/unpapered-$i.pnm
-
-
#y por último aplicamos tesseract, indicando el idioma con -l spa (español es este caso)
-
tesseract ./directorio$1/paginasTratadas/prepared-$i.tif ./directorio$1/textos/pagina-$i -l spa
-
done
Sólo queda añadir una última línea. Recopilamos los textos en modulo.txt
cat ./directorio$1/textos/pagina-* >modulo.txt
Todo ha quedado guardado en un archivo de texto.
Al archivo script_ocr tendremos que darle permisos de ejecución con chmod. La orden "chmod +x script_ocr" bastará para ello.
Por último ejecutamos el programa desde el shell, si el archivo se llama archivo.pdf y tiene 43 páginas lo haremos así:
-
-
./script_ocr archivo.pdf 43
No pongáis la dirección con ./archivo.pdf o dará error al crear los directorios con mkdir.
Bueno lo podéis descargar el script completo aquí.
Pero como os decía hay una alternativa de pago. Es Abby Fine Reader que en su versión 9 permite directamente leer el pdf y convertirlo. Eso sí la versión de prueba sólo permite guardar una hoja cada vez. Pero la interfaz gráfica es sencillísima. Como veis, un proceso muy complicado el de Linux frente a uno muy sencillo de Windows. En contra, Abby tiene que es de pago, de hecho no he conseguido ni para probarla una versión pirata, pero tengo la versión 4 de Abby que venía con mi Scanner Acer. Abby Fine reader es muy preciso escaneando Tessearact lo es pero quizá no tanto, intuyo que influye el tratamiento previo de la imagen que no lo hace el propio Tessaract sino que lo hemos hecho con unpapper.
Si aprendéis a usar convert de linux, comprobaréis que es una herramienta mucho más potente que la automatización por lotes de photoshop para renombrar y convertir imágenes en determinados casos.