4

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

إذاأخذstأخذأخذاااا辞طptemist

在英语中,这应该是这样的意思:“<em>如果我们考虑到气候变率和年际变率的性质,以及长期使用的测量和计算缺乏准确性……</em>。 ”</p>

现在我想将它呈现为 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 脚本的预期包装。

4

3 回答 3

1

如果您使用添加 RTL 支持的 Report lab 的这个分支

并从您的代码中删除这一行:

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

您的代码将正常运行

因为它们已经使用 PyFriBiDi 解决了分支,如您在此处看到的:

来自社区的一些用户,特别是 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()
于 2013-08-31T16:56:29.307 回答
1

使用下面的代码。它会正确包装它。

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)
于 2019-11-08T20:43:34.680 回答
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]
于 2017-01-24T13:14:59.223 回答