Comme j'en avais parlé jadis, j'ai besoin de modifier certaines valeurs
dans des documents au format opendocument (odt).
Ne voulant pas lancer openoffice systématiquement, ni être dépendant
d'une plateforme, j'ai essayé ooopy http://ooopy.sourceforge.net/ mais
le projet ne semble pas évoluer et ça ne fonctionne pas bien avec odt,
ça fonctionne plutôt avec sxw (ancien format openoffice). Par contrel
principe reste intéressant, il dézippe le document et l'ouvre avec
elementtree. J'ai donc utilisé cette partie et attaqué le document
directement avec elementtree et ça marche très bien :-)
Comme me l'a suggéré florent manens, j'utilise la notion de "variables"
d'openoffice plutôt que des balise textes $$xxxx, ça évite les problèmes
au cas où la balise texte serait dissociée en interne. (genre
$$xx<b>xx</b>).
C'est très simple et ça marche, voilà un boût de code pour ceux qui
seraient intéressés :
replace = {"nom":form.nom.value,
"prenom":form.prenom.value,
}
o = OOoPy(infile=os.path.join(models_path,form.model.value), outfile=os.path.join(docs_path, form.model.value))
e = o.read('content.xml')
for p in e.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"):
name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name")
for k,v in replace.items():
if k == name:
p.text = v
e.write()
o.close()
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"): name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name") if name in replace: p.text = replace[name]
for f in inzip.infolist(): if f.filename == 'content.xml': s = StringIO() content.write(s) outzip.writestr('content.xml', s.getvalue()) else: outzip.writestr(f, inzip.read(f.filename)) inzip.close() outzip.close()
-- William Dodé - http://flibuste.net
On 27-10-2006, William Dode wrote:
slt,
Comme j'en avais parlé jadis, j'ai besoin de modifier certaines valeurs
dans des documents au format opendocument (odt).
Le même sans OOoPy
from zipfile import ZipFile, ZIP_DEFLATED
from cStringIO import StringIO
from cElementTree import ElementTree, fromstring
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"):
name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name")
if name in replace:
p.text = replace[name]
for f in inzip.infolist():
if f.filename == 'content.xml':
s = StringIO()
content.write(s)
outzip.writestr('content.xml', s.getvalue())
else:
outzip.writestr(f, inzip.read(f.filename))
inzip.close()
outzip.close()
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"): name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name") if name in replace: p.text = replace[name]
for f in inzip.infolist(): if f.filename == 'content.xml': s = StringIO() content.write(s) outzip.writestr('content.xml', s.getvalue()) else: outzip.writestr(f, inzip.read(f.filename)) inzip.close() outzip.close()
-- William Dodé - http://flibuste.net
olive
Salut William,
j'utilise la même technique pour la publication de document à la mise en page très complexe.
Par contre, je n'utilise pas OOpy ni ElemenTree mais la librairie zip standard et LXML (qui reproduit l'API ElementTree sur la base du parseur libxml) que je trouve plus adapté à la manipulation de documents OO car il offre un meilleur support des namespaces, de Unicode et de XPath.
J'ai évalué les 2 solutions (ET et LXML) et les performances sont quasi identiques.
De plus LXML fourni, entre autres, une API XSLT et une nouvelle API XML alternative orientée objet.
Salut William,
j'utilise la même technique pour la publication de document à la mise
en page très complexe.
Par contre, je n'utilise pas OOpy ni ElemenTree mais la librairie zip
standard et LXML (qui reproduit l'API ElementTree sur la base du
parseur libxml) que je trouve plus adapté à la manipulation de
documents OO car il offre un meilleur support des namespaces, de
Unicode et de XPath.
J'ai évalué les 2 solutions (ET et LXML) et les performances sont
quasi identiques.
De plus LXML fourni, entre autres, une API XSLT et une nouvelle API XML
alternative orientée objet.
j'utilise la même technique pour la publication de document à la mise en page très complexe.
Par contre, je n'utilise pas OOpy ni ElemenTree mais la librairie zip standard et LXML (qui reproduit l'API ElementTree sur la base du parseur libxml) que je trouve plus adapté à la manipulation de documents OO car il offre un meilleur support des namespaces, de Unicode et de XPath.
J'ai évalué les 2 solutions (ET et LXML) et les performances sont quasi identiques.
De plus LXML fourni, entre autres, une API XSLT et une nouvelle API XML alternative orientée objet.
William Dode
On 27-10-2006, olive wrote:
Salut William,
j'utilise la même technique pour la publication de document à la mise en page très complexe.
Par contre, je n'utilise pas OOpy ni ElemenTree mais la librairie zip standard et LXML (qui reproduit l'API ElementTree sur la base du parseur libxml) que je trouve plus adapté à la manipulation de documents OO car il offre un meilleur support des namespaces, de Unicode et de XPath.
est-ce que tu aurais un exemple similaire au mien pour que je me rende compte de l'avantage ?
J'ai évalué les 2 solutions (ET et LXML) et les performances sont quasi identiques.
De plus LXML fourni, entre autres, une API XSLT et une nouvelle API XML alternative orientée objet.
-- William Dodé - http://flibuste.net
On 27-10-2006, olive wrote:
Salut William,
j'utilise la même technique pour la publication de document à la mise
en page très complexe.
Par contre, je n'utilise pas OOpy ni ElemenTree mais la librairie zip
standard et LXML (qui reproduit l'API ElementTree sur la base du
parseur libxml) que je trouve plus adapté à la manipulation de
documents OO car il offre un meilleur support des namespaces, de
Unicode et de XPath.
est-ce que tu aurais un exemple similaire au mien pour que je me rende
compte de l'avantage ?
J'ai évalué les 2 solutions (ET et LXML) et les performances sont
quasi identiques.
De plus LXML fourni, entre autres, une API XSLT et une nouvelle API XML
alternative orientée objet.
j'utilise la même technique pour la publication de document à la mise en page très complexe.
Par contre, je n'utilise pas OOpy ni ElemenTree mais la librairie zip standard et LXML (qui reproduit l'API ElementTree sur la base du parseur libxml) que je trouve plus adapté à la manipulation de documents OO car il offre un meilleur support des namespaces, de Unicode et de XPath.
est-ce que tu aurais un exemple similaire au mien pour que je me rende compte de l'avantage ?
J'ai évalué les 2 solutions (ET et LXML) et les performances sont quasi identiques.
De plus LXML fourni, entre autres, une API XSLT et une nouvelle API XML alternative orientée objet.
-- William Dodé - http://flibuste.net
olive
Franchement, tu ne verrais pas beaucoup de différence au niveau du code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de publier également en Japonais ou en Arabe.
Par la suite il m'a été demandé de migrer le code en Java. J'ai utilisé Jython et Dom4J et alors là, surprise, le code est encore plus élégant !
On n'est pas obligé de me croire sur parole mais je trouve que Jython+Dom4j est encore plus pythonique que CPython+ET !
Si seulement Jython s'alignait sur CPython 2.4 ...
Franchement, tu ne verrais pas beaucoup de différence au niveau du
code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de
publier également en Japonais ou en Arabe.
Par la suite il m'a été demandé de migrer le code en Java.
J'ai utilisé Jython et Dom4J et alors là, surprise, le code est
encore plus élégant !
On n'est pas obligé de me croire sur parole mais je trouve que
Jython+Dom4j est encore plus pythonique que CPython+ET !
Si seulement Jython s'alignait sur CPython 2.4 ...
Franchement, tu ne verrais pas beaucoup de différence au niveau du code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de publier également en Japonais ou en Arabe.
Par la suite il m'a été demandé de migrer le code en Java. J'ai utilisé Jython et Dom4J et alors là, surprise, le code est encore plus élégant !
On n'est pas obligé de me croire sur parole mais je trouve que Jython+Dom4j est encore plus pythonique que CPython+ET !
Si seulement Jython s'alignait sur CPython 2.4 ...
Laurent Pointal
Franchement, tu ne verrais pas beaucoup de différence au niveau du code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de publier également en Japonais ou en Arabe.
Par la suite il m'a été demandé de migrer le code en Java. J'ai utilisé Jython et Dom4J et alors là, surprise, le code est encore plus élégant !
On n'est pas obligé de me croire sur parole mais je trouve que Jython+Dom4j est encore plus pythonique que CPython+ET !
Si seulement Jython s'alignait sur CPython 2.4 ...
Autant qu'ils passent directement au 2.5...
Franchement, tu ne verrais pas beaucoup de différence au niveau du
code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de
publier également en Japonais ou en Arabe.
Par la suite il m'a été demandé de migrer le code en Java.
J'ai utilisé Jython et Dom4J et alors là, surprise, le code est
encore plus élégant !
On n'est pas obligé de me croire sur parole mais je trouve que
Jython+Dom4j est encore plus pythonique que CPython+ET !
Si seulement Jython s'alignait sur CPython 2.4 ...
Franchement, tu ne verrais pas beaucoup de différence au niveau du code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de publier également en Japonais ou en Arabe.
Par la suite il m'a été demandé de migrer le code en Java. J'ai utilisé Jython et Dom4J et alors là, surprise, le code est encore plus élégant !
On n'est pas obligé de me croire sur parole mais je trouve que Jython+Dom4j est encore plus pythonique que CPython+ET !
Si seulement Jython s'alignait sur CPython 2.4 ...
Autant qu'ils passent directement au 2.5...
William Dode
On 27-10-2006, olive wrote:
Franchement, tu ne verrais pas beaucoup de différence au niveau du code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de publier également en Japonais ou en Arabe.
Pour l'instant mes besoins actuels peuvent largement se contenter de l'exemple que j'ai fournis...
Par contre, est-ce que tu fais des trucs du genre insérer des tableaux ou des lignes de tableaux ?
-- William Dodé - http://flibuste.net
On 27-10-2006, olive wrote:
Franchement, tu ne verrais pas beaucoup de différence au niveau du
code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de
publier également en Japonais ou en Arabe.
Pour l'instant mes besoins actuels peuvent largement se contenter de
l'exemple que j'ai fournis...
Par contre, est-ce que tu fais des trucs du genre insérer des tableaux
ou des lignes de tableaux ?
Franchement, tu ne verrais pas beaucoup de différence au niveau du code mais plustôt au niveau du résultat surtout lorsqu'il s'agit de publier également en Japonais ou en Arabe.
Pour l'instant mes besoins actuels peuvent largement se contenter de l'exemple que j'ai fournis...
Par contre, est-ce que tu fais des trucs du genre insérer des tableaux ou des lignes de tableaux ?
-- William Dodé - http://flibuste.net
olive
William Dode wrote:
Par contre, est-ce que tu fais des trucs du genre insérer des tableaux ou des lignes de tableaux ?
Je fuis les tableaux comme la peste ! Heureusement je n'ai pas besoin d'en utiliser pour le plus gros projet et j'ai réussi à tout faire avec des cadres flottants ou fixes.
Par contre, pour un autre projet de génération de formulaires j'ai utilisé le type de document OO "XML form" (File -> New -> XML Form Document). La doc de ce module OO est pourrie mais j'ai réussi à m'en sortir avec ce tutoriel: http://www.idealliance.org/proceedings/xml04/papers/110/xml2004_ideadb.html
C'est très bien fait et je n'ai pas eu une ligne de code à écrire pour l'instant.
William Dode wrote:
Par contre, est-ce que tu fais des trucs du genre insérer des tableaux
ou des lignes de tableaux ?
Je fuis les tableaux comme la peste !
Heureusement je n'ai pas besoin d'en utiliser pour le plus gros projet
et j'ai réussi à tout faire avec des cadres flottants ou fixes.
Par contre, pour un autre projet de génération de formulaires j'ai
utilisé le type de document OO "XML form" (File -> New -> XML Form
Document).
La doc de ce module OO est pourrie mais j'ai réussi à m'en sortir
avec ce tutoriel:
http://www.idealliance.org/proceedings/xml04/papers/110/xml2004_ideadb.html
C'est très bien fait et je n'ai pas eu une ligne de code à écrire
pour l'instant.
Par contre, est-ce que tu fais des trucs du genre insérer des tableaux ou des lignes de tableaux ?
Je fuis les tableaux comme la peste ! Heureusement je n'ai pas besoin d'en utiliser pour le plus gros projet et j'ai réussi à tout faire avec des cadres flottants ou fixes.
Par contre, pour un autre projet de génération de formulaires j'ai utilisé le type de document OO "XML form" (File -> New -> XML Form Document). La doc de ce module OO est pourrie mais j'ai réussi à m'en sortir avec ce tutoriel: http://www.idealliance.org/proceedings/xml04/papers/110/xml2004_ideadb.html
C'est très bien fait et je n'ai pas eu une ligne de code à écrire pour l'instant.
Gerard Flanagan
William Dode wrote:
from zipfile import ZipFile, ZIP_DEFLATED from cStringIO import StringIO from cElementTree import ElementTree, fromstring
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"): name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name") if name in replace: p.text = replace[name]
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"):
name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name")
if name in replace:
p.text = replace[name]
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"): name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name") if name in replace: p.text = replace[name]
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"): name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name") if name in replace: p.text = replace[name]
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"):
name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name")
if name in replace:
p.text = replace[name]
for p in content.findall(".//{urn:oasis:names:tc:opendocument:xmlns:text:1.0}variable-set"): name = p.get("{urn:oasis:names:tc:opendocument:xmlns:text:1.0}name") if name in replace: p.text = replace[name]