Extraer tabla de contenidos de PDF (TOC)

Camiseta DNG Kukuxumuxu

Desde hace algún tiempo vengo editando una revista en formato electrónico, actualmente se ha publicado el número 175 (si, más de 175 meses desde el 2006 y algunos éxitos remarcables).

Inicialmente hacía todo el trabajo de manera manual, pero con el paso del tiempo he ido automatizando algunas tareas, como exportar las novedades desde WordPress e importar el XML formateado con los estilos al InDesign.

Otra de las tareas que he automatizado es el índice de cada número, que en el momento de publicar el nuevo número, se importa la tabla de contenidos (TOC, Table Of Contents) desde el pdf, con los títulos y números de página de cada sección.

Esta semana he cambiado el servidor de la revista DNG a una nueva instancia, ahora ya administrada desde GridPane para evitar muchas de las tareas de administración de sistemas y en este proceso tocaba volver a configurar la automatización de extracción del TOC.

La librería utilizada hasta ahora era pdfminer, pero el proyecto está oficialmente abandonado desde el año pasado: «Warning: As of 2020, PDFMiner is not actively maintained. The code still works, but this project is largely dormant. For the active project, check out its fork pdfminer.six.»

En este nuevo servidor he instalado pdfminer.six que funciona con Python 3.6 o superior en lugar de Python 2.4 o superior (no soporta Python 3.x).

Instalando pdfminer.six

La máquina ejecutando DNG Photo Magazine es un Ubuntu 18.04 que es el requisito actual de GridPane y tiene disponible Pyhton 2.7 y Python 3.6 ejecutando respectivamente pyhton o python3:

# python --version
Python 2.7.17

# python3 --version
Python 3.6.9

Y si ejecutamos pip estaremos utilizando la versión de Python 2.7, por lo que vamos a instalar pip3 para ejecutar con Python 3.6:

# apt install python3-pip

Y ya tenemos ambas versiones disponibles:

# pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

# pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

Así que ahora ya podemos instalar pdfminer.six:

# pip3 install pdfminer.six

Y comprobar que está instalado con pip3 list por lo que ahora ya podremos ejecutar:

# /usr/local/bin/dumppdf.py --extract-toc archivo.pdf

Que nos volcará la estructura del TOC y que después podemos parsear por ejemplo con simplexml_load_string para obtener los títulos y páginas de cada sección.

Os dejo una captura de la parte del plugin creado para WordPress que extraía hasta ahora el TOC, que luego se incorporaba a la página de descarga mediante un proceso un poco más complejo, he formateado un poco el código para pdfminer.six ya que tiene unos cuantos años, pero es el que se lleva utilizando desde que se automatizó:

pdfminer

MuPDF Tools

Pero después de mirar la nueva opción de pdfminer, sin contarlo me he encontrado con MuPDF que también puede servir para el mismo fin. Vamos a verlo.

Lo instalamos con:

# apt install mupdf-tools

Y ya tenemos la herramienta de comando de línea mutool show que dispone de la opción outline que imprime la tabla de contenidos: https://www.mupdf.com/docs/manual-mutool-show.html por lo que podemos ejecutar:

# mutool show archivo.pdf outline

Y con esto tan sencillo, ya podemos usarlo en nuestro plugin encargado de extraer el TOC del pdf de cada número.

He reescrito apenas una docena de líneas para usar la nueva herramienta de una manera más eficaz y manteniendo el mismo resultado en la parte encargada de incorporar el TOC extraído a nuestra aplicación de WordPress, así que esta nueva instancia de la revista DNG se queda con MuPDF Tools en lugar del anterior pdfminer o su sustituto natural pdfminer.six.

MuPDF Tools

Deja un comentario