comment imprimer des PDF avec PYTHON ?

vb2py
comment imprimer des PDF avec PYTHON ?

Bonjour

Je débute en Python et j'ai trouvé PDFCreator qui me semble permettre d'imprimer facilement des PDF (sans faire appel à Openoffice et UNO...)

Toutefois j'ai beaucoup de problèmes (le PDF ne se crée pas,...).
Quelqu'un a t'il une solution au problème ?

Merci :(

fredericmazue

Quote:
Quelqu'un a t'il une solution au problème ?

Non :) car tu ne décris pas le problème; Enfin pas vraiment.
Tu ne dis pas si tu es sous Windows ou Linux ce qui a son importance car (il me semble me souvenir) PDFCreator se comporte comme une imprimante.
Tu ne montres aucun code, rien. Alors c'est difficile de t'aider, même en le voulant

Mais bon vb2py j'aime bien ce pseudo :)
Alors un conseil, si j'étais toi, j'irai voir cette librairie:

http://www.reportlab.org/rl_toolkit.html

vb2py
Impression sous Python

Je comprends ta réaction.
L'idée est de pouvoir imprimer à partir de Python une série de feuilles calculées et les sauver dans des PDF préfixés avec le nom de la personne et le mois de calcul.

Pour cela, dans mon script, je crée un objet basé sur la classe PDFCreator,... je définis l'imprimante comme étant PDFCreator, je paramétre avec le nom du fichier et le répertoire de sortie.

J'ai repris les scripts donnés en VB et WSH et j'ai essayé (je commence réellement sous Python mais j'adore ...) de transcrire en une fonction pour tester.

Tout se passe bien sauf que le moniteur d'impression fait son travail, traite les paramètres mais je n'ai aucun PDF produit en sortie !

Je dépose mon script ci-dessous. Si quelqu'un a une idée ou a déjà traité le sujet, je "donne ma langue au chat " !

TIA

#! python
# -*- coding: cp1252 -*-

#-------------------------------------------------------------------------------
# Name: test_pdfcreator.py
# Purpose:
#
# Author: vincent
#
# Created: 07/02/2007
# Copyright: (c) vincent 2007
# Licence:
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import win32com.client
import sys
import os
import datetime

def f_lance_pdf( z_fichier_in, z_directory, z_fichier_out):
""" crée un fichier PDF sur base d'un fichier imprimable (XLS,DOC,...)
arguments :
le nom complet du fichier IN
le répertoire
le nom du fichier de sortie (sans .pdf car implicite)

"""

pdfcreator1 = win32com.client.Dispatch('PDFCreator.clsPDFCreator')
pdfopt = win32com.client.Dispatch('PDFCreator.clsPDFCreatorOptions')
pdferror = win32com.client.Dispatch('PDFCreator.clsPDFCreatorError')

pdfcreator1.cStart("/NoProcessingAtStartup")

## sauver imprimante par défaut

imprimante_defaut = pdfcreator1.cDefaultPrinter

## AutoSaveFormat = 0 pour PDF

pdfcreator1.cOptions.AutosaveFormat = 0
pdfcreator1.cOptions.UseAutosave = 1
pdfcreator1.cOptions.UseAutosaveDirectory = 1
pdfcreator1.cOptions.AutosaveDirectory = z_directory
pdfcreator1.cOptions.SaveFilename = z_fichier_out
pdfcreator1.cOptions.ShowAnimation = 1
pdfcreator1.cOptions.StartStandardProgram = 0

pdfcreator1.cDefaultPrinter = "PDFCreator"
pdfcreator1.cClearCache

print "f_lance_pdf : traitement"
print "-----------------------------------------------"
print "imprimante par defaut : " , imprimante_defaut
print "redirection imprimante : " , pdfcreator1.cDefaultPrinter
print "existence du fichier :(",z_fichier_in,") ", os.path.exists( z_fichier_in )
print "existence du répertoire :(",z_directory ,") ", os.path.exists( z_directory )
print "use auto save : ", pdfcreator1.cOption("UseAutosave")
print "use auto save directory " , pdfcreator1.cOption("AutosaveDirectory")

print "rep sortie :" , z_directory
print "fichier OUT :" , pdfcreator1.cOption("AutosaveFilename") , "pdf"
print "fichier produit",pdfcreator1.cOutputFilename

## try:
print "lancement de l'impression ...", datetime.datetime.now()
print "le fichier est il imprimable" , pdfcreator1.cIsPrintable( z_fichier_in)
try:
pdfcreator1.cPrintFile( z_fichier_in )
except:
print "erreur impression"



pdfcreator1.cPrintPrinterTestpage()

print "impression en cours ..."

print "fin de l'impression", datetime.datetime.now()

pdfcreator1.cPrinterStop = False

## print "sauver les options"
## pdfopt = pdfcreator1.cReadOptionsFromFile("c:/IRSA_TEMPO/pdftest.ini")
## pdfcreator1.cSaveOptionsToFile("c:/IRSA_TEMPO/pdftest.ini")


## print "restaurer l'imprimante par défaut"
print "imprimante redéfinie : ", imprimante_defaut
pdfcreator1.cDefaultPrinter = imprimante_defaut
pdfcreator1.cClearCache
## terminer proprement en fermant le lien COM et en effacant les objets.
pdfcreator1.cClose
del pdfcreator1
del pdfopt

##----------------------------------------------------


##----------------------------------------------------------------------
## partie TEST.
## définir le répertoire de sortie (chemin +\)
## définir le nom du fichier (chemin + nom + extension)
## définir le nom du fichier de sortie (nom)
##
## attention PYTHON : indiquer double \\
## pour éviter problème avec séquence ESC
## attention l'utilisation des / ne fonctionne pas !
## (le script se base partiellement sur les exemples repris en VB et WSH de PDFCREATOR)
##----------------------------------------------------------------------

t_dirfichier = "c:\\irsa\\"
t_fichier_in = "c:\\irsa\\photocopies.xls"
t_fichier_out = "photocopies"

print 'f_lance_PDF : avant appel'
print "-------------------------"
print f_lance_pdf.__doc__
print "fichier à imprimer:" , t_fichier_in
print "répertoire :" , t_dirfichier
print "fichier de sortie :" , t_fichier_out

a= f_lance_pdf( t_fichier_in, t_dirfichier, t_fichier_out)

fredericmazue

Tu travailles avec COM. Les noms de fichiers ne devraient pas être en UTF-8 par hasard ?

fredericmazue

J'oubliais:

Quote:
je commence réellement sous Python mais j'adore ...

Bravo pour ton bon goût :)

vb2py

Merci pour tes commentaires ...! :wink:
Pour être en UTF 8, que faut il faire ?
Y a t'il une ligne de commentaire / commande à ajouter ?

Merci bien.

fredericmazue

Quote:
Pour être en UTF 8, que faut il faire ?
Y a t'il une ligne de commentaire / commande à ajouter ?

Ca peut dépendre de la version de Python que tu utilises.
Mais je dirais que:

- en donnant en début de script # -*- coding: utf8 -* (ou utf-8 je ne me rappelle plus. Mais plutôt utf-8 je dirais)

et/ou

- en déclarant les chaînes ainsi: u"le_fichier" ça devrait le faire.

u"une_chaine" force normalement Python à encoder "une_chaine" en unicode. Mais si ça ce trouve tu n'as même pas besoin, la directive coding devrait suffire :)

Si vraiment tu veux être sûr:

unicode("une_chaine",'latin-1').encode('utf-8')

vb2py

Rebonjour

J'ai jeté un oeil à ton conseil (j'avais entretemps trouvé sur le Web la même commande que celle que tu renseignes). Merci.

Je pense que le problème est ailleurs. PDFCreator semble bien préparer le PDF mais ne le sauve pas malgré le paramètre AUTOSAVE et laisse des fichiers .TMP sur le disque... un peu comme si on ne laissait pas le temps au programme de terminer son travail ... HTH

ET comme je ne sais pas encore comment on peut ramener l'évènement READY du COM ... je tatonne.

Merci pour ton aide. Bien à toi.
Vincent

fredericmazue

Quote:
Je pense que le problème est ailleurs. PDFCreator semble bien préparer le PDF mais ne le sauve pas malgré le paramètre AUTOSAVE et laisse des fichiers .TMP sur le disque...

Ca n'a pas grand sens tout ça, à moins que....

Quote:
un peu comme si on ne laissait pas le temps au programme de terminer son travail ... HTH

... Je n'ai jamais travaillé avec PFDCreator alors, intrigué par ton pb , j'ai un peu regardé sur le Web ce que je pouvais y trouver.
Je suis tombé sur un bout de code en VB 2005 (pas VB6 donc) qui est la copie carbone de ton code Python, à un seul détail près. Dans ton code Python, il n'y a pas cVisible = True (ou =1)

Si je comprends bien PDFCreator c'est un activeX. Normalement cVisible = True n'a pas besoin d'être là pour que ça fonctionne. Normalement... mais quand je lis ta phrase je me dis que peut être si cVisible n'est pas positionné, l'activex est arrêté prématurément.

As tu essayé de mettre une pause ou équivalent à la fin de ta fonction test ?

vb2py

je progresse ... avec tes conseils et après un examen plus approfondi du help de PDFCreator (le PDF se crée maintenant et reste dans un répertoire).

restent quelques soucis : sur le traitement des chaines représentant des répertoires et noms de fichiers ...
J'aurai besoin d'un autre petit coup de pouce : comment traiter un évènement venant du COM déclaré ? Peux tu me renseigner ou me renvoyer vers un lien ? Je pense que comme dans le script je doit attendre l'état ready du COM pour continuer et restaurer les param par défaut.

Dès que j'ai une solution je la publie ...

Bien à toi.
Vincent

fredericmazue

Quote:
sur le traitement des chaines représentant des répertoires et noms de fichiers ...

Comment ça ?

Quote:
comment traiter un évènement venant du COM déclaré ? Peux tu me renseigner ou me renvoyer vers un lien ? Je pense que comme dans le script je doit attendre l'état ready du COM pour continuer et restaurer les param par défaut.

Non. Au lieu d'employer Dispatch, tu dois employer DispatchWithEvents. Je n'ai pas le temps d'en dire plus (suis débordé là...)
Voici un lien toutefois, en espérant qu'il te soit utile

http://www.mail-archive.com/python-win32@python.org/msg02142.html