(NB : posté sur fr.comp.lang.python et python@aful.org)
Hello bonjour
D'abord, le contexte: un client nous demande de passer =~ 3000 documents
words en PDF, en ajoutant quelques mentions au passage...
Bon, pas un problème technique majeur a priori, mais j'ai peu
d'expérience dans ce genre de bricoles (ça fait plusieurs années que je
n'ai pas bossé sous Windows et ma seule expérience avec le format PDF
consiste en la lecture de documents au dit format dans un outil conçu
pour !-)
Une petite recherche sur Google m'a permis de trouver aussi bien des
utilitaires capable de générer du PDF à partir de word (généralement via
Ghostscript ou assimilé -> PDFCreator, qvPdf etc) que des bibliothèques
permettant de créer des PDF par code (reportlab of course) - plus bien
sûr des solutions basées sur OOo.
A priori, j'envisage un petit script Python insérant les mentions qui
vont bien dans les documents words et appelant le convertisseur
(PDFCreator, qvPdf, ???), mais peut-être y-a t'il mieux à faire ?
Comme je suppose que le problème n'est pas nouveau, je serais intéressé
par tout conseil - lien - retour d'expérience sur la question...
Merci d'avance
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb@xiludom.gro'.split('@')])"
Si l'on reste dans l'esprit de python, quelques lignes devraient suffire. A suivre... Bon, les voilà les lignes.
Je n'ai rien inventé, juste piqué des trucs un peu partout. Je dois dire que je ne suis pas impressionné par la doc OOo (l'impression de faire du java ; beuark). N'empêche que ça marche (testé avec XP, OOo 2.0, et une vingtaine de fichiers word). Il faut mettre ça dans "C:Program FilesOpenOffice.org 2.0shareScriptspython", ouvrir OOo avec un document vide, et lancer la macro avec Outils->Macros->Gérer les macros->python. A+ jm
#----------------------------------------------------------------- import uno import unohelper from com.sun.star.beans import PropertyValue
def convDocPdf(): """Conversion fichiers .doc en .pdf""" model = XSCRIPTCONTEXT.getDocument() text = model.Text cursor = text.createTextCursor() desktop = XSCRIPTCONTEXT.getDesktop() rep= 'Z:/u1/jm/dev/python/OOo/' lstFics= ('annuaire province.doc',) for f in lstFics: theSourceFile= rep+f theTargetFile= theSourceFile.replace('doc','pdf') inFile = unohelper.systemPathToFileUrl(theSourceFile) outFile = unohelper.systemPathToFileUrl(theTargetFile) text.insertString(cursor, "%sn"%inFile,0) inProps = (PropertyValue('Hidden',0,True,0),) outProps = (PropertyValue('FilterName',0,'writer_pdf_Export',0),) present = desktop.loadComponentFromURL(inFile,"_blank",0,inProps) present.storeToURL(outFile,outProps) present.dispose() return None#-----------------------------------------------------------------
Si l'on reste dans l'esprit de python, quelques lignes devraient suffire.
A suivre...
Bon, les voilà les lignes.
Je n'ai rien inventé, juste piqué des trucs un peu partout.
Je dois dire que je ne suis pas impressionné par la doc OOo
(l'impression de faire du java ; beuark). N'empêche que ça marche (testé
avec XP, OOo 2.0, et une vingtaine de fichiers word).
Il faut mettre ça dans "C:Program FilesOpenOffice.org
2.0shareScriptspython", ouvrir OOo avec un document vide, et lancer
la macro avec Outils->Macros->Gérer les macros->python.
A+
jm
#-----------------------------------------------------------------
import uno
import unohelper
from com.sun.star.beans import PropertyValue
def convDocPdf():
"""Conversion fichiers .doc en .pdf"""
model = XSCRIPTCONTEXT.getDocument()
text = model.Text
cursor = text.createTextCursor()
desktop = XSCRIPTCONTEXT.getDesktop()
rep= 'Z:/u1/jm/dev/python/OOo/'
lstFics= ('annuaire province.doc',)
for f in lstFics:
theSourceFile= rep+f
theTargetFile= theSourceFile.replace('doc','pdf')
inFile = unohelper.systemPathToFileUrl(theSourceFile)
outFile = unohelper.systemPathToFileUrl(theTargetFile)
text.insertString(cursor, "%sn"%inFile,0)
inProps = (PropertyValue('Hidden',0,True,0),)
outProps = (PropertyValue('FilterName',0,'writer_pdf_Export',0),)
present = desktop.loadComponentFromURL(inFile,"_blank",0,inProps)
present.storeToURL(outFile,outProps)
present.dispose()
return
None#-----------------------------------------------------------------
Si l'on reste dans l'esprit de python, quelques lignes devraient suffire. A suivre... Bon, les voilà les lignes.
Je n'ai rien inventé, juste piqué des trucs un peu partout. Je dois dire que je ne suis pas impressionné par la doc OOo (l'impression de faire du java ; beuark). N'empêche que ça marche (testé avec XP, OOo 2.0, et une vingtaine de fichiers word). Il faut mettre ça dans "C:Program FilesOpenOffice.org 2.0shareScriptspython", ouvrir OOo avec un document vide, et lancer la macro avec Outils->Macros->Gérer les macros->python. A+ jm
#----------------------------------------------------------------- import uno import unohelper from com.sun.star.beans import PropertyValue
def convDocPdf(): """Conversion fichiers .doc en .pdf""" model = XSCRIPTCONTEXT.getDocument() text = model.Text cursor = text.createTextCursor() desktop = XSCRIPTCONTEXT.getDesktop() rep= 'Z:/u1/jm/dev/python/OOo/' lstFics= ('annuaire province.doc',) for f in lstFics: theSourceFile= rep+f theTargetFile= theSourceFile.replace('doc','pdf') inFile = unohelper.systemPathToFileUrl(theSourceFile) outFile = unohelper.systemPathToFileUrl(theTargetFile) text.insertString(cursor, "%sn"%inFile,0) inProps = (PropertyValue('Hidden',0,True,0),) outProps = (PropertyValue('FilterName',0,'writer_pdf_Export',0),) present = desktop.loadComponentFromURL(inFile,"_blank",0,inProps) present.storeToURL(outFile,outProps) present.dispose() return None#-----------------------------------------------------------------
Florent Manens
Bonjour,
Le 15-05-2006, bruno at modulix a écrit :
D'abord, le contexte: un client nous demande de passer =~ 3000 documents words en PDF, en ajoutant quelques mentions au passage...
Bon, pas un problème technique majeur a priori, mais j'ai peu d'expérience dans ce genre de bricoles (ça fait plusieurs années que je n'ai pas bossé sous Windows et ma seule expérience avec le format PDF consiste en la lecture de documents au dit format dans un outil conçu pour !-)
Une petite recherche sur Google m'a permis de trouver aussi bien des utilitaires capable de générer du PDF à partir de word (généralement via Ghostscript ou assimilé -> PDFCreator, qvPdf etc) que des bibliothèques permettant de créer des PDF par code (reportlab of course) - plus bien sûr des solutions basées sur OOo.
Je me permet 2 remarques : - PDFCreator fonctionne bien et saura faire un PDF si word est présent sur le poste de travail.
- OOo permet de se passer de word pour faire le PDF et, dans la version 2.0 de OOo, le PDF sera plus ... intelligent (table des matières, liens internet ...). Par contre, attention aux problèmes de reprise des documents .doc par OpenOffice.org.
De quel ordre est la modification sur le document ? Quelle est la conformitée par rapport à l'original requise pour les PDF ?
Un petit script Python + COM + OOo pour la route :
import sys import getopt import os import urllib
__doc__ = """ Convert text file (.doc, .sxw, ...) to PDF with OpenOffice
#Original from DannyB. def MakePropertyValues(oServiceManager, values): return [MakePropertyValue(oServiceManager, value[0], value[1]) for value in values]
def MakePropertyValue(oServiceManager, Name, Value): oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") oStruct.Name = Name oStruct.Value = Value return oStruct
def main(args): if not args or ("-h" in args): print __doc__ return
try: opts, fileArgs = getopt.getopt(args, "") except getopt.GetoptError: print __doc__ return for filename in fileArgs: if os.path.exists(filename): pdffilename = ''.join([os.path.splitext(filename)[0], ".pdf"]) convert_to_pdf(''.join(["",urllib.pathname2url(filename)]), ''.join(["",urllib.pathname2url(pdffilename)]))
if __name__ == "__main__": main(sys.argv[1:])
-- Florent Manens
Bonjour,
Le 15-05-2006, bruno at modulix <onurb@xiludom.gro> a écrit :
D'abord, le contexte: un client nous demande de passer =~ 3000 documents
words en PDF, en ajoutant quelques mentions au passage...
Bon, pas un problème technique majeur a priori, mais j'ai peu
d'expérience dans ce genre de bricoles (ça fait plusieurs années que je
n'ai pas bossé sous Windows et ma seule expérience avec le format PDF
consiste en la lecture de documents au dit format dans un outil conçu
pour !-)
Une petite recherche sur Google m'a permis de trouver aussi bien des
utilitaires capable de générer du PDF à partir de word (généralement via
Ghostscript ou assimilé -> PDFCreator, qvPdf etc) que des bibliothèques
permettant de créer des PDF par code (reportlab of course) - plus bien
sûr des solutions basées sur OOo.
Je me permet 2 remarques :
- PDFCreator fonctionne bien et saura faire un PDF si word est présent
sur le poste de travail.
- OOo permet de se passer de word pour faire le PDF et, dans la version
2.0 de OOo, le PDF sera plus ... intelligent (table des matières,
liens internet ...). Par contre, attention aux problèmes de reprise
des documents .doc par OpenOffice.org.
De quel ordre est la modification sur le document ? Quelle est la conformitée
par rapport à l'original requise pour les PDF ?
Un petit script Python + COM + OOo pour la route :
import sys
import getopt
import os
import urllib
__doc__ = """
Convert text file (.doc, .sxw, ...) to PDF with OpenOffice
#Original from DannyB.
def MakePropertyValues(oServiceManager, values):
return [MakePropertyValue(oServiceManager, value[0], value[1]) for value in values]
def MakePropertyValue(oServiceManager, Name, Value):
oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oStruct.Name = Name
oStruct.Value = Value
return oStruct
D'abord, le contexte: un client nous demande de passer =~ 3000 documents words en PDF, en ajoutant quelques mentions au passage...
Bon, pas un problème technique majeur a priori, mais j'ai peu d'expérience dans ce genre de bricoles (ça fait plusieurs années que je n'ai pas bossé sous Windows et ma seule expérience avec le format PDF consiste en la lecture de documents au dit format dans un outil conçu pour !-)
Une petite recherche sur Google m'a permis de trouver aussi bien des utilitaires capable de générer du PDF à partir de word (généralement via Ghostscript ou assimilé -> PDFCreator, qvPdf etc) que des bibliothèques permettant de créer des PDF par code (reportlab of course) - plus bien sûr des solutions basées sur OOo.
Je me permet 2 remarques : - PDFCreator fonctionne bien et saura faire un PDF si word est présent sur le poste de travail.
- OOo permet de se passer de word pour faire le PDF et, dans la version 2.0 de OOo, le PDF sera plus ... intelligent (table des matières, liens internet ...). Par contre, attention aux problèmes de reprise des documents .doc par OpenOffice.org.
De quel ordre est la modification sur le document ? Quelle est la conformitée par rapport à l'original requise pour les PDF ?
Un petit script Python + COM + OOo pour la route :
import sys import getopt import os import urllib
__doc__ = """ Convert text file (.doc, .sxw, ...) to PDF with OpenOffice
#Original from DannyB. def MakePropertyValues(oServiceManager, values): return [MakePropertyValue(oServiceManager, value[0], value[1]) for value in values]
def MakePropertyValue(oServiceManager, Name, Value): oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") oStruct.Name = Name oStruct.Value = Value return oStruct
(d'ailleurs, je me demande la pertinence de os.path.realpath, c'est fiable ?)
Par contre, je viens de rencontrer quelques problèmes avec Windows 2000 (que je n'ai pas avec windows XP). Etrangement, si j'utilise le paramètre ["Hidden", True] (qui permet de charger le fichier de manière invisible), l'exception suivante est levée : com.sun.star.task.ErrorCodeIOException
Je viens de trouver, c'est du à un bug OpenOffice.org (2.0.2) : http://qa.openoffice.org/issues/show_bug.cgi?idc210
Correction prévue dans la 2.0.3.
-- Florent Manens
Bonjour,
Dans fr.comp.lang.python, vous avez écrit| :
ça ne marche pas, chez moi (P2.4.2 ; WinXP ; OOo 2.0) :
'com.sun.star.lang.IllegalArgumentException: URL seems to be an
unsupported one.'
Effectivement, c'est un bug, dans le contexte d'utilisation initial, le
chemin complet était passé en argument. Voici comment contourner le
problème :
(d'ailleurs, je me demande la pertinence de os.path.realpath, c'est fiable ?)
Par contre, je viens de rencontrer quelques problèmes avec Windows 2000
(que je n'ai pas avec windows XP). Etrangement, si j'utilise le
paramètre ["Hidden", True] (qui permet de charger le fichier de manière
invisible), l'exception suivante est levée :
com.sun.star.task.ErrorCodeIOException
Je viens de trouver, c'est du à un bug OpenOffice.org (2.0.2) :
http://qa.openoffice.org/issues/show_bug.cgi?idc210
(d'ailleurs, je me demande la pertinence de os.path.realpath, c'est fiable ?)
Par contre, je viens de rencontrer quelques problèmes avec Windows 2000 (que je n'ai pas avec windows XP). Etrangement, si j'utilise le paramètre ["Hidden", True] (qui permet de charger le fichier de manière invisible), l'exception suivante est levée : com.sun.star.task.ErrorCodeIOException
Je viens de trouver, c'est du à un bug OpenOffice.org (2.0.2) : http://qa.openoffice.org/issues/show_bug.cgi?idc210