Como automatizar este proceso

Imagen de Sanborn
0 puntos

Veréis, la idea es editar los metadatos de unos ficheros PDF, para ello he buscado herramientas similares ( y tan potentes) a por ejemplo EasyTag para mp3, pero no las he encontrado.

Lo que si he encontrado son dos estupendas herramientas en linea de comandos como son pdftk y exiftool

En su día edite los nombres de todos esos ficheros PDF y seguí un patrón como este para ello

Titulo_Autor_Editorial_Año_Edición.pdf

Lo que pretendo es crear un proceso que me lea los nombres de los archivos y me rellene las etiquetas de los metadatos de cada PDF de forma automática (solo los primeros 4 campos).

Sé como hacerlo uno a uno, pero el trabajo seria de chinos, ya que son varios cientos de PDFs.

Ahora, donde me pierdo es si he de crear un shell script o emplear expresiones regulares u otra alternativa (Python, Perl,...)... no tengo apenas conocimientos sobre esos temas y me pierdo... lo que busco es que me orientéis un poco por donde debería tirar para hacer algo así.

Para que os hagáis una idea, de forma individual, los argumentos a dar a cada comando serían así

Para el fichero Titulo_Autor_Editorial_Año_Edicion.pdf

exiftool

$ exiftool -Tittle=Titulo -Author=Autor -Keywords=Editorial -CreateDate=AAAA:MM:DD Titulo_Autor_Editorial_Año_Edicion.pdf

(Como no existe un campo especifico para la editorial, empleo las Keywords)

pdftk (aquí necesitamos un fichero de entrada, lo que implica un paso más, además de un fichero de salida con otro nombre)

$ pdftk Titulo_Autor_Editorial_Año_Edicion.pdf update_info metada.txt output Titulo_Autor_Editorial_Año_Edicion_metadata.pdf

 

La estructura de ese fichero de entrada de datos metada.txt seria algo asi:

InfoKey: Title

InfoValue: Titulo

InfoKey: Author

InfoValue: Autor

InfoKey: Keywords

InfoValue: Editorial

InfoKey: CreateDate

InfoValue: D:AAAAMMDD000000

 

Entiendo que la herramienta más idonea para este caso sería exiftool, el problema es que no sé seguir a partir de aquí. Alguien puede orientarme para poder realizarlo?

Las etiquetas de los metadatos de los PDF, por si alguien tiene curiosidad, son asi

Imagen de neosng
+1
0
-1

Esto es un shell script que utiliza awk, un lenguaje específico para proceso de  textos:

Lo que hace es lo siguiente: lista todos los archivo pdf del directorio actual, y los envía uno a uno a awk.

Awk separa las cadenas con un "_" en el arreglo llamado "etiq", de manera que quedan:

etiq[1] titulo, etiq[2] autor, etiq[3] editorial, etiq[4] año, etiq[5] edicion.pdf (pero este último no parece que lo quieras así que ya está bien)

El problema es formatear el año, no sé qué formato le diste en el fichero asi que lo dejo tal como está, si me pones el formato modifico el script.

Luego envía este arreglo con con los títulos al comando system eque ejecuta el exiftool, si quieres puedes cambiar el comando por "echo" para ver lo que sale antes de ejecutarlo, en caso de los espacios no sé si habrá que ponerle comillas a las etiquetas para que exiftool se lo trague, del palo... -Tittle='lo que sea'.

#!/bin/bash
for i in $(ls *.pdf); do
    echo $i | awk '{split ($0, etiq, "_"); system("exiftool -Tittle=" etiq[1] " -Author=" etiq[2] " -Keywords=" etiq[3] " -CreateDate=" etiq[4] " " $0)}
done

Si necesitas más info ya sabes.

Saludos.

+1
0
-1
Imagen de Sanborn
+1
0
-1

Muchas gracias por tu pronta y acertada respuesta.

He tenido que cambiarlo ligeramente para que me funcionara, al final me queda asi:

#!/bin/bash
for i in $(ls *.pdf); do
    echo $i | awk '{split ($i, etiq, "_"); system("exiftool -Title=" etiq[1] " -Author=" etiq[2] " -Keywords=" etiq[3] " -CreateDate=" etiq[4]":01:01 " $i)}'
done

La fecha era solo el año, asi que en el script meto a mano el mes y el dia a 1 Enero (para que lo trague exiftool), porque solo me interesa el año.

Lo que me queda por resolver es el problema de los espacios en los nombres del fichero (en el campo Titulo por ejemplo), que lo interpreta como dos cadenas distintas.

Lo que si me queda claro, es que me queda mucho por aprender, gracias 

 

+1
0
-1
Imagen de neosng
+1
0
-1

#!/bin/bash
export IFS="&"
for i in $(ls *.pdf); do
    echo $i | awk '{split ($i, etiq, "_"); system("exiftool -Title=" etiq[1] " -Author=" etiq[2] " -Keywords=" etiq[3] " -CreateDate=" etiq[4]":01:01 " $i)}'
done

IFS es el input field separator, ls lo pone entre cada uno de los resultados que obtenga y luego for interpreta los espacios que tengas en el archivo como el mismo archivo y separa las iteracciones por el &. Ahora bien, has de usar un caracter (en este caso &) que no aparezca en ningún archivo, sino for lo cortará de nuevo. Si & no vale prueba ^, o un +, etc..

Se me pasó ponerlo en el script de serie...

Saludos.

+1
0
-1
Imagen de Sanborn
+1
0
-1

Muchas gracias, ahora si que me funciona perfectamente.

Solo tuve que ponerle la opción -b a ls

#!/bin/bash
export IFS="&"
for i in $(ls -b *.pdf); do
echo $i | awk '{split ($i, etiq, "_"); system("exiftool -Title=" etiq[1] " -Author=" etiq[2] " -Keywords=" etiq[3] " -CreateDate=" etiq[4]":01:01 " $i)}'
done

Gracias además por explicar con tanto detalle lo que significaba cada parte del proceso, se agradece y mucho.

Pues me has ahorrado una buena cantidad de trabajo, además de que he aprendido algo más.

Saludos

+1
0
-1