4

このアラビア語のスニペットがあるとしましょう:

إذالبارطبي頭البالمن救い

英語では、これは次のような意味になります。「<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 サポートを追加するレポート ラボのこのブランチを使用する場合

コードから次の行を削除します。

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 に答える
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 に答える