Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

    1. Comment découper un fichier pdf toutes les X pages ? réussi

    2. Comment compter le nombre de pages d'un fichier pdf ? réussi

    3. Comment compter le nombre de lignes d'un fichier csv ?réussi

    4. Comment calculer X = pages/ (lignes-1) ?réussi

    5. Comment renommer le fichier individuel sous la forme fichier-i ou i est un nombre entier ? réussi

    6. Pour créer le script suffit-il de copier l'ensemble des lignes de codes ?réussi

  • Questions dont j'ignore la faisabilité

    1. 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

    2. 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…

"man seq" a écrit :
…
 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 wink


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é

Arbiel a écrit :

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