首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用python中的reportlab、rtl和bidi创建包含波斯语(Farsi)文本的PDF

如何用python中的reportlab、rtl和bidi创建包含波斯语(Farsi)文本的PDF
EN

Stack Overflow用户
提问于 2016-12-27 20:42:54
回答 2查看 3K关注 0票数 6

我一直在尝试创建一个PDF文件,内容可以是英语,波斯语,数字或它们的组合。

波斯语文本有一些问题,比如:“اینیکمتنفارسیاست”

۱-文本必须从右向左书写

2-单词中不同位置的字符之间存在差异(意味着字符根据周围的字符改变其形状)

3-因为句子是从右向左阅读的,所以正常的textwrap不能正常工作。

EN

回答 2

Stack Overflow用户

发布于 2016-12-27 22:00:34

我使用reportlab来创建PDf,但不幸的是reportlab不支持阿拉伯语和波斯字母,所以我使用了Vahid Mardani的'rtl‘库和Meir Kriheli的'pybidi’库来使文本在PDF结果中看起来正确。

首先,我们需要在reportlab中添加一个支持波斯语的字体:

ubuntu 14.04中的

将Bahij-Nazanin-Regular.ttf复制到/usr/local/lib/python3.4/dist-packages/reportlab/fonts文件夹

  • 并将字体和样式添加到报告and:

from reportlab.lib.enums import TA_RIGHT from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont pdfmetrics.registerFont(TTFont('Persian','Bahij-Nazanin-Regular.ttf')) getSampleStyleSheet= getSampleStyleSheet() styles.add(ParagraphStyle(name='Right',alignment=TA_RIGHT,fontName='Persian',fontSize=10))

在下一步中,我们需要将波斯语文本字母重塑为正确的形状,并使每个单词的方向从右到左:

代码语言:javascript
复制
    from bidi.algorithm import get_display
    from rtl import reshaper
    import textwrap

    def get_farsi_text(text):
        if reshaper.has_arabic_letters(text):
          words = text.split()
          reshaped_words = []
          for word in words:
            if reshaper.has_arabic_letters(word):
              # for reshaping and concating words
              reshaped_text = reshaper.reshape(word)
              # for right to left    
              bidi_text = get_display(reshaped_text)
              reshaped_words.append(bidi_text)
            else:
              reshaped_words.append(word)
          reshaped_words.reverse()
         return ' '.join(reshaped_words)
        return text

对于添加项目符号或对文本进行换行,我们可以使用以下函数:

代码语言:javascript
复制
    def get_farsi_bulleted_text(text, wrap_length=None):
       farsi_text = get_farsi_text(text)
       if wrap_length:
           line_list = textwrap.wrap(farsi_text, wrap_length)
           line_list.reverse()
           line_list[0] = '{} •'.format(line_list[0])
           farsi_text = '<br/>'.join(line_list)
           return '<font>%s</font>' % farsi_text
       return '<font>%s &#x02022;</font>' % farsi_text

为了测试我们可以写的代码:

代码语言:javascript
复制
    from reportlab.lib.pagesizes import letter
    from reportlab.platypus import SimpleDocTemplate, Paragraph
    from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

    doc = SimpleDocTemplate("farsi_wrap.pdf", pagesize=letter,    rightMargin=72, leftMargin=72, topMargin=72,
                    bottomMargin=18)
    Story = []

    text = 'شاید هنوز اندروید نوقا برای تمام گوشی‌های اندرویدی عرضه نشده باشد، ولی اگر صاحب یکی از گوشی‌های نکسوس یا پیک' \
   'سل باشید احتمالا تا الان زمان نسبتا زیادی را با آخرین نسخه‌ی اندروید سپری کرده‌اید. اگر در کار با اندروید نوقا' \
   ' دچار مشکل شده‌اید، با دیجی‌کالا مگ همراه باشید تا با هم برخی از رایج‌ترین مشکلات گزارش شده و راه حل آن‌ها را' \
   ' بررسی کنیم. البته از بسیاری از این روش‌ها در سایر نسخه‌های اندروید هم می‌توانید استفاده کنید. اندروید برخلاف iOS ' \
   'روی گستره‌ی وسیعی از گوشی‌ها با پوسته‌ها و اپلیکیشن‌های اضافی متنوع نصب می‌شود. بنابراین تجویز یک نسخه‌ی مشترک برا' \
   'ی حل مشکلات آن کار چندان ساده‌ای نیست. با این حال برخی روش‌های عمومی وجود دارد که بهتر است پیش از هر چیز آن‌ها را' \
   ' بیازمایید.'
    tw = get_farsi_bulleted_text(text, wrap_length=120)
    p = Paragraph(tw, styles['Right'])
    Story.append(p)
    doc.build(Story)
票数 8
EN

Stack Overflow用户

发布于 2017-07-29 17:15:58

如果有人想要使用Django从html模板生成pdf,可以这样做:

代码语言:javascript
复制
template = get_template("app_name/template.html")
context = Context({'something':some_variable})
html = template.render(context)
pdf = pdfkit.from_string(html, False)
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=output.pdf'
return response
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41345450

复制
相关文章

相似问题

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