阿拉伯语文本未正确包装在reportlab的Paragraph中

问题描述 投票:2回答:2

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

除了测量和计算的不准确性之外,还考虑到气候变化的性质和年际变量以及长期变量

在英语中,这应该意味着:“如果我们考虑到气候变率和年际变化的性质以及长期增加的测量和计算的准确度......”

现在我想将它呈现为Reportlab PDF doc(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。您可以看到文本本身是正确且可读的(至少对于Google翻译而言),但未按预期包装RTL脚本。

python arabic right-to-left reportlab paragraph
2个回答
1
投票

如果你使用this branch of Report lab that adds RTL support

并从您的代码中删除此行:

arabic_text = get_display(arabic_text) # change orientation by using bidi

您的代码将正常运行

因为他们已经使用PyFriBiDi解决了分支,你可以看到here

来自社区的一些用户尤其是Ury Marshak,Moshe Wagner和Hosam Aly已经批准了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()

0
投票

使用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]
© www.soinside.com 2019 - 2024. All rights reserved.