Transformer un texte chinois en pdf


 lun. 25 novembre 2013    Python

Nous sommes tous confrontés un jour au problème de l'encodage, aka "c'est quoi tous ces hiéroglyphes bizarres dans mon document au lieu de mon beau texte en chinois (ou en suédois, en russe, en arabe, ou même en français....)?"

Bon, je ne vais pas faire un cours sur l'encodage, sachez juste que si vous avez des hiéroglyphes, que vous êtes sur Mac ou Linux, il y a des fortes chances que votre document ne soit pas en unicode mais dans un encodage régional, comme par exemple pour un texte chinois GB2312 (chinois simplifié) ou BIG5 (chinois traditionnel).

Qu'à cela ne tienne, nous allons convertir notre texte dans un format unicode universel, dans sa version UTF8. Et puis, pour pouvoir lire le texte en toute circonstance et sur toute plateforme, nous allons en faire un pdf

Pour cela, nous allons utiliser deux bibliothèques tierces de Python, chardet qui permet de deviner l'encodage de notre fichier texte de départ (très pratique si nous ne le connaissons pas) et pyfpdf qui permet de créer un fichier pdf (plus simple à utiliser que reportlab). Les deux bibliothèques s'installent avec pip. la documentation pyfpdf est ici.

Allez, le programme python. Les commentaires sont dans le code.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/python
# -*- coding: utf8 -*-
#---------------------
#txt2pdf.py
#Crée par letchap
#---------------------

import sys
import chardet
from fpdf import FPDF
import os

def decodage(filename):

	# Je cherche l'encodage de mon fichier grâce à chardet
	rawdata = open(filename, 'r').read(100)
	codage = chardet.detect(rawdata)
	source = codage['encoding']

	# Je prépare mon PDF, j'utilise pyfpdf
	pdf=FPDF('P','pt','A4')
	pdf.add_page()
	# J'utlise une jolie police de caractère dont je doit indiqué le chemin (sur Mac OSX)
	pdf.add_font('fireflysung', '', '/Library/Fonts/fireflysung.ttf', uni=True)
	pdf.set_font('fireflysung','', 12)
	# Je décode et j'encode mon texte
	txt=file(filename).read().decode(source, errors='ignore').encode('utf8')
	pdf.write(14, txt)
	# Je retravaille le nom du fichier
	ext=os.path.basename(filename) # j'enlève le chemin
	namefile=os.path.splitext(ext)[0] # j'enlève l'extension
	# Je finalise le pdf
	pdf.output('/path/to/new_' + namefile + '.pdf','F')


#############################################################################################
#                           Le main                                                         #
#############################################################################################
# Je teste le nombre d'arguments de la ligne de commande
# 0 = premier paramètre, le nom du programme
# 1 = deuxième paramètre, ici le nom du fichier.
# Si j'ai strictement moins de 2 paramètres, j'ai oublié le nom de fichier
# Je sors alors en erreur sys.exit(1), (0 pas d'erreur, 2 erreur de synthaxe de la ligne de commande)

if __name__ == '__main__':
	if len(sys.argv) < 2:
		print('Précisez le fichier à décoder')
		sys.exit(1)
	else :
		filename = sys.argv[1]
		decodage(filename)

Télécharger txt2pdf.py

Voilà, il n'y a plus qu'à lancer le programme par un beau

$ ./txt2pdf.py montexte.txt

Evidemment, pour tout être normalement constitué, lancer un décodage de cette manière, en ligne de commande, ce n'est pas très pratique, un clic droit sur un ou plusieurs fichiers serait le bienvenue. C'est que nous allons faire tout de suite dans ce billet