domingo, 21 de febrero de 2021

Extraer páginas de un PDF

Hasta ahora, si quería extraer algunas páginas de un archivo PDF, me había conformado con usar la estupenda utilidad PDF Arranger (antigua PDF Shuffler) de la que he hablado aquí alguna vez y, sencillamente, eliminar las páginas sobrantes, quedarme con las que me interesaban, y guardar el archivo ‘capado’ con otro nombre.

Es un método que va muy bien, y es muy cómodo, cuando quieres eliminar algo, una portada, alguna página de poco interés… pero hoy tenía en mis manos un PDF de 400 y pico páginas (exactamente una edición del ‘Neufert-Arte de proyectar en Arquitectura’, que es ‘la biblia’…) y como solo me interesaba separar 19 páginas, era un verdadero coñazo hacerlo ‘por el sistema habitual’.
Así que me puse a investigar.


Primero probé hacerlo, y por cierto con éxito, con dos herramientas del paquete ‘poppler-utils’ (del que también he hablado alguna vez). La primera, el comando ‘pdfseparate’ que lo que hace es extraer las páginas que le digas (aplicando dos modificadores: el -f (de first) seguido del número de la primera página a extraer y el -l (de last) seguido del número de la última que quieras. O sea, por ejemplo…
pdfseparate -f 220 -l 238 Neufert.pdf extraidos-%d.pdf
y luego, extraidas esas páginas, con una segunda herramienta, el comando ‘pdfunite’, que agruparía las páginas extraidas en un solo archivo, con (siguiendo el ejemplo)
pdfunite extraidos*.pdf EXTRAIDO.PDF
Pero, siguiendo mis investigaciones, descubri que, en los repositorios de Debian, existe una herramienta muy interesante que se llama ‘pdftk’

La utilidad pdftk
Resulta que PDFTK es una verdadera ‘navaja suiza’. Y además es multiplataforma.
Esta utilidad puede dividir (partir) documentos PDF, combinarlos en un solo archivo, protegerlos con contraseña, recomprimirlos para disminuir su tamaño, rotarlos, e incluso repararlos. También puede usarse para crear marcas de agua, y alguna otra cosa mas. Menudo hallazgo, algún día tendré que estudiarlo a fondo y, poiblemente, dedicarle alguna entrada en el Blog.
Pero bueno, en el caso, tras, por supuesto, instalarla en el PC con un
sudo apt install pdftk
extraer páginas (en el ejemplo, de la 220 a la 238) de un archivo PDF es tan sencillo como escribir, en una consola abierta en la ruta donde esté ese archivo…
pdftk A=nombre_archivo.pdf cat A220-238 output nombre_extraidos.pdf
así que perfecto, lo hace todo (extraer y agrupar lo extraido) a la vez.
(Por cierto que pdftk permite, además, la posibilidad de extraer simultáneamente páginas de más de un archivo. Se haría con un mandato de este tipo:
pdftk A=archivo1.pdf B=archivo2.pdf cat A30-35 B1-2 output EXTRAIDO.PDF

con lo cual es una maravilla… si alguna vez de necesita).
Y aquí acabaría la cuestión, bastaría acordarse del mandato 'pdftk', y de su sintaxis, para resolver el problema de extraer algunas páginas de un documento en PDF, y formar con ellas otro PDF.
NOTA IMPORTANTE: parece ser que 'pdftk' también lo proporciona el paquete 'pdftk-java' que, al parecer, desde Buster, se instala automáticamente. Vale, he desinstalado 'pdftk' porque con 'sudo orphaner' me lo daba como paquete prescindible y, de momento, todo funciona OK.

AMPLIACIÓN FINAL
Pero claro, si solo lo vas a hacer muy de tarde en tarde, a lo mejor se te olvida y, o lo consultas aquí... o a lo mejor te es más fácil tener un script, o similar, que te lo facilite.

Porque bastaría ejecutar un script introduciendo los 3 argumentos nombre_archivo pag_inicial pág_final para hacerlo funcionar más o menos automáticamente. El caso es que hasta me había currado un sencillo script con pdfseparate y pdfunite, así que ahora, con PDFTK, es aún más fácil crearlo. Por ejemplo, este sería el script más sencillo:
#!/bin/bash
# script para extraer individualmente una serie de páginas interiores de un archivo PDF (y unirlas en un nuevo PDF)
# crear una carpeta y copiar en ella el archivo PDF original y el script
# abrir en ella una terminal y ejecutar el script añadiendo, como argumentos, estos 3 datos: pag_inic pag_final "nombre_archivo"
# Así, para extraer de la pág 3 a la 9 la orden sería, por ejemplo,
# sh extraePDF.sh archivo_original.pdf
3 9
# Y estas serían las ordenes del script (incluso con la última, vale) 
echo
Se extrae desde la página... $2 hasta la página.... $3
echo del archivo... $1
#Y el resultado se guarda como 'EXTRAIDO.PDF'
pdftk A=$1 cat A$2-$3 output EXTRAIDO.PDF


Pero hoy estoy inspirado y me voy a inventar algo mejor: ejecutarlo desde el propio navegador de archivos (en mi caso, Nemo, que es el que, en el entorno Cinnamon, sustituye al Nautilus), a través de algo de lo que ya hablé hace muchos años… y que todavía está vigente: añadiendo una ‘Nemo_action’ para que aparezca en el menú contextual de Nemo.
Vamos a ello...

Crear una 'Nemo Action', con PDFTK, para extraer páginas de documentos PDF
Como explicaba ya hace más de 5 años, crearé una ‘Nemo Action’ escribiendo el siguiente archivo de texto:
[Nemo Action]
Active=true
Name=Extraer páginas de un PDF
Comment=usando pdftk
Exec=sh ExtraerPagPDF.sh "%F"
Icon-Name= shotwell
Selection=S
Extensions=pdf;PDF;
#NOTAS
# el parámetro "%F" indica que la acción se aplique sobre el archivo seleccionado
# es decir que, en un script, sería la variable “$1”
# el archivo hay que guardarlo como 'nombre_acción.nemo_action'
y guardándolo como 'Extraer_pagsPDF.nemo_action', en la carpeta (oculta)…
/home/[usuario]/.local/share/nemo/actions/


Pero, naturalmente, necesitaríamos el script ‘ExtraerPagPDF.sh’ que se menciona ahí...
Pues nada, hagamos algo elegante: acordándome de mis aventuras de scripting con ‘Zenity’, podría ser (para mi caso, como usuario ‘doc’), este tan sencillo (que guardaría, con nombre ExtraerPagPDF.sh, en el directorio raiz (donde se abre, por defecto el terminal) de mi /home:
#!/bin/bash
DESDE=$(zenity --entry --title="Pág. inicial" --text="Iniciar en página...")
HASTA=$(zenity --entry --title="Pág. final" --text="Terminar en página...")
pdftk A="$1" cat 'A'$DESDE-$HASTA output "/home/doc/Escritorio/EXTRAIDO.PDF"

Este script, que se lanza, como se ve, desde la 'nemo_action que aparece en el menú contextual de Nemo (botón derecho ratón...) me crea el archivo ‘EXTRAIDO.PDF’ en mi Escritorio. (Y ahí ya se verá lo que hago con él: ponerle un nuevo nombre mas significativo, guardarlo en otra carpeta…)  


 En fin, pues esto es todo lo que se me ocurre sobre extraer páginas de un archivo pdf, veo que no pude salirme de mi línea de estas semanas, lo de los ‘scripts para torpes’...

2 comentarios:

  1. Estoy leyendo tus aportes, muchas gracias por compartir. Me gustan tus explicaciones. Encontre la manera de instalar office 2010 en linux mint con un programa llamado crossover. No encuentro es como aplicarle las APA7 edicion. Lo hice en windows pero en linux no encuentro donde quedo la carpeta styles al instalar el office. Tengo el archivo y solo seria copiarlo pero no he podido. Te agradeceria alguna ayuda con esto.

    ResponderEliminar
  2. pues te agradezco tus comentarios pero, respecto al tuyo... me temo que no tiene nada que ver con la entrada del Blog donde lo incorporas... y esto es un Blog, no un foro.
    Respecto a tu pregunta específica pues lo siento, ni idea, hace 15 años que no uso Office... y además nunca he usado crossover, ni similares, para intentar hacer funcionar en Linux programas creados para correr en Windows.

    ResponderEliminar