#1 Le 16/04/2017, à 14:38
- bergeronnette
[résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonjour,
Je crée des fichiers pdf avec Latex et le paquet datatool ou csvsimple. J'ai un fichier csv avec les en-têtes classiques (nom, prenom, ddn, numAdh, ...).
J'aimerais découper ce fichier pour pouvoir envoyer avec mailmerge le fichier pdf qui correspond au bénévole.
J'aimerais aussi comprendre le code donc je vais poser plusieurs questions quant à l'idée que je me fais de la résolution du problème.
Technique
Comment découper un fichier pdf toutes les X pages ? réussi
Comment compter le nombre de pages d'un fichier pdf ? réussi
Comment compter le nombre de lignes d'un fichier csv ?réussi
Comment calculer X = pages/ (lignes-1) ?réussi
Comment renommer le fichier individuel sous la forme fichier-i ou i est un nombre entier ? réussi
Pour créer le script suffit-il de copier l'ensemble des lignes de codes ?réussi
Questions dont j'ignore la faisabilité
Est-il possible de lire, dans le fichier csv, la colonne c de la ligne l pour s'en servir comme nom de fichier ? réussi
Je fais en sorte que le nombre de pages soit un multiple du nombre d'adhérents mais si je n'ai pas fait attention à la mise en page, est-il possible de compter le nombre de pages du fichier individuel d'un adhérent et de couper ces pages en le renommant avec le nom ?
Je m'explique : sur le fichier pdf il y a le nom de chaque adhérent inscrit sur la première page (par exemple M. Y est convoqué pour l'ag).
Si la question a est possible, peut-on enregistrer en mémoire la valeur lue puis lire le fichier pdf en comparant/cherchant la même valeur (page qui débute le fichier individuel puis chercher le début du fichier individuel donc le nom suivant sur le fichier csv et couper à la page précédente. pas encore réussi
Auriez-vous un lien internet/ebook/livre (type Latex pour l'impatient) qui recense les commande unix et très bien illustré avec des exemples ?
Je vous remercie.
Ici une mise à jour réussi grâce aux aides.
#!/bin/bash
pdfFile=$1
listeCSV=$2
numberOfPages=$(pdftk "$pdfFile" dump_data output | grep NumberOfPages| awk '{print $2}')
numberOfRows=$(awk 'END {print NR}' $listeCSV)
chemin=$(pwd)
mkdir $chemin/pdfuniques
pas=$((numberOfPages/(numberOfRows -1)))
limite=$((numberOfRows -1))
for i in $(seq 1 $limite)
do
ligne=1+$i
fileName=$(awk -F, 'NR == '$ligne' {print $4 $2 $3}' $listeCSV)
pdftk "$pdfFile" cat $((1+(i-1)*pas)) $((i*pas)) output $chemin/pdfuniques/"$fileName".pdf
done
#sources et aides
#http://forum.ubuntu-fr.org/viewtopic.php?pid=21755566#p21755566
#http://www.funix.org/fr/unix/awk.htm
#http://www.shellunix.com/awk.html
#http://www.itgo.me/a/x9023393904195470142/how-to-write-shell-script-for-finding-number-of-pages-in-pdf
#https://www.developpez.net/forums/d43471/general-developpement/programmation-systeme/linux/option-nr-commande-awk/
Dernière modification par bergeronnette (Le 09/07/2017, à 11:29)
Hors ligne
#2 Le 22/04/2017, à 00:13
- Arbiel
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonsoir
Je ne sais pas répondre à toutes tes questions, mais je sais que pdfsam sait parfaitement découper un fichier pdf,
Mais il me semble difficile de retrouver la page d'un fichier pdf dans lequel se trouve une chaîne de caractères donnée.
Tu disposes également de pdftk pour découper un fichier pdf, en compter les pages, extraire n pages à partir de la page p, etc… Avec cet outil, j'ai écrit un script qui réintercale derrière chaque recto le verso correspondant lorsque les rectos et les versos ont été obtenus en deux paquets de pages à partir d'une machine sans option recto-verso.
Quant au découpage ou au traitement de lignes d'un fichier cvs, tu disposes de grep et de sed pour retrouver des informations que tu peux utiliser comme bon te semble, et en particulier créer un fichier avec le nom que tu as trouvé.
Je te conseille donc de prendre connaissance de ces quatre logiciels, pdfsam, pdftk, grep et sed, puis de revenir poser des questions précises si les pages du manuel ne te permettent pas de t'en sortir.
Arbiel
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#3 Le 02/07/2017, à 16:20
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonjour,
Après pas mal de recherches, surtout sur la façon de trouver les mots clés et formuler la requête, j'ai trouvé ceci pour compter les pages :
#/bin/bash
#http://www.itgo.me/a/x9023393904195470142/how-to-write-shell-script-for-finding-number-of-pages-in-pdf
pdfFile=$1
echo "Processing $pdfFile"
numberOfPages=$(pdftk "$pdfFile" dump_data output | grep NumberOfPages| awk '{print $2}')
echo "The number of pages is: $numberOfPages"
maintenant je bloque sur une boucle for (http://www.tuteurs.ens.fr/unix/shell/boucle.html) pour tester une incrémentation de 4 en 4
#!/bin/sh
# Fichier "50fichiers-for"
# la commande "seq a b" compte de a à b
#for numero in `seq 1 50`
# do touch fichier"$numero"
#done
for k in {1..4..20}
do touch fichier"$k"
done
Hors ligne
#4 Le 02/07/2017, à 16:36
- MicP
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonjour
…une incrémentation de 4 en 4…
… seq [OPTION]... PREMIER INCRÉMENT DERNIER …
michel@debg53sw:~$ for k in $(seq 4 4 16); do echo $k; done
4
8
12
16
michel@debg53sw:~$
=======
michel@debg53sw:~$ cat fich.csv
Sexe,Prénom,Année de naissance
M,Alphonse,1932
F,Béatrice,1964
F,Charlotte,1988
michel@debg53sw:~$
michel@debg53sw:~$ awk 'END {print NR}' fich.csv # Nombre de lignes dans fich.csv
4
michel@debg53sw:~$
michel@debg53sw:~$ awk -F, 'NR == 3 {print $2}' fich.csv # champs séparés par des virgules, ligne N°3, champ N°2
Béatrice
michel@debg53sw:~$
Dernière modification par MicP (Le 02/07/2017, à 16:56)
Hors ligne
#5 Le 02/07/2017, à 16:44
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
OK
je viens de comprendre quelque chose : en ligne de commande il faut ajouter ; mais pas en mode script
#!/bin/sh
for k in `seq 1 4 20`
do echo "$k"
done
Je vais essayer de couper un pdf toutes les 4 pages en renommant fichier1.pdf,fichier2.pdf ...
Hors ligne
#6 Le 02/07/2017, à 16:59
- pingouinux
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonjour,
Autre façon d'incrémenter de 4 en 4 :
$ echo {1..20..4}
1 5 9 13 17
Ajouté :
Et pour compter les lignes d'un fichier :
wc -l fich.csv
Dernière modification par pingouinux (Le 02/07/2017, à 17:04)
Hors ligne
#7 Le 02/07/2017, à 17:09
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Merci pour ces solutions.
Vous écrivez trop vite pour que je puisse prendre le temps de faire mes tests et de chercher à comprendre.
Hors ligne
#8 Le 02/07/2017, à 18:12
- LeoMajor
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
bonjour,
pdfseparate, diviser page/page
pdfseparate sample.pdf sample-%d.pdf
pdfunite, fait le contraire, fusionne
Hors ligne
#9 Le 03/07/2017, à 07:14
- serged
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Pour le nombre de pages :
NPAGE=`pdfinfo "$FICHIER" |grep "Pages:"|cut -c 17-`
Ça marche bien et c'est plus simple...
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#10 Le 03/07/2017, à 08:23
- Brunod
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Sinon, plutôt que de découper et garder des gros fichiers pdf, il est parfois plus simple d'imprimer les pages demandées vers une sortie pdf
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis
Hors ligne
#11 Le 04/07/2017, à 18:07
- Arbiel
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonsoir
Histoire de m'occuper pendant le discours de Philippe, j'ai écrit et testé ce petit script
#!/bin/bash
function pdf_tranche () {
local pdf="${1}" ; # fichier pdf à découper en tranches
local npt="${2}" ; # nombre de pages par tranche
( [ -z "${pdf}" ] || ! [ -s "${pdf}" ] ) && return 1 ;
base="$(basename "${pdf}")";
i=0;
npd=$(pdftk "${pdf}" dump_data 2>/dev/null | grep NumberOfPages | grep -o -E "[[:digit:]]+$");
while [ $((npt * i++)) -lt $((npd)) ]; do
pp=$((npt * (i - 1) + 1));
dp=$((pp + npt - 1));
[ $((dp)) -gt $((npd)) ] && dp=${npd};
echo "pages ${pp} à ${dp} dans /tmp/${i}-${base}";
pdftk A="${pdf}" cat A${pp}-${dp} output /tmp/${i}-${base};
done;
return 0 ;
}
Si tu n'as pas encore écrit l'équivalent, tu peux en faire bon usage. Tu dois au préalable avoir installé pdftk, mais je crois que c'est bien le cas.
Arbiel
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#12 Le 04/07/2017, à 18:58
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonsoir,
Je vais regarder cette solution mais je vais continuer également la mienne juste pour le plaisir de la réussite et de l'apprentissage.
Hors ligne
#13 Le 04/07/2017, à 19:09
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Voilà où j'en suis :
#!/bin/bash
pdfFile=$1
listeCSV=$2
echo "Comptage du nombre de pages du fichier $pdfFile"
numberOfPages=$(pdftk "$pdfFile" dump_data output | grep NumberOfPages| awk '{print $2}')
echo "Le nombre de pages est de : $numberOfPages"
#echo "Comptage version 1 du nombre de lignes"
#numberOfRows=$(wc -l $listeCSV)
#echo "Le nombre de lignes est :$numberOfRows"
echo "Comptage (version 2) du nombre de lignes du fichier $listeCSV"
numberOfRows=$(awk 'END {print NR}' $listeCSV)
echo "Le nombre de lignes est : $numberOfRows"
chemin=$(pwd)
echo "chemin : $chemin"
pas=$((numberOfPages/(numberOfRows -1)))
for k in $(seq 1 pas 120)
do pdftk "$pdfFile" cat $k $((k+1)) output FICHIER"$k".pdf
done
#sources et aides
#http://forum.ubuntu-fr.org/viewtopic.php?pid=21755566#p21755566
#http://www.funix.org/fr/unix/awk.htm
#http://www.shellunix.com/awk.html
#http://www.itgo.me/a/x9023393904195470142/how-to-write-shell-script-for-finding-number-of-pages-in-pdf
Je bloque sur la ligne du calcul du pas.
pas=$((numberOfPages/(numberOfRows -1)))
Hors ligne
#14 Le 04/07/2017, à 23:42
- Arbiel
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonsoir
Je ne peux pas vraiment t'aider, ne sachant pas exactement ce que tu veux définir dans ton fichier .csv (je n'ai pas eu le courage de relire l'ensemble de la discussion).
Peut-être
pas=$((numberOfPages / (numberOfRows -1)))
J'ai ajouté une seconde fonction permettant de découper le fichier non plus en tranches égales, mais en lots dont la première page de chacun constitue la liste des paramètres qui viennent sur la ligne de commande derrière le nom du fichier pdf à découper.
#!/bin/bash
##########################################################
# Découpage d'un fichier pdf en tranches de taille identique, sauf éventuellement la dernière
##########################################################
function pdf_tranche () {
local pdf="${1}" ; # fichier pdf à découper en tranches
local npt="${2}" ; # nombre de pages par tranche
( [ -z "${pdf}" ] || ! [ -s "${pdf}" ] ) && return 1 ;
base="$(basename "${pdf}")";
i=0;
npd=$(pdftk "${pdf}" dump_data 2>/dev/null | grep NumberOfPages | grep -o -E "[[:digit:]]+$");
while [ $((npt * i++)) -lt $((npd)) ]; do
pp=$((npt * (i - 1) + 1));
dp=$((pp + npt - 1));
[ $((dp)) -gt $((npd)) ] && dp=${npd};
echo "pages ${pp} à ${dp} dans /tmp/${i}-${base}";
pdftk A="${pdf}" cat A${pp}-${dp} output /tmp/${i}-${base};
done;
return 0 ;
}
##########################################################
# Découpage d'un fichier pdf en lots définis par les paramètres au delà du nom de fichier
##########################################################
function pdf_lots () {
local pdf="${1}" ; # fichier pdf à découper en lots
( [ -z "${pdf}" ] || ! [ -s "${pdf}" ] ) && return 1 ;
base="$(basename "${pdf}")";
npd=$(pdftk "${pdf}" dump_data 2>/dev/null | grep NumberOfPages | grep -o -E "[[:digit:]]+$");
shift 1;
pp="${1}";
i=0
while shift 1; do
ppp="${1}";
[ -z "${ppp}" ] && dp=${npd} || dp=$((ppp - 1));
[ $((dp)) -gt $((npd)) ] && dp=${npd};
pdftk A="${pdf}" cat A${pp}-${dp} output /tmp/$((++i))-"(pages "${pp}" à "${dp}")"-${base};
[ $((dp)) -ge $((npd)) ] && break 1;
pp="${ppp}";
done;
return 0 ;
}
Arbiel
Dernière modification par Arbiel (Le 04/07/2017, à 23:46)
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#15 Le 05/07/2017, à 08:50
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Je ne peux pas vraiment t'aider, ne sachant pas exactement ce que tu veux définir dans ton fichier .csv (je n'ai pas eu le courage de relire l'ensemble de la discussion).
Je crée des fichiers pdf avec Latex ou pdflatex et le paquet datatool ou csvsimple. J'ai un fichier csv avec les en-têtes classiques (nom, prenom, ddn, numAdh, ...).
J'aimerais découper ce fichier pour pouvoir envoyer avec mailmerge le fichier pdf qui correspond au bénévole.
Dans un premier temps, je teste avec un fichier pdf où le nombre total de pages est un multiple du nombre de bénévoles.
Ensuite, j'essayerai de faire un fichier pdf où le nombre total de pages n'est pas un multiple du nombre de bénévoles (solution proposée par MicP)
La solution proposée bloque pour la boucle. Il y a une histoire de virgule flottante que je n'arrive pas à comprendre et résoudre.
pas=$((numberOfPages/(numberOfRows -1)))
#pas=$(scale=0;"164/82"| bc|awk '{print $2}')
#pas=$(scale=0 | "164/82"|bc -l)
for k in $(seq 1 pas $numberOfPages)
do pdftk "$pdfFile" cat $k $((k+1)) output FICHIER"$k".pdf
done
Hors ligne
#16 Le 05/07/2017, à 18:45
- MicP
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonsoir
J'ai pas trop la forme, aussi je n'ai pu tout relire,
pas=$((numberOfPages/(numberOfRows -1)))
#pas=$(scale=0;"164/82"| bc|awk '{print $2}')
#pas=$(scale=0 | "164/82"|bc -l)
for k in $(seq 1 $pas $numberOfPages)
do pdftk "$pdfFile" cat $k $((k+1)) output FICHIER"$k".pdf
done
Le problème doit peut-être venir venir du fait que tu avais oublié le $ devant pas
Dernière modification par MicP (Le 05/07/2017, à 18:48)
Hors ligne
#17 Le 05/07/2017, à 20:23
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Le problème doit peut-être venir venir du fait que tu avais oublié le $ devant pas
Merci, comme je ne comprends pas le langage, j'essaye tout ce que je trouve sur internet.
Hors ligne
#18 Le 07/07/2017, à 10:49
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonjour,
je m'approche de la solution presque idéale mais un problème auquel je n'avais pas pensé. Le dossier pdfuniques est créé mais lorsque je relance le script pour un test suivant j'ai un message d'erreur.
J'essaye de faire un test de présence du dossier mais je n'y arrive pas.
chemin=$(pwd)
#echo "chemin : $chemin" #inutile maintenant, fonctionne
# faire un test si il existe rm -r $chemin/pdfuniques #bloque pour test si le dossier est déjà créé
if [ -d $chemin/pdfuniques]; then rm -Rf $chemin/pdfuniques else mkdir $chemin/pdfuniques fi
#mkdir $chemin/pdfuniques
Merci
Dernière modification par bergeronnette (Le 07/07/2017, à 12:37)
Hors ligne
#19 Le 07/07/2017, à 12:49
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
La solution
chemin=$(pwd)
if test -d $chemin/pdfuniques
then rm -Rf $chemin/pdfuniques
fi
mkdir $chemin/pdfuniques
Dernière modification par bergeronnette (Le 07/07/2017, à 12:52)
Hors ligne
#20 Le 09/07/2017, à 11:28
- bergeronnette
Re : [résolu] Couper pdf en plusieurs et renommage incrémenté/différencié
Bonjour,
Je vais considérer ce post comme résolu mais je vais en ouvrir d'autres pour l'amélioration (chercher le fichier pdf et csv de façon automatique avec find...).
Merci pour l'aide.
Hors ligne