[Résolu][Writer] Arborescence parcourue pour export PDF

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

[Résolu][Writer] Arborescence parcourue pour export PDF

Message par cemoi »

Le Modérateur a écrit : :alerte: Merci de respecter la syntaxe des balises : https://forum.openoffice.org/fr/forum/v ... 295#p27295
Le balisage doit être correctement orthographié (première lettre en majuscule puis le reste en minuscules), le tout entre crochets.
Nous l'avons fait pour vous.
Bonjour suite à ce post: https://forum.openoffice.org/fr/forum/v ... =8&t=47459 j'ai ajouté une boucle pour que la macro renome le repertoire avec son nom existant et qu'elle y rajoute le mot eleve. Mais ce n'est pas ce que je veux exactement.... Je cherche à ajouter eleve dans le nom existant de tous les fichiers *.odt sur toute une arborescence pour en suite générer le pdf cours_echelles_eleve.pdf

En fait je me demande si je m'y prend bien... par la suite je veux en faire un .oxt via la GUI (onglet library) et l'importer sur le serveur avec un

Code : Tout sélectionner

unopkg add maMacro.oxt
ce qui me permettra d'appeler libo en ligne de commande de d'appliquer cette extension sur tous mes fichiers odt.

Code : Tout sélectionner

post; sub main

repBase="/home/cemoi/owncloud/perso/test_macro/"
fichier = dir(repBase+"*eleve*.odt")
while fichier<>""
	call traiteFichier(repBase+fichier)
	fichier = dir()
wend

end sub

    Option Explicit
    
     Sub traiteFichier()
    Dim oDoc as Object, searchDescriptor as Object, resultat as Variant
    Dim i as Integer, range as Object, cursor as Object, valChamp as String
       oDoc = thisComponent
       searchDescriptor = oDoc.createSearchDescriptor()
       With searchDescriptor
          .SearchString = "Texte prof"
          .searchStyles = True
       End With
       resultat = oDoc.findAll(searchDescriptor)
       If resultat.hasElements() Then
          For i = 0 To resultat.Count-1
             range = resultat(i)
             cursor = range.Text.createTextCursor()
             cursor.goToRange(range, false)
             cursor.collapsetostart()
             cursor.goRight(len(range.string), true)
             valChamp = String(len(range.string),"_")
             cursor.String = valChamp
          Next i   
       EndIf
    End Sub
Merci pour votre soutient!
Dernière modification par cemoi le 30 juin 2015 19:41, modifié 1 fois.
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Writer] renommer les fichiers en y ajoutan eleve

Message par Piaf »

Bonjour
cemoi a écrit :Je cherche à ajouter eleve dans le nom existant de tous les fichiers *.odt
As-tu tester
Aide en ligne a écrit :Instruction Name [Exécution]
Renomme un fichier ou répertoire existant.
Syntaxe :
Name OldName As String As NewName As String
Paramètres :
OldName, NewName : expression au format chaîne de caractères indiquant le nom de fichier, chemin d'accès compris. Vous pouvez également utiliser la notation URL.
dans ta boucle ?
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

Je m'excuse mais je me suis mal exprimé...
je veux reproduire ce que je faisais avec find en shell en fait pour que tout soit dans la macro et surtout que pour que cela puisse servir à d'autres. Je m'explique: si je fais la recherche le filtrage et le renomage des fichiers avec le shell j'aurais une macro qui ne peux pas faire tout le travail à elle seule, elle perd donc de son intérêt (je parle pour l'interet commun dans l'optique d'être réutilisé).

Avant de me lancer dans cette macro je faisais un:

Code : Tout sélectionner

find /home/cemoi/Documents/cible -type f -mtime -1 -iname "*eleve*.odt" -execdir libreoffice --headless --convert-to pdf '{}' \;
Ca veut dire: cherche et trouve dans toute l'arborescence de /home/cemoi/Documents/cible tous les fichiers modifié il y a 24h ou moins de 24h ayant les caractéres (sans prendre en compte la casse) eleve dans leur nom et ayant comme extension odt puis ça passe les resultats à libreoffice qui est exécuté en -headless pour convertir en pdf tous les fichiers trouvé.

Attention ici chaque pdf est mis au même endroit que le fichier source avec lequel il est généré.

Comme on a des problèmes pour tenir à jour tous les fichiers eleves (et ça prend aussi pas mal de temps) je me suis dis qu'il serai bon que cela soit automatiser... en remplaçant le styleprof par des ___ comme cela il ne resterai plus qu'à générer le pdf pour que cela sorte le document eleve.


pour le moment je fais la recherche de tous les fichiers odt contenant le mot cours puis j'y ajoute le suffix _eleve puis je le copie comme ça je conserve ma source voila le code:

Code : Tout sélectionner

#! /bin/bash

find /home/cemoi/Documents/bac/seconde/ -type f -iname "*cours*.odt" |
    while read name
    do
        new_name=$(echo $name|sed 's/\.odt$/_eleve.odt/')
        if [ "$name" -nt "$new_name" ]
        then
            cp "$name" "$new_name"
        fi
    done
c'est exactement ce que je voudrai faire en basic... je voudrai en suite y mettre le code de la macro qui remplace le style prof par des __ sur tous les fichiers odt contenant le mot eleve et l'exporter en pdf. Pour l'export en pdf je n'ai pas besoin d'option particulières et je travail deja sur la macro mais je pense que cela fera l'objet d'un autre sujet.

Pour le moment je cherche à faire ce que je fais en shell en basic... quand toutes les macros seront faite je maitrais tout dans la meme macro et je l'exporterai en .oxt d'ou l'interet de tout faire en basic.
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par Piaf »

Bonsoir
A tester

Code : Tout sélectionner

Global monTab() as String
Sub CopierFichier
Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
	Chemin = ConvertToURL("/home/cemoi/Documents/bac/seconde/")
	NomFichier = Dir(Chemin & "Cours*.odt")
	X = 0
	Do While NomFichier <> ""
		Fichier = Split(NomFichier,".")
		NewName = Fichier(0) & "_eleve.odt"
		reDim Preserve monTab(X)
		monTab(X) = Chemin & NewName
		Filecopy Chemin & NomFichier, Chemin & NewName
		NomFichier = Dir
		X = X + 1
	Loop
	RemplacerStyle
End Sub

Sub RemplacerStyle()
Dim oDocument as Object, searchDescriptor As Object
Dim Args(0) as New com.sun.star.beans.PropertyValue
Dim i as Integer
	Args(0).Name = "Hidden"
	Args(0).Value = True
	For i = 0 to UBound(monTab)
		oDocument = StarDesktop.loadComponentFromURL(monTab(i), "_blank", 0, Args() )
		searchDescriptor = oDocument.createReplaceDescriptor
		With searchDescriptor
			.SearchString = "Texte prof"
			.ReplaceString = "Blanc"
			.SearchStyles = True
		End With
		oDocument.replaceAll(searchDescriptor)
		oDocument.Store
		oDocument.Close(True)
	Next i	
End Sub
Attention il n'y a pas de gestion d'erreur.
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

wow! merci beaucoup je vais tester tout ça!

le script shell a été amélioré/consolidé:

Code : Tout sélectionner

#! /bin/bash
IFS=

find /home/cemoi/Documents/cible \
    -type f \
    -iname '*cours*.odt' \
    -not -iname '*_eleve.odt' \
    -print0 |
    while read -rd '' name
    do
        new_name=$(echo $name|sed 's/\.odt$/_eleve.odt/')
        if [ "$name" -nt "$new_name" ]
        then
            cp "$name" "$new_name"
        fi
    done
il souffrait d'un gros défaut. Il
allait aussi copier les fichiers dont le noms est de la forme
*cours*_eleve.odt vers *cours*_eleve_eleve.odt. Donc en rajoutant un
test à find ça permet d'éliminer d'office les fichiers dont le nom
correspond à *cours*_eleve.odt. Il suffit de rajouter le test :

Code : Tout sélectionner

-not -iname *_eleve.odt

Code : Tout sélectionner

IFS=
permet de gérer les problèmes d'échappement sur les caractères
Pour la macro en basic je vais faire les tests ce week-end et je vous tiens au courant!
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

Bon je n'arrive pas à faire tourner la première partie de la macro... le problème c'est que ça retourne aucune erreur et ça ne semble rien faire... du coup je ne sais pas par ou creuser :/

Je précise que je suis sur debian (linux) ça peut peut être jouer?
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par Piaf »

Bonsoir
cemoi a écrit :Bon je n'arrive pas à faire tourner la première partie de la macro...

Code : Tout sélectionner

Option Explicit
Global monTab() as String

Sub CopierFichier
Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
Dim X as Integer
	Chemin = ConvertToURL("/home/cemoi/Documents/bac/seconde/")'le chemin est à adapter à l'emplacement des fichiers
	NomFichier = Dir(Chemin & "Cours*.odt")
	X = 0
	Do While NomFichier <> ""
		Fichier = Split(NomFichier,".")
		NewName = Fichier(0) & "_eleve.odt"
		reDim Preserve monTab(X)
		monTab(X) = ConvertToURL(Chemin & NewName)
		Filecopy ConvertToURL(Chemin & NomFichier), monTab(X)
		NomFichier = Dir
		X = X + 1
	Loop
	RemplacerStyle
End Sub

Sub RemplacerStyle()
Dim oDocument as Object, searchDescriptor As Object
Dim Args(0) as New com.sun.star.beans.PropertyValue
Dim i as Integer
	Args(0).Name = "Hidden"
	Args(0).Value = True
	For i = 0 to UBound(monTab)
		oDocument = StarDesktop.loadComponentFromURL(monTab(i),"_blank",0,Args())
		searchDescriptor = oDocument.createReplaceDescriptor
		With searchDescriptor
			.SearchString = "Texte prof"
			.ReplaceString = "Blanc"
			.SearchStyles = True
		End With
		oDocument.replaceAll(searchDescriptor)
		oDocument.Store
		ExportPDF(oDocument,monTab(i))
	Next i
End Sub

Sub ExportPDF(oDoc as Object,monFichier as String)
Dim oURL as String
Dim Args(0) as New com.sun.star.beans.PropertyValue
	oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf"
	Args(0).Name = "FilterName"
	Args(0).Value = "writer_pdf_Export"
	oDoc.storeToURL(oUrl,args())
	oDoc.Close(True)
	Kill(monFichier)
	MsgBox("Le fichier " & ConvertFromURL(oURL) & " à été créé")
End Sub
J'ai supprimé les images et les versions du fichier d'origine.
Je suis aussi sous Linux :D
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

Bonjour,
je n'arrive pas à la faire fonctionner j'ai trituré mais je m'y perds :( j'ai pas mal lu c'est pour ça que je ne répond pas vite :)

Quand j'execute le code dans l'api de libo (4.3.3 sur debian jessie) le debut se "déroule bien" mais ça ne fait pas le job... aucun message d'erreur mais ça a l'aire de ne rien faire.


à la ligne

Code : Tout sélectionner

 ExportPDF(oDocument,monTab(i))
ça retourne l'erreur
Variable non définie
j'ai donc cherché à comprendre le sens. Ce que j'ai compris c'est que l’option de déclaration obligatoire des
variables

Code : Tout sélectionner

Option Explicit
signale que quelque part sur la ligne en erreur, une variable n’a pas été déclaré préalablement... Ok alors j'ai pensé à une erreur de frappe mais à priori non.

A la ligne

Code : Tout sélectionner

MsgBox("Le fichier " & ConvertFromURL(oURL) & " à été créé")
c'est ce qui va s'afficher dans la console? Vu que c'est en environnement sans serveur x ne faut il pas utiliser un fichier texte (log) ouvert en append

Code : Tout sélectionner

open monFichier for append as #1 print #1, "Le fichier " & ConvertFromURL(oURL) & " à été créé" close(1)
?

Dans la seconde partie du code j'ai remplacer la méthode de remplacement, je trouve que remplacer par des ___ est plus pratique pour les élèves.

Le script modifié que j'ai actuellement:

Code : Tout sélectionner

Option Explicit
Global monTab() as String

Sub CopierFichier
Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
Dim X as Integer
   Chemin = ConvertToURL("/home/cemoi/Documents/bactma/seconde/")'le chemin est à adapter à l'emplacement des fichiers
   NomFichier = Dir(Chemin & "Cours*.odt")
   X = 0
   Do While NomFichier <> ""
      Fichier = Split(NomFichier,".")
      NewName = Fichier(0) & "_eleve.odt"
      reDim Preserve monTab(X)
      monTab(X) = ConvertToURL(Chemin & NewName)
      Filecopy ConvertToURL(Chemin & NomFichier), monTab(X)
      NomFichier = Dir
      X = X + 1
   Loop
   RemplacerStyle
End Sub

Sub RemplacerStyle()
Dim oDoc as Object, searchDescriptor as Object, resultat as Variant
Dim i as Integer, range as Object, cursor as Object, valChamp as String
   oDoc = thisComponent
   searchDescriptor = oDoc.createSearchDescriptor()
   With searchDescriptor
      .SearchString = "Texte prof"
      .searchStyles = True
   End With
   resultat = oDoc.findAll(searchDescriptor)
   If resultat.hasElements() Then
      For i = 0 To resultat.Count-1
         range = resultat(i)
         cursor = range.Text.createTextCursor()
         cursor.goToRange(range, false)
         cursor.collapsetostart()
         cursor.goRight(len(range.string), true)
         valChamp = String(len(range.string),"_")
         cursor.String = valChamp
      Next i   
   EndIf
    ExportPDF(oDocument,monTab(i))
End Sub

Sub ExportPDF(oDoc as Object,monFichier as String)
Dim oURL as String
Dim Args(0) as New com.sun.star.beans.PropertyValue
   oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf"
   Args(0).Name = "FilterName"
   Args(0).Value = "writer_pdf_Export"
   oDoc.storeToURL(oUrl,args())
   oDoc.Close(True)
   Kill(monFichier)
   MsgBox("Le fichier " & ConvertFromURL(oURL) & " à été créé")
End Sub
Merci pour votre aide! En ce moment je lis beaucoup et ça prend énormément de temps en fait...
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

La derniere version de la macro, il ya des ommentaires dedans pour m'aider à tout comprendre...

Code : Tout sélectionner

Option Explicit
'LG Global monTab() as String
dim monTab() as String
 
Sub CopierFichier
Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
Dim X as Integer
 
' LG initialise
Redim monTab(0)
 
   Chemin = ConvertToURL("/home/cemoi/Documents/bactma/seconde/")'le chemin est à adapter à l'emplacement des fichiers
   NomFichier = Dir(Chemin & "Cours*.odt")
   X = 0
   Do While NomFichier <> ""
      Fichier = Split(NomFichier,".")
      NewName = Fichier(0) & "_eleve.odt"
     'LG
     X = X +1
'      reDim Preserve monTab(X)
        redim Preserve monTab(1 to X)
      monTab(X) = ConvertToURL(Chemin & NewName)
      Filecopy ConvertToURL(Chemin & NomFichier), monTab(X)
      NomFichier = Dir()
     ' LG inutile X = X + 1
   Loop
   RemplacerStyle
End Sub
 
Sub RemplacerStyle()
Dim oDocument as Object, searchDescriptor As Object
Dim Args(0) as New com.sun.star.beans.PropertyValue
Dim i as Integer
   Args(0).Name = "Hidden"
   Args(0).Value = True 'LG essaye dejà avec false
 
FOR i=1 to UBound(monTab)
 'LG  For i = 0 to UBound(monTab)
      oDocument = StarDesktop.loadComponentFromURL(monTab(i),"_blank",0,Args())
      searchDescriptor = oDocument.createReplaceDescriptor
      With searchDescriptor
         .SearchString = "Texte prof"
         .ReplaceString = "Blanc"
         .SearchStyles = True
      End With
      oDocument.replaceAll(searchDescriptor)
      oDocument.Store()
      ExportPDF(oDocument,monTab(i))
   Next i
End Sub
 
Sub ExportPDF(oDoc as Object,monFichier as String)
Dim oURL as String
Dim Args(0) as New com.sun.star.beans.PropertyValue
' Cemoi: que contient monFichier? à première vue c'est vide!
   oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf"
   Args(0).Name = "FilterName"
   Args(0).Value = "writer_pdf_Export"
   oDoc.storeToURL(oUrl,args())
   oDoc.Close(True)
   Kill(monFichier)
   MsgBox("Le fichier " & ConvertFromURL(oURL) & " à été créé")
End Sub
à la ligne oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf" ça retourne l'argument n'est pas facultatif
Je ne comprends pas ce que contient la variable momFichier on dirait qu'elle est vide! Et je ne comprends pas pourquoi...

Il y a encore du taf...
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par zeguedon »

Bonjour,

Au regard de ton code, ta Sub RemplacerStyle() appelle ExportPDF(oDocument,monTab(i)) en lui passant comme arguments oDocument monTab(i) or ta Sub ExportPDF s'attend à ce que tu lui passe (oDoc as Object,monFichier as String) en arguments.

A+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

mmm bon il va me falloir relire et comprendre mieux tout ça... le pire c'est que ça tourne sous windows alors que toutes mes bécanes sont sur debian ou freebsd...

Merci pour votre aide mais là je suis un peu perdu.
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

mmm j'ai cru que la première partie de la macro traitée le repertoire cible de façon recursive mais non... Du coup sur un seul fichier la macro marche effectivement. par contre effectivement ça prend en compte la casse alors que dans mon script shell j'utilise find avec l'option -iname pour ne pas prendre en compte la casse.

Pour gérer le répertoire en recursif j'ai vu une macro mais elle date de 2007... es que c'est toujours valable ou es que ce n'est plus un bon exemple?

https://forum.openoffice.org/fr/forum/v ... =15&t=6313
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par luky-luke »

Bonjour
cemoi a écrit :j'ai cru que la première partie de la macro traitée le repertoire cible de façon recursive mais non
mais si !
cemoi a écrit :e ne comprends pas ce que contient la variable momFichier on dirait qu'elle est vide! Et je ne comprends pas pourquoi...
La variable monFichier est vide. Le symbole étoile dans la ligne suivante est mal placé.
NomFichier = Dir(Chemin & "Cours*.odt")
il doit précéder l’expression recherchée, la syntaxe correct est la suivante
NomFichier = Dir(Chemin & "*Cours.odt")
le code complet corrigé, à tester.

Code : Tout sélectionner

Option Explicit
public monTab() as String

Sub CopierFichier
Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
Dim X as Integer

Chemin = ConvertToURL("/home/cemoi/Documents/bactma/seconde/")'le chemin est à adapter à l'emplacement des fichiers
NomFichier = Dir(Chemin & "*Cours.odt")
X = 0
	Do While NomFichier <> ""
		Fichier = Split(NomFichier,".")
		NewName = Fichier(0) & "_eleve.odt"
		redim Preserve monTab(X)
		monTab(X) = ConvertToURL(Chemin & NewName)
		Filecopy ConvertToURL(Chemin & NomFichier), monTab(X)
		NomFichier = Dir()
		X = X + 1
	Loop
	RemplacerStyle
End Sub

Sub RemplacerStyle()
Dim oDocument as Object, searchDescriptor As Object
Dim Args(0) as New com.sun.star.beans.PropertyValue
Dim i as Integer
Args(0).Name = "Hidden"
Args(0).Value = True 'LG essaye dejà avec false

	FOR i = 0 to UBound(monTab)
		oDocument = StarDesktop.loadComponentFromURL(monTab(i),"_blank",0,Args())
		searchDescriptor = oDocument.createReplaceDescriptor
			With searchDescriptor
				.SearchString = "Texte prof"
				.ReplaceString = "Blanc"
				.SearchStyles = True
			End With
		oDocument.replaceAll(searchDescriptor)
		oDocument.Store()
		ExportPDF(oDocument,monTab(i))
	Next i
End Sub

Sub ExportPDF(oDoc as Object,monFichier as String)
Dim oURL as String
Dim Args(0) as New com.sun.star.beans.PropertyValue
    ' Cemoi: que contient monFichier? à première vue c'est vide!
	oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf"
	Args(0).Name = "FilterName"
	Args(0).Value = "writer_pdf_Export"
	oDoc.storeToURL(oUrl,args())
	oDoc.Close(True)
	Kill(monFichier)
	MsgBox("Le fichier " & ConvertFromURL(oURL) & " à été créé")
End Sub
Cordialement
Luke
LibO 7.4.7.2 Raspberry pi et Libo 7.6.5.2 LinuxMint 22
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

Bonjour,
il y a toujours un problème mais je n'arrive pas à le cibler clairement... quand j'execute la macro sur debian on dirait que rien ne se passe. Effectivement le job n'est pas fait mais il semblerai que ça pédale un peu quand même quand on lance la macro sur une arborescense d'une certaine taille.

Non je confirme la récursivité n'y est pas: l'etat de dir() est global, c'est a dire que l'on peut pas utiliser une boucle dir() dans une boucle dir() la parade, serai de faire une passe en stockant dans un tableau tous les chemins de repertoires avec un dir() puis ensuite boucler sur ce tableau, et ainsi le dir() sur les odt passera en récursif mais je n'arrive pas à comprendre comment appliquer ça dans ma macro... même si je comprends en partie ce qui ne va pas

J'ai voulu mettre en pcj les documents pour illustrer mes propos cela dans l'unique but d'être le plus clair possible mais ça ne passe pas... 500ko et 2mo c'est vraiment trop light. Je me permet de vous mettre un lien avec tous les doc dedans;
Un repertoire avec une arbo de test:

Code : Tout sélectionner

Arbo__de_test/
├── Projet_01
│   ├── Seq_rediger_fiche_debit
│   │   └── Cours_La_fiche_de_debit.odt
│   ├── Seq_rediger_nomenclature_a_plat
│   │   └── Cours_nomenclature_plat.odt
│   └── Seq_terminologie_piece
│       ├── Cours_terminologie_eleve.odt
│       ├── Cours_terminologie_eleve.pdf
│       └── Cours_terminologie.odt
└── Projet_02
    ├── Seq_assemblage_tenon_mortaise
    │   ├── Cours_assemblage_tenon_mortaise_eleve.odt
    │   ├── Cours_assemblage_tenon_mortaise_eleve.pdf
    │   └── Cours_assemblage_tenon_mortaise.odt
    ├── Seq_bois_et_eau
    │   ├── Cours_eau_ds_bois_eleve.odt
    │   ├── Cours_eau_ds_bois_eleve.pdf
    │   ├── Cours_eau_ds_bois.odt
    │   ├── cours_equilibre_hygroscopique_eleve.odt
    │   ├── cours_equilibre_hygroscopique_eleve.pdf
    │   ├── cours_equilibre_hygroscopique.odt
    │   ├── Cours_retractabilite_eleve.odt
    │   ├── Cours_retractabilite_eleve.pdf
    │   └── Cours_retractabilite.odt
    └── Seq_conditions_de_coupe
        ├── frequence_de_rotation
        │   ├── frequence_rotation_eleve.odt
        │   ├── frequence_rotation_eleve.pdf
        │   └── frequence_rotation.odt
        └── vitesse_d_avance
            ├── vitesse_avance_eleve.odt
            ├── vitesse_avance_eleve.pdf
            └── vitesse_avance.odt

10 directories, 23 files
Deux fichiers vidéo qui sont des screencast:

SCREENCAST 01 (Sur debian jessie avec libo 4.3.3.2)

1-Etat du repertoire (poids,nombre de fichiers)
2-Ouverture d'un fichier coursxxx.odt contenant le style Texte prof (texte en bleu)
3-execution macro
4-Vérification de l'état du repertoire

SCREENCAST 02 (Sur debian jessie avec libo 4.3.3.2)
1-Execution d'un partie de la macro (traitement du style Texte prof)
2-Ouverture de la macro en edition (pour montrer un peu le contexte)
3-Montre un echantillon de l'arborecsense à traiter (Ne représente pas 30% de l'arborescense à traiter sur le serveur)


C'est surtout le premier qui montre l'exécution de la macro c'est à ce moment que je me suis aperçu que ça pédalé un peu mais es que ça vient de l'exécution de la macro?... je ne peut rien affirmer.

J'ai testé sous windows7 et ça m'a refusé l'exécution en me spécifiant qu'il faut l'environnement java. J'ai mis une capture d'ecran pour ça. Et là j'ai tilté je me demande si ça vient pas de l'environnement de open jre 7 sur debian... Du coup j'ai supprimé l'avant dernière ligne (celle de la msg box) pour re-testé mais c'est pareil.

Je ne comprends pas pourquoi ça demande du java sous windows alors que la macro n'a rien à voir avec ça... à priori sous ubuntu ça marcherai... mais je n'ai pas de ubuntu pour tester.

Merci pour vos lumières


Le lien pour les documents: http://195.154.13.247/owncloud/index.ph ... ALM8vvmwif
il faut taper libreoffice2014* pour y avoir acces


La dernière version de la macro:

Code : Tout sélectionner

Option Explicit
'LG Global monTab() as String
dim monTab() as String

Sub CopierFichier
Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
Dim X as Integer

' LG initialise
Redim monTab(0)

   Chemin = ConvertToURL("/home/cemoi/Documents/bac/seconde/")'le chemin est à adapter à l'emplacement des fichiers
   NomFichier = Dir(Chemin & "Cours*.odt")
   X = 0
   Do While NomFichier <> ""
      Fichier = Split(NomFichier,".")
      NewName = Fichier(0) & "_eleve.odt"
     'LG 
     X = X +1
'      reDim Preserve monTab(X)
	redim Preserve monTab(1 to X)
      monTab(X) = ConvertToURL(Chemin & NewName)
      Filecopy ConvertToURL(Chemin & NomFichier), monTab(X)
      NomFichier = Dir()
     ' LG inutile X = X + 1
   Loop
   RemplacerStyle
End Sub

Sub RemplacerStyle()
Dim oDocument as Object, searchDescriptor As Object
Dim Args(0) as New com.sun.star.beans.PropertyValue
Dim i as Integer
   Args(0).Name = "Hidden"
   Args(0).Value = True 'LG essaye dejà avec false

FOR i=1 to UBound(monTab)
 'LG  For i = 0 to UBound(monTab)
      oDocument = StarDesktop.loadComponentFromURL(monTab(i),"_blank",0,Args())
      searchDescriptor = oDocument.createReplaceDescriptor
      With searchDescriptor
         .SearchString = "Texte prof"
         .ReplaceString = "Blanc"
         .SearchStyles = True
      End With
      oDocument.replaceAll(searchDescriptor)
      oDocument.Store()
      ExportPDF(oDocument,monTab(i))
   Next i
End Sub

Sub ExportPDF(oDoc as Object,monFichier as String)
Dim oURL as String
Dim Args(0) as New com.sun.star.beans.PropertyValue
   oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf"
   Args(0).Name = "FilterName"
   Args(0).Value = "writer_pdf_Export"
   oDoc.storeToURL(oUrl,args())
   oDoc.Close(True)
   Kill(monFichier)
'la MsgBox ne sert à rien
  ' MsgBox("Le fichier " & ConvertFromURL(oURL) & " à été créé")
End Sub
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26009
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par Dude »

cemoi a écrit :Je ne comprends pas pourquoi ça demande du java sous windows alors que la macro n'a rien à voir avec ça
Quand Java est-il nécessaire à l'exécution ? (dernière ligne)
cemoi a écrit :passera en récursif mais je n'arrive pas à comprendre comment appliquer ça dans ma macro
Direction les suprêmes de code : http://forum.openoffice.org/fr/forum/vi ... =15&t=6313
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

En ce qui concerne la recursivité:

Code : Tout sélectionner

sub general
 
dim listeDirs()
redim listeDirs(0)
indexDir = 0
 
dirBase="/home/toto/titi/"
listeDir(0) = dirBase
 
for r = 0 to ubound(listeDir)
   curDir = listeDir(r)
   chaine = dir(curDir+"*",16) ' le 16 c'est que pour les repertoires
   while chaine<>""
      if chaine <>"." and chaine<>".." then
         indexDir = indexDir + 1
         redim preserve listeDir(0 to indexDir)
         listeDir(indexDir) = curDir+chaine+"/"
      endif
      chaine = dir()
   wend
next r
 
for r = 0 to ubound(listeDir)
    chemin = listeDir(r)
    call CopierFichier(chemin)
next r
 
end sub
c'est un morceau de code que je dois vérifier et intégrer.

Voila le debut du code:

Code : Tout sélectionner

'on construit un tableau dynamique de tous les sous repertoires et ensuite on boucle sur tous les repertoires ainsi trouvés,
'l'astuce est que la premiere boucle for continuera toujours tant que l'on ajouteras des repertoires dans la liste pour 
'justement aller voir leur sous repertoires car le ubound() evolue
'!Penser à adapter l'appel de copieFichier, le reprtoire n'est plus en dur dans cette sub mais passée desormais en argument!

sub general
 
dim listeDirs()
redim listeDirs(0)
indexDir = 0
 
dirBase="/home/cemoi/Docments/bactma/seconde/"
listeDir(0) = dirBase
 
for r = 0 to ubound(listeDir)
   curDir = listeDir(r)
   chaine = dir(curDir+"*",16) ' le 16 ce n'est que pour les repertoires
   while chaine<>""
      if chaine <>"." and chaine<>".." then
         indexDir = indexDir + 1
         redim preserve listeDir(0 to indexDir)
         listeDir(indexDir) = curDir+chaine+"/"
      endif
      chaine = dir()
   wend
next r
 
for r = 0 to ubound(listeDir)
    chemin = listeDir(r)
    call CopierFichier(chemin)
next r
  end sub

'ancien code qui ne traite que dans le repertoire spécifié et non en recursif

   ' Option Explicit
   ' public monTab() as String

   ' Sub CopierFichier
   ' Dim Chemin as String, NomFichier as String, Fichier(), NewName as String
   ' Dim X as Integer
'
   ' Chemin = ConvertToURL("/home/cemoi/Documents/bactma/seconde/Projet_01/Seq_terminologie_piece/")'le chemin est à adapter à l'emplacement des fichiers
   ' NomFichier = Dir(Chemin & "*Cours.odt")
   ' X = 0
      ' Do While NomFichier <> ""
          'Fichier = Split(NomFichier,".")
         'NewName = Fichier(0) & "_eleve.odt"
         ' redim Preserve monTab(X)
         ' monTab(X) = ConvertToURL(Chemin & NewName)
         ' Filecopy ConvertToURL(Chemin & NomFichier), monTab(X)
         ' NomFichier = Dir()
         ' X = X + 1
      ' Loop
      ' RemplacerStyle
   ' End Sub

    Sub RemplacerStyle()
    Dim oDocument as Object, searchDescriptor As Object
    Dim Args(0) as New com.sun.star.beans.PropertyValue
    Dim i as Integer
    Args(0).Name = "Hidden"
    Args(0).Value = True 'LG essaye dejà avec false

       FOR i = 0 to UBound(monTab)
          oDocument = StarDesktop.loadComponentFromURL(monTab(i),"_blank",0,Args())
          searchDescriptor = oDocument.createReplaceDescriptor
             With searchDescriptor
                .SearchString = "Texte prof"
                .ReplaceString = "Blanc"
                .SearchStyles = True
             End With
          oDocument.replaceAll(searchDescriptor)
          oDocument.Store()
          ExportPDF(oDocument,monTab(i))
       Next i
    End Sub

    Sub ExportPDF(oDoc as Object,monFichier as String)
    Dim oURL as String
    Dim Args(0) as New com.sun.star.beans.PropertyValue
        ' Cemoi: que contient monFichier? à première vue c'est vide!
       oURL = Left(monFichier,CInt(Len(monFichier))-3) & "pdf"
       Args(0).Name = "FilterName"
       Args(0).Value = "writer_pdf_Export"
       oDoc.storeToURL(oUrl,args())
       oDoc.Close(True)
       Kill(monFichier)
    End Sub
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26009
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par Dude »

cemoi a écrit :En ce qui concerne la recursivité:
Bis repetitae :
Dude a écrit :Direction les suprêmes de code : http://forum.openoffice.org/fr/forum/vi ... =15&t=6313
Relis ce que je t'écris au lieu de t'obstiner avec Dir :evil:
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

peut être par ce que je n'ai pas fait f5 avant de répondre à mon propre message et du coup je n'ai pas vu le tient...

pour la partie recherche en recursif sans Dir donc;

Code : Tout sélectionner

Option Explicit

Sub Main
Dim sUrl As String
sUrl = ConvertToURL("/home/cemoi/Documents/bactma/seconde/") 'url à adapter

Parcourir(sUrl)

MsgBox "Terminé"
End Sub

Sub Parcourir(sUrl)
Dim sNomFic As String
Dim oSFA as Object
Dim ListeFichiers As Variant

oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")

ListeFichiers = oSFA.getFolderContents(sUrl, True) ' erreure L'argument n'est pas facultatif

for each sNomFic in ListeFichiers
        if oSFA.IsFolder(sNomFic) then         
        else  Parcourir(sNomFic)
                if instr(sNomFic, "cours") > 0 then
                        print sNomFic
                end if
        end if
next sNomFic

End Sub
J'ai commenté sur la ligne ou il y a une erreur, mais je dois pas être loin, ici ça ne fait pas ce que je veux je cherche juste à comprendre comment ça marche ...
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26009
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par Dude »

Un copier coller du code que tu fournis fonctionne sans problème chez moi :
_no_problemo.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par zeguedon »

Bonjour,

Ce que je comprend du massage d'erreur que tu reçois, c'est que tu lances la macro "Parcourir(sUrl)", or c'est la macro "Sub Main" qu'il faut lancer car elle fournit à la macro "Parcourir(sUrl)" la variable sUrl qui lui est nécessaire.

A+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
cemoi
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 15 mai 2010 08:57

Re: [Writer] Renommer les fichiers en y ajoutant élève

Message par cemoi »

bonjour,
oui effectivement, j'en ai pris compte pour la suite.

J'ai terminé toutes les routines pour en suite les "assembler" voila ce que ça donne:

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub Main

	repBase="/home/cemoi/Documents/bac/Projet_01/" 'chemin à adapter
	
	' boucle sur les repertoires et sous repertoires et traitement des fichiers
	call boucleRepertoire(convertToUrl(repBase))

	 msgBox "Fin du traitement"

End Sub

sub boucleRepertoire(sUrl)

	oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
	
	ListeFichiers = oSFA.getFolderContents(sUrl, True)
	
	for each sNom in ListeFichiers
		 if oSFA.IsFolder(sNom) then
		 	call boucleRepertoire(sNom) ' appel recursif
		 else 
    		if endWith(sNom, ".odt") then
				if not endWith(sNom,"_eleve.odt") then
           			if instr(sNom, "cours") > 0 then
           				call traiteFichier(sNom) ' on traite ce fichier
           			end if
    			end if
			endif
	    endif
	next sNom

end sub

function endWith(chaine, cherche)

	endWith = ( right(chaine, len(cherche)) = cherche)

end function

sub traiteFichier(urlFichier)
	
	' ouverture
	doc = starDesktop.loadComponentFromUrl(urlFichier,"_blank",0, array())

	' traitement des styles
	call RemplacerStylePartout2(doc)
	
	' nom de fichier de sortie
	spliter = split(doc.url, ".") ' decoupe la chaine avec les points
	nb = ubound(spliter)
	spliter(nb-1) = spliter(nb-1)+"_eleve"
	
	spliter(nb)="pdf"
	newUrlPdf = join(spliter,".")
	
	spliter(nb)="odt"
	newUrlOdt = join(spliter,".")	
	
	'enregistrement nouveau odt
	doc.storeAsUrl(newUrlOdt, array()) ' aucune option, array vide
	
	' options de l'export pdf
	dim propsFiltre(0 to 0) as new com.sun.star.beans.PropertyValue
	propsFiltre(0).name = "IsSkipEmptyPages"
	propsFiltre(0).value = False	

	dim prop(0 to 1) as new com.sun.star.beans.PropertyValue
	prop(0).name="FilterName"
	prop(0).value = "writer_pdf_Export"
	prop(1).name="FilterData"
	prop(1).value = propsFiltre()
	
	' export pdf
	doc.storeToUrl(newUrlPdf, prop() )
	
	' on ferme le fichier initial sans modification
	doc.close(false)

end sub

Sub RemplacerStylePartout2(MonDocument)

	Dim JeCherche As Object

	JeCherche = MonDocument.createReplaceDescriptor
	
	with JeCherche
	  .SearchString  = "Texte eleve visible"
	  .ReplaceString = "Texte eleve invisible"
	  .SearchStyles = true
	end with
	
	MonDocument.replaceAll(JeCherche)
	
End Sub
Openoffice 3.2/4 sur de multiples postes sous 7
Libreoffice 6.1 sur debian stable (stretch actuellement)
Libreoffice 6.1 sur debian unstable (buster actuellement)