reportlab的段落flowab中没有正确包装阿拉伯语文本

2024-05-23 17:33:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

另一方面,也有人会将此一情况与否,而此两种情况又是如何进行的,而另一种情况则是如何仅通过一项仅能将一项仅产产一次的情况的情况,而另一方面则是如何通过该项产产产产إ产产产产إ产产产产أ产产产أ产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产的一个产产产产的是一个,另一个产产的产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产产另一方面,则是如何利用第二款的情况,而另一方面则是如何利用第二款的情况,而另一方面则是如何利用第二款的情况,而另一方面则是如何利用第二款的情况,而另一方面则是如何产产产产157;157;157;157;;157;;的;;;;;و;;;怎样的 怎样通过的怎样的怎样的怎样怎样的怎样的怎样的怎样的怎样的Ÿ159;;怎样的产产产产产产产产产产产产另一方面,该公司更是将该公司的情况与该公司的情况进行了对比,而该公司则是将该公司的情况与该公司的情况进行了对比,而该公司又将该公司的情况与该公司的情况进行了比较,而该公司又将该公司的情况与该公司的情况进行了对比,而该公司的主要是如何将该公司的情况与该公司的情况进行了对比,而该公司是如何将该公司的情况与该公司的情况进行了对比,而该公司是如何将该公司的情况与该公司的情况进行的,而该公司是如何将该公司的情况与该公司的情况进行的,而该公司的情况是如何通过该公司的方式进行的,而该公司是如何通过该公司的方式进行的,而该公司如何通过该公司的情况如何将该公司的情况与如何将如何将ة

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

现在我想将其呈现为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。您可以看到文本本身是正确的和可读的(至少对于googletranslate),但并没有像RTL脚本那样被包装。在


Tags: text利用docpdfstyle方式情况公司
3条回答

使用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]

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

并从代码中删除这一行:

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

您的代码将正常运行

因为它们已经用PyFriBiDi的分支解决了 如您所见here

Some users from the community notably Ury Marshak, Moshe Wagner and Hosam Aly have contributed batches to get PyFriBibi working with ReportLab. We have created an SVN branch for this development and it is available at ...

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

我已成功运行了您代码的此修改版本并生成了正确的结果:

^{pr2}$

使用以下代码。它能很好地包装它。在

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)

相关问题 更多 >