dimecres, 13 d’octubre de 2010

#shell #informàtica Unir fitxers PDF que comparteixen prefix

Si teniu un directori on hi ha fitxers PDF de l'estil PREFIX_XXX.pdf, PREFIX_YYY.pdf,... i voleu obtenir un fitxer PDF resultant que sigui PREFIX.pdf, és a dir, un fitxer que sigui el resultat de juntar tots els que tenen el mateix prefix i generar un fitxer de sortida que s'anomeni només amb aquest prefix, aquí va una forma de fer-ho, per poder automatitzar el procés al shell de Linux.

Suposarem per al cas pràctic que el prefix se separa de la resta de nom de fitxer per un subratllat "_". Imaginem que el prefix en aquest cas és doc, i que tenim doc_0001.pdf, doc_0002.pdf, i doc_0003.pdf. Volem que rel resultat sigui doc.pdf, contenint la unió de doc_0001.pdf, doc_0002.pdf i doc_0003.pdf.

Obtenció de tots els prefixos diferents en un directori

En aquesta proposta de solució s'utilitza awk i pdftoolkit. Es crea un fitxer awk amb el següent contingut:


BEGIN {FS="_"} 
{
printf("%s",$1);
print ("");}

Si s'anomena extreu_prefix.awk, amb awk -f extreu_prefix.awk input es filtrarà i s'obtindrà una llista de prefixos trobats al fitxer d'entrada input.

Unió de PDFs en un

pdftoolkit permet, a partir d'un conjunt de fitxers PDF d'entrada, generar-ne un de sortida que els contingui -entre altres opcions-. És tan fàcil com fer:
pdftk fitxers_entrada output fitxer_sortida

Tot junt

Un cop això ja està clar, per executar tot junt, l'obtenció de tots els fitxers PDF amb un prefix comú i generar un PDF per a cada prefix trobat en un directori, només calen aquestes dues línies:

for pdf in `ls *.pdf | awk -f extreu_prefix.awk | sort -u`; do pdftk $pdf*.pdf output $pdf.pdf; done
rm *_*.pdf

La primera línia obté una llista de fitxers PDF del directori, els passa a awk per extreure una nova llista amb els prefixos trobats (repetits), llista que s'ordena eliminant repetits, i que s'itera per generar per cada un dels prefixos un PDF únic. Cal fixar-se que a pdftk se li passa com primer argument, $pdf*.pdf, és a dir que, en el cas de l'exemple, se li passaria doc*.pdf, de forma que la crida manual a pdftk seria pdftk doc*.pdf output doc.pdf, i de forma anàloga si hi hagués altres prefixos dins del directori.

La segona línia elimina els fitxers PDF inicials per deixar només els nous.


Creative Commons License + GNU FDL