首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阿拉伯文本没有正确地包装在reportlab的段落中

阿拉伯文本没有正确地包装在reportlab的段落中
EN

Stack Overflow用户
提问于 2013-06-18 10:10:20
回答 3查看 1.7K关注 0票数 4

假设我有一个阿拉伯语片段:

إذاأخذنابعينالإعتبارطبيعةتقلبالمناخوالمتغيراتالبينيةالسنويةوتلكعلىالمدىالطويلإضافةإلىعدمدقةالقياساتوالحساباتالمتبعة

在英语中,这应该意味着:“如果我们考虑到气候变化和年际变化的性质,加上长期的气候变化,以及使用…的测量和计算的缺乏准确性,我们就会发现)。“

现在我想将它呈现为Reportlab (python):

代码语言:javascript
复制
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脚本所期望的那样包装。

EN

回答 3

Stack Overflow用户

发布于 2013-08-31 16:56:29

如果你使用这个报告实验室的分支增加了RTL支持。

并从代码中删除这一行:

代码语言:javascript
复制
arabic_text = get_display(arabic_text) # change orientation by using bidi

您的代码将正常运行。

因为它们已经通过使用PyFriBiDi的分支解决了,所以您可以看到这里

社区的一些用户--特别是users、Moshe和Hosam -为让PyFriBibi使用ReportLab提供了批处理。我们已经为这个开发创建了一个SVN分支,它可以在.

(该页面上的SVN链接不再工作,所以您应该使用我包含的bitbucket链接!)

我已经成功地运行了这个修改过的代码版本,并产生了正确的结果:

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2019-11-08 20:43:34

使用下面的代码。它会把它正确地包裹起来。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2017-01-24 13:14:59

使用wordwrap模块和<br>标记分隔行;这并不完美,因为每个段落的顶部都有空行,但是对于某些用例来说,这是一个简单的解决方案。

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17166198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档