#1 Le 08/10/2016, à 08:06
- JujuLand
[Résolu] Problème avec du code python
Bonjour,
Sur le site developpez.com, j'ai récupéré un bout de code qui permet de créer un pdf à partir d'un fichier texteavec reportlab
https://letchap.github.io/2014/03/06/cr … reportlab/
J'ai copié ce code, mais à l'exécution, il plante.
J'ai beau chercher, je ne comprends pas pourquoi.
Si vous avez une idée ...
Voici le code:
#!/usr/bin/python
import sys
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.styles import ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
def pdf(filein):
txt = open(filein, 'r').read()
docpdf = SimpleDocTemplate(fileout,
pagesize = A4)
style = getSampleStyleSheet()
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14),
wordWrap = 'CJK')
story = []
paragraphs = txt.split("\n")
for para in paragraphs:
story.append(Paragraph(para, style["Chinese"]))
story.append(Spacer(0, cm * .3))
docpdf.build(story)
if __name__ == '__main__':
if len(sys.argv) < 3:
print('Utilisation : <script> textfile pdffile')
sys.exit(1)
else :
filein = sys.argv[1]
fileout = sys.argv[2]
pdf(filein)
et voici l'erreur :
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./test-pdf.py mailpdf.prg test.pdf
Traceback (most recent call last):
File "./test-pdf.py", line 17, in <module>
docpdf = SimpleDocTemplate(fileout,
NameError: name 'fileout' is not defined
Merci
A+
Dernière modification par JujuLand (Le 08/10/2016, à 13:23)
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#2 Le 08/10/2016, à 08:12
- pingouinux
Re : [Résolu] Problème avec du code python
Bonjour,
Essaye de passer fileout en second argument de la fonction pdf.
Hors ligne
#3 Le 08/10/2016, à 08:22
- JujuLand
Re : [Résolu] Problème avec du code python
Bon, en grattant un peu plus, j'ai trouvé que je n'avais pas indenté dans la fonction.aussi, au lieu d'aller à main, j'exécutais docpdf = ...
Une autre erreur en suivant, mais résolue
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14),
wordWrap = 'CJK')
La parenthèse fermante après =14 était de trop
Maintenant, j'ai çà :
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./test-pdf.py mailpdf.prg test.pdf
File "./test-pdf.py", line 26
story = []
^
SyntaxError: invalid syntax
çà parait pourtant correct ...
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#4 Le 08/10/2016, à 08:48
- pingouinux
Re : [Résolu] Problème avec du code python
C'est sans doute à la ligne d'avant que se situe le problème. Montre le script modifié complet.
Ajouté : La parenthèse après 14 était correcte, d'où ta nouvelle erreur
Dernière modification par pingouinux (Le 08/10/2016, à 08:52)
Hors ligne
#5 Le 08/10/2016, à 08:57
- JujuLand
Re : [Résolu] Problème avec du code python
Bon, j'avais déjà essayé de passer les deux paramètres, et en remettant la parenthèse qui tout compte fait,est necessaire, j'ai l'erreur suivante:
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./test-pdf.py mailpdf.prg test.pdf
Traceback (most recent call last):
File "./test-pdf.py", line 40, in <module>
pdf(filein, fileout)
File "./test-pdf.py", line 24, in pdf
wordWrap = 'CJK')
TypeError: add() got an unexpected keyword argument 'wordWrap'
Voici la dernière mouture avec passage de 2 paramètres, ce qui semble nécessaire:
#!/usr/bin/python
import sys
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.styles import ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
def pdf(filein, fileout):
txt = open(filein, 'r').read()
docpdf = SimpleDocTemplate(fileout, pagesize = A4)
style = getSampleStyleSheet()
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14),
wordWrap = 'CJK')
story = []
paragraphs = txt.split("\n")
for para in paragraphs:
story.append(Paragraph(para, style["Chinese"]))
story.append(Spacer(0, cm * .3))
docpdf.build(story)
if __name__ == '__main__':
if len(sys.argv) < 3:
print('Utilisation : <script> textfile pdffile')
sys.exit(1)
else :
filein = sys.argv[1]
fileout = sys.argv[2]
pdf(filein, fileout)
A+
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#6 Le 08/10/2016, à 09:02
- JujuLand
Re : [Résolu] Problème avec du code python
En modifiant comme çà, plus d'erreur, mais le pdf n'a rien dedans ...
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14))
#,
# wordWrap = 'CJK')
Si je rajoute çà :
for para in paragraphs:
print story
J'ai çà :
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./test-pdf.py mailpdf.prg test.pdf
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$
Donc c'est cette boucle qui ne fait rien ...
A+
Dernière modification par JujuLand (Le 08/10/2016, à 09:05)
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#7 Le 08/10/2016, à 09:09
- pingouinux
Re : [Résolu] Problème avec du code python
Essaye comme ceci :
....................................................
style = getSampleStyleSheet()
print(type(style)) # Pour voir le type de la variable style
style.add((ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14),
wordWrap = 'CJK'))
....................................................
ou comme cela (qui a plus de chance de convenir, à mon avis) :
....................................................
style = getSampleStyleSheet()
print(type(style)) # Pour voir le type de la variable style
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14,
wordWrap = 'CJK'))
....................................................
Dernière modification par pingouinux (Le 08/10/2016, à 09:22)
Hors ligne
#8 Le 08/10/2016, à 11:01
- JujuLand
Re : [Résolu] Problème avec du code python
<type 'instance'>
Cà ne me parle pas trop ...
print(type(paragraphs))
<type 'list'>
A+
Dernière modification par JujuLand (Le 08/10/2016, à 11:03)
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#9 Le 08/10/2016, à 11:26
- pingouinux
Re : [Résolu] Problème avec du code python
La première réponse ne m'avance pas beaucoup non plus. La seconde est normale : paragraphs est une liste composée des lignes du fichier d'entrée (le premier paramètre d'appel de ton script).
As-tu essayé chacune des modifications que je t'indique en #7 ?
Hors ligne
#10 Le 08/10/2016, à 11:29
- JujuLand
Re : [Résolu] Problème avec du code python
Nouveau test:
paragraphs = txt.split("\n")
print(type(paragraphs)) # Pour voir le type de la variable style
for para in paragraphs:
print para
print '------------------------------'
story.append(Paragraph(para, style["Chinese"]))
story.append(Spacer(0, cm * .3))
docpdf.build(story)
print story
Me donne çà :
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./test-pdf.py mailpdf.prg test.pdf
<type 'instance'>
<type 'list'>
function main(folder)
------------------------------
local text, txt, html, sortie, rgt, rgm, cfile
------------------------------
local tabmail:={}, cSubject, cFrom, cDate, cTo, cCopy, cCc, cBody, cJoin
------------------------------
------------------------------
altd(1)
------------------------------
altd()
------------------------------
[]
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$
donc split fonctionne, ce sont les append qui ne fonctionnent pas.
A+
Dernière modification par JujuLand (Le 08/10/2016, à 12:39)
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#11 Le 08/10/2016, à 13:22
- JujuLand
Re : [Résolu] Problème avec du code python
Bon, voici la dernière version qui fonctionne : pourtant apparemment identique à la version précédente ?
#!/usr/bin/python
import sys
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.styles import ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
def pdf(filein, fileout):
txt = open(filein, 'r').read()
docpdf = SimpleDocTemplate(fileout, pagesize = A4)
style = getSampleStyleSheet()
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14,
wordWrap = 'CJK'))
story = []
paragraphs = txt.split("\n")
for para in paragraphs:
story.append(Paragraph(para, style["Chinese"]))
story.append(Spacer(0, cm * .3))
docpdf.build(story)
if __name__ == '__main__':
if len(sys.argv) < 3:
print('Utilisation : <script> textfile pdffile')
sys.exit(1)
else :
filein = sys.argv[1]
fileout = sys.argv[2]
pdf(filein, fileout)
Donc pour résumer, il y avait deux erreurs dans le source proposé dans le post 1
a)
style.add(ParagraphStyle(name='Chinese',
fontName='STSong-Light',
fontSize=12,
leading=14,
wordWrap = 'CJK'))
b)
def pdf(filein):
...
pdf(filein)
Plus mes indentations incorrectes...
A+
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne