OVH Cloud OVH Cloud

[Python-Fr] word vers pdf : retour d'expérience ?

15 réponses
Avatar
bruno at modulix
(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('@')])"

5 réponses

1 2
Avatar
jean-michel bain-cornu
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#-----------------------------------------------------------------

Avatar
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

doc2pdf.py filename.doc
"""

def getOOoContext():
import win32com.client
objServiceManager = win32com.client.dynamic.Dispatch("com.sun.star.ServiceManager")
objServiceManager._FlagAsMethod("CreateInstance")
objServiceManager._FlagAsMethod("Bridge_GetStruct")
corereflection = objServiceManager.CreateInstance("com.sun.star.reflection.CoreReflection")
return objServiceManager.createInstance("com.sun.star.frame.Desktop"), objServiceManager, corereflection

#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 convert_to_pdf(filename, pdffilename):
StarDesktop, objServiceManager, corereflection = getOOoContext()
document = StarDesktop.LoadComponentFromURL(filename, "_blank", 0,
MakePropertyValues(objServiceManager,
[["ReadOnly", True],
["Hidden", True]]))
document.storeToUrl( pdffilename,
MakePropertyValues(objServiceManager,
[["CompressMode", 1],
["FilterName", "writer_pdf_Export"]]))
document.close(False)

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

Avatar
jean-michel bain-cornu
Bonjour,
Un petit script Python + COM + OOo pour la route :
C'est sympa, et ça pourra toujours servir pour autre chose !

Ceci dit, bonjour l'usine !

Avatar
Méta-MCI
Bonsoir !

ç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.'


@-salutations

Michel Claveau
Avatar
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 :

- convert_to_pdf(''.join(["",urllib.pathname2url(filename)]),
- ''.join(["",urllib.pathname2url(pdffilename)]))

+ convert_to_pdf(''.join(["",urllib.pathname2url(os.path.realpath(filename))]),
+ ''.join(["",urllib.pathname2url(os.path.realpath(pdffilename))]))

(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

1 2