假设我有一个阿拉伯语片段:
إذاأخذنابعينالإعتبارطبيعةتقلبالمناخوالمتغيراتالبينيةالسنويةوتلكعلىالمدىالطويلإضافةإلىعدمدقةالقياساتوالحساباتالمتبعة
在英语中,这应该意味着:“如果我们考虑到气候变化和年际变化的性质,加上长期的气候变化,以及使用…的测量和计算的缺乏准确性,我们就会发现)。“
现在我想将它呈现为Reportlab (python):
arabic_text = u'إذا أخذنا بعين الإعتبار طبيعة تقلب المناخ و المتغيرات البينية السنوية و تلك على المدى الطويل إضافة إلى عدم دقة القياسات والحسابات المتبعة'
arabic_text = arabic_reshaper.reshape(arabic_text) # join characters
arabic_text = get_display(arabic_text) # change orientation by using bidi
pdf_file=open('disclaimer.pdf','w')
pdf_doc = SimpleDocTemplate(pdf_file, pagesize=A4)
pdfmetrics.registerFont(TTFont('Arabic-normal', '../fonts/KacstOne.ttf'))
style = ParagraphStyle(name='Normal', fontName='Arabic-normal', fontSize=12, leading=12. * 1.2)
style.alignment=TA_RIGHT
pdf_doc.build([Paragraph(arabic_text, style)])
pdf_file.close()结果是在这里https://www.dropbox.com/s/gdyt6930jlad8id/disclaimer.pdf。您可以看到文本本身是正确的和可读的(至少对于而言),但不像RTL脚本所期望的那样包装。
发布于 2013-08-31 16:56:29
如果你使用这个报告实验室的分支增加了RTL支持。
并从代码中删除这一行:
arabic_text = get_display(arabic_text) # change orientation by using bidi您的代码将正常运行。
因为它们已经通过使用PyFriBiDi的分支解决了,所以您可以看到这里
社区的一些用户--特别是users、Moshe和Hosam -为让PyFriBibi使用ReportLab提供了批处理。我们已经为这个开发创建了一个SVN分支,它可以在.
(该页面上的SVN链接不再工作,所以您应该使用我包含的bitbucket链接!)
我已经成功地运行了这个修改过的代码版本,并产生了正确的结果:
from libs import arabic_reshaper
from bidi.algorithm import get_display
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_RIGHT
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase.ttfonts import TTFont
arabic_text = u'إذا أخذنا بعين الإعتبار طبيعة تقلب المناخ و المتغيرات البينية السنوية و تلك على المدى الطويل إضافة إلى عدم دقة القياسات والحسابات المتبعة'
arabic_text = arabic_reshaper.reshape(arabic_text) # join characters
# arabic_text = get_display(arabic_text) # change orientation by using bidi
pdf_file=open('disclaimer.pdf','w')
pdf_doc = SimpleDocTemplate(pdf_file, pagesize=A4)
pdfmetrics.registerFont(TTFont('Arabic-normal', 'fonts/misc/KacstOne.ttf'))
style = ParagraphStyle(name='Normal', fontName='Arabic-normal', fontSize=12, leading=12. * 1.2)
style.alignment=TA_RIGHT
pdf_doc.build([Paragraph(arabic_text, style)])
pdf_file.close()发布于 2019-11-08 20:43:34
使用下面的代码。它会把它正确地包裹起来。
import arabic_reshaper
from bidi.algorithm import get_display
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_RIGHT
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.lib.units import inch
def text_wraping(text,aW):
text_width = stringWidth(text, style.fontName, style.fontSize)
space_width = stringWidth(' ', style.fontName, style.fontSize)
if text_width > aW:
lines = []
text = arabic_text.split(' ')
text.reverse()
line = ''
for word in text:
line_width = stringWidth(line, style.fontName, style.fontSize)
word_width = stringWidth(word, style.fontName, style.fontSize)
if (line_width < aW) and (line_width + word_width + space_width < aW):
line += word + ' '
else:
line = line.split(' ')
line.reverse()
tmp = ' '
line = tmp.join(line)
lines.append(line)
line = word + ' '
line = line.split(' ')
line.reverse()
tmp = ' '
line = tmp.join(line)
lines.append(line)
return(lines)
pdf_doc = SimpleDocTemplate('disclaimer.pdf', pagesize=A4)
pdfmetrics.registerFont(TTFont('Aims', 'Aims.ttf'))
style = ParagraphStyle(name='Normal', fontName='Aims', fontSize=12, leading=12. * 1.2,wordWrap='RTL')
style.alignment=TA_RIGHT
aW = A4[0]-2*inch # change this line to the specified width for example paragraph width or table width
arabic_text = 'إذا أخذنا بعين الإعتبار طبيعة تقلب المناخ و المتغيرات البينية السنوية و تلك على المدى الطويل إضافة إلى عدم دقة القياسات والحسابات المتبعة'
arabic_text = arabic_reshaper.reshape(arabic_text) # join characters
arabic_text = get_display(arabic_text) # change orientation by using bidi
lines = text_wraping(arabic_text,aW)
elements = []
for line in lines:
elements.append(Paragraph(line,style))
pdf_doc.build(elements)发布于 2017-01-24 13:14:59
使用wordwrap模块和<br>标记分隔行;这并不完美,因为每个段落的顶部都有空行,但是对于某些用例来说,这是一个简单的解决方案。
import textwrap
def ShowArabictext(Text):
#style_comment.alignment = TA_RIGHT
wrkText=Text
isArabic=False
isBidi=False
for c in wrkText:
cat=unicodedata.bidirectional(c)
if cat=="AL" or cat=="AN":
isArabic=True
isBidi=True
break
elif cat=="R" or cat=="RLE" or cat=="RLO":
isBidi=True
if isArabic:
#wrkText=arabic_table(wrkText)
wrkText=textwrap.wrap( wrkText,70)
wrkTexttemp=[]
l=u''
i=0
for w in wrkText:
# break each line with html markup allowed in reportlab
l=l+u'<br></br>'+arabic_rtlize.process.shape(arabic_reshaper.reshape(w ))
wrkText=l
if isBidi:
wrkText=get_display(wrkText)
return [wrkText,isArabic,isBidi]https://stackoverflow.com/questions/17166198
复制相似问题