Merge lp:~kifcaliph/openobject-server/openobject-server into lp:openobject-server

Proposed by kifcaliph
Status: Needs review
Proposed branch: lp:~kifcaliph/openobject-server/openobject-server
Merge into: lp:openobject-server
Diff against target: 111 lines (+71/-2)
2 files modified
openerp/report/render/rml2pdf/__init__.py (+35/-1)
openerp/report/render/rml2pdf/trml2pdf.py (+36/-1)
To merge this branch: bzr merge lp:~kifcaliph/openobject-server/openobject-server
Reviewer Review Type Date Requested Status
Olivier Dony (Odoo) Pending
Review via email: mp+101195@code.launchpad.net

Description of the change

this is some modification to enable RTL languages to work with Openerp in PDF reports, without this modifications RTL languages may appear something like this "prenepO" for word Openerp.

To post a comment you must log in.

Unmerged revisions

4129. By kifcaliph <kifcaliph@kifcaliph>

Enabling RTL languages to work

4128. By kifcaliph

These modification to make Openerp to expor pdf documents for RTL languages like Arabic

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/report/render/rml2pdf/__init__.py'
2--- openerp/report/render/rml2pdf/__init__.py 2011-11-22 08:58:48 +0000
3+++ openerp/report/render/rml2pdf/__init__.py 2012-04-08 03:03:21 +0000
4@@ -19,9 +19,43 @@
5 #
6 ##############################################################################
7
8+
9+# file location /openerp/report/render/rml2pdf
10+
11+
12+import os, stat
13+from reportlab import rl_config
14+from reportlab.pdfbase import pdfmetrics
15+from reportlab.pdfbase import ttfonts
16+from reportlab.lib.fonts import addMapping
17+
18+def rl_isreg(filename, dirname):
19+ try:
20+ st = os.stat(os.path.join(dirname, filename))
21+ except OSError, reason:
22+ if reason.errno == 2:
23+ return False
24+ raise
25+ return stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)
26+
27+for dirname in rl_config.TTFSearchPath:
28+ for root, dirs, files in os.walk(dirname): #@UnusedVariable
29+ for file in [x for x in files
30+ if x.lower().endswith('.ttf') and rl_isreg(x, root)
31+ ]:
32+ filename = os.path.join(root, file)
33+ try:
34+ face = ttfonts.TTFontFace(filename)
35+ face.extractInfo(1)
36+ pdfmetrics.registerFont(ttfonts.TTFont(face.name, filename, asciiReadable=0))
37+ addMapping(face.familyName, face.bold, face.italic, face.name)
38+ except:
39+ pass
40+
41+
42 from trml2pdf import parseString, parseNode
43
44 #.apidoc title: RML to PDF engine
45
46
47-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
48+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
49\ No newline at end of file
50
51=== modified file 'openerp/report/render/rml2pdf/trml2pdf.py'
52--- openerp/report/render/rml2pdf/trml2pdf.py 2012-02-08 01:36:17 +0000
53+++ openerp/report/render/rml2pdf/trml2pdf.py 2012-04-08 03:03:21 +0000
54@@ -624,7 +624,7 @@
55 if not n.tag == 'bullet':
56 txt_n.text = utils.xml2str(self._textual(n))
57 txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
58- rc1 += etree.tostring(txt_n)
59+ rc1 += etree.tostring(txt_n, encoding = unicode)
60 return rc1
61
62 def _table(self, node):
63@@ -968,7 +968,41 @@
64 fis.append(PageCount())
65 self.doc_tmpl.build(fis)
66
67+def changeFonts(data):
68+ fontmap = {
69+ 'Times-Roman': 'DejaVuSerif',
70+ 'Times-BoldItalic': 'DejaVuSerif-BoldItalic',
71+ 'Times-Bold': 'DejaVuSerif-Bold',
72+ 'Times-Italic': 'DejaVuSerif-Italic',
73+
74+ 'Helvetica': 'DejaVuSans',
75+ 'Helvetica-BoldItalic': 'DejaVuSans-BoldOblique',
76+ 'Helvetica-Bold': 'DejaVuSans-Bold',
77+ 'Helvetica-Italic': 'DejaVuSans-Oblique',
78+
79+ 'Courier': 'DejaVuSansMono',
80+ 'Courier-Bold': 'DejaVuSansMono-Bold',
81+ 'Courier-BoldItalic': 'DejaVuSansMono-BoldOblique',
82+ 'Courier-Italic': 'DejaVuSansMono-Oblique',
83+
84+ 'Helvetica-ExtraLight': 'DejaVuSans-ExtraLight',
85+
86+ 'TimesCondensed-Roman': 'DejaVuSerifCondensed',
87+ 'TimesCondensed-BoldItalic': 'DejaVuSerifCondensed-BoldItalic',
88+ 'TimesCondensed-Bold': 'DejaVuSerifCondensed-Bold',
89+ 'TimesCondensed-Italic': 'DejaVuSerifCondensed-Italic',
90+
91+ 'HelveticaCondensed': 'DejaVuSansCondensed',
92+ 'HelveticaCondensed-BoldItalic': 'DejaVuSansCondensed-BoldOblique',
93+ 'HelveticaCondensed-Bold': 'DejaVuSansCondensed-Bold',
94+ 'HelveticaCondensed-Italic': 'DejaVuSansCondensed-Oblique',
95+ }
96+ for old, new in fontmap.iteritems():
97+ data = data.replace('"'+old+'"', '"'+new+'"')
98+ return data
99+
100 def parseNode(rml, localcontext=None, fout=None, images=None, path='.', title=None):
101+ rml = changeFonts(rml)
102 node = etree.XML(rml)
103 r = _rml_doc(node, localcontext, images, path, title=title)
104 #try to override some font mappings
105@@ -986,6 +1020,7 @@
106 return fp.getvalue()
107
108 def parseString(rml, localcontext=None, fout=None, images=None, path='.', title=None):
109+ rml = changeFonts(rml)
110 node = etree.XML(rml)
111 r = _rml_doc(node, localcontext, images, path, title=title)
112