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

2023-11-22

我一直在尝试使用英语、波斯语、数字或它们的组合的内容创建 PDF 文件。

波斯语文本存在一些问题,例如:“??????????????”

1-文字必须从右向左书写

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

3-因为句子是从右向左阅读的,所以普通的文本换行无法正常工作。


我使用 reportlab 来创建 PDF,但不幸的是,reportlab 不支持阿拉伯语和波斯语字母,因此我使用 Vahid Mardani 的“rtl”库和 Meir Kriheli 的“pybidi”库来使文本在 PDF 结果中看起来正确。

首先我们需要向reportlab添加支持波斯语的字体:

  1. 在 ubuntu 14.04 中:

    copy Bahij-Nazanin-Regular.ttf into
    /usr/local/lib/python3.4/dist-packages/reportlab/fonts folder
    
  2. 添加字体和样式到reportlab:

    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'))
    styles = getSampleStyleSheet()
    styles.add(ParagraphStyle(name='Right', alignment=TA_RIGHT, fontName='Persian', fontSize=10))
    

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

    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

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

    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

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

    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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 python 中使用reportlab、rtl 和 bidi 创建包含波斯语(波斯语)文本的 PDF 的相关文章

  • 如何为 Android 创建我们自己的 PDF 查看器?

    我想构建一个可在我的 Android 应用程序中使用的 PDF 阅读器 查看器 但我无法使用 Google 文档来阅读我的内容 我无法使用我的设备中已安装的任何 PDF 阅读器 它应该位于我的应用程序内 并且不会通过互联网公开我的安全内容
  • pyVISA:以编程方式将仪器返回到本地模式

    我正在使用 pyVISA 来控制 GPIB 网络中的一些仪器 当我创建资源管理器时 GPIB 网络中的所有仪器都会进入远程模式 因此前面板显示被锁定并且不会更新 当我关闭资源管理器时 仪器仍处于远程模式 import visa rm vis
  • c# itextsharp如何获取数字签名图像

    是否可以使用 C 代码使用 itextsharp 获取 pdf 文件中任何数字签名的图像 PdfReader pdf new PdfReader location pdf AcroFields acroFields pdf AcroFiel
  • Python setuptools:如何在 setup.py 中添加私有存储库 (gitlab)?

    我上传了 2 个包 它们位于我的 gitlab 存储库中 如果我想使用 pip 将它们安装在我的系统中 这很容易 因为 gitlab 可以帮助您 https docs gitlab com ee user packages pypi rep
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • PyMC3-自定义 theano Op 进行数值积分

    我使用 PyMC3 进行参数估计 使用必须定义的特定似然函数 我用谷歌搜索了一下 发现我应该使用densitydist实现用户定义的似然函数的方法 但它不起作用 如何在 PyMC3 中合并用户定义的似然函数并找出最大 aposteriori
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • Python多处理错误“ForkAwareLocal”对象没有属性“连接”

    下面是我的代码 我面临着多处理问题 我看到这个问题之前已经被问过 我已经尝试过这些解决方案 但它似乎不起作用 有人可以帮我吗 from multiprocessing import Pool Manager Class X def init
  • 从另一个线程调用线程中的方法,python

    如何实现线程之间的通信 我有一个线程在其中执行一些操作 然后我需要从位于主程序线程中的对象调用一个方法 并且该方法应该在主进程中执行 class Foo def help self pass class MyThread threading
  • 如何使用itext7缩放固定矩形内的文本?

    我正在尝试使用 c 中的 itext7 制作一个 pdf 文档 该文档应该具有包含不同文本的固定矩形 这些文本应该在 不可见 矩形的边界内缩放 我试图寻找是否有自动缩放功能 但到目前为止只发现表单域的自动缩放功能 由于 pdf 将用于绘制文
  • 在 Apple TV tvOS 中渲染 PDF

    我正在为我的 tvOS 应用程序添加一个附加功能 允许查看应用程序中存储的 PDF 但是 如果没有 UIWebView 我不知道如何做到这一点 我在其他地方提出了问题 并收到了一个来自 Apple 的关于可以使用的 API 的冗长而无助的文
  • 列表推导式在 Python2 中泄漏循环变量:如何使其与 Python3 兼容

    我刚刚了解到为什么列表推导式会写入循环变量 而生成器却不会 https stackoverflow com questions 19848082 why do list comprehensions write to the loop va
  • 从 C++ 调用 Python 脚本并使用其输出

    我想从 C 调用 python 脚本 并希望使用该脚本生成的输出 csv 文件返回 C 我在 main 中尝试过 std string filename home abc xyz script py std string command p
  • 如果多个测试有特定异常,则停止 pytest 测试

    我想使用停止测试套件pytest exit 如果任何测试因特定异常而失败 例如 50 个测试 其中任何一个都可能在某个时刻因该异常而失败 如果这些测试中至少有 2 个测试因该异常而失败 我想停止执行 我试图保留一个全局计数器 一个固定装置s
  • 如果每个区域内至少有 5 个连续行,如何在每个标题区域的末尾使用 Title[Name]2 发布新行?

    我想在每个 Title 区域的末尾使用 Title Name 2 发布新行的最简单方法是通过一个计算连续行数的变量 其中至少有 5 个连续行包含 1 1 1 1在每个 标题区域内 我不确定我对计数变量做错了什么 也许 确实必须在每个 Tit
  • 使用 selenium 进行身份验证 (Python)

    我有指向我网站管理区域的链接 是否可以使用 selenium 在给定的浏览器中 启动这些 URI 链接 而无需事先进行身份验证 如果没有 那么我如何使用 selenium 处理身份验证 不确定您的意思 但您可以仅使用选择器并在身份验证字段中
  • 使用 Python 客户端库进行 gcp 计算 API 传递凭证的内容和方式

    我想使用 python google client api 获取项目中所有实例的列表google api python client 1 7 11我正在尝试使用方法连接googleapiclient discovery build此方法需要
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 在 Android 中使用 iText 读取或打开 PDF 文件

    我是 Android 应用程序开发新手 使用 iText 我完成了 PDF 创建并在创建的文件上写入 现在我想阅读该 PDF 文件 如何使用 iText 打开或阅读 PDF 文件 例子将是可观的 那么提前 哪个是渲染 PDF 文件的最佳库
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute

随机推荐

  • 将 f:viewParam 与必需的属性和命令一起使用

    我想分享我使用 primefaces f viewParam 和 p commandButton 的经验 并提出几个问题 请看一下此页面
  • 通过命令提示符在 Windows 中打开带空格的文件

    我想通过脚本在其默认程序中打开一个文件 特别是视频文件 当我遇到带有空格的文件名时 它会被视为多个参数 这并不奇怪 C folder gt start test space avi The system cannot find the fi
  • Travis-CI Android SDK 许可问题

    我正在尝试使用 Travis 构建我的 Android 项目 目前我收到错误 A problem occurred configuring project app gt You have not accepted the license a
  • 如何使用模型优先方法使用动态连接字符串,但仍使用 EDMX 中的数据模型?

    我使用 EF 5 和模型优先方法创建了 EDMX 即我从空白设计器开始并对我的实体进行建模 现在我希望能够使用 EDMX 中定义的模型 但提供运行时 SQL Server 连接字符串 而无需修改配置文件 我知道如何将连接字符串传递到 DbC
  • Javascript 从一组 URL 派生出一棵树

    伙计们正在尝试创建一个动态菜单列表 用户可以创建的元素的深度没有限制 我的问题 我的 URL 集如下所示 var json data title Food path root title Cloths path root title Veg
  • Django 说 - 没有名为“博客”的模块

    我正进入 状态 ModuleNotFoundError No module named blog 将我的博客应用程序添加到 INSTALLED APPS 部分时出错settings py 我确定这与我在 INSTALLED APPS 下添加
  • scala.util.Try 相对于 try..catch 有何优势?

    在线搜索答案给出了两个突出的帖子 Codacy s and 丹尼尔 韦斯特海德 并且都给出相同的答案Scala 的 Try 官方文档 上面示例中显示的 Try 的一个重要属性是它能够管道或链接操作 并在此过程中捕获异常 上面引用的例子是 i
  • dd() 函数中 b"string" 是什么意思?

    dd result Result description keywords b keywords字符串前面有字母 b 描述中没有这个 b 是什么意思 如果可能的话 我该如何转换字符串 顺便说一句 这是我 var dump 关键字的结果 st
  • Python Pandas read_sql_query“'NoneType'对象不可迭代”错误

    我正在尝试执行 sql 并将结果保存到 Panda Dataframe 中 这是我的代码 dbserver validserver filename myquery sql database validdb conn pyodbc conn
  • Google 一键项目状态

    有谁知道 Google One tap AKA YOLO 项目的状况如何 似乎所有的官方文档一键消失了 缓存版本指出 该 API 的 Beta 测试计划目前已结束 我们正在改进 API 的跨浏览器功能 并将在未来几个月内提供更新 有相当多的
  • 在 Java 9 中找不到模块 javafx.controls

    我在两个文件中有两个 JPMS 模块 modulea jar and moduleb jar 模块a要求javafx controls模块 我需要在新层中使用这些模块 所以我这样做 ModuleFinder finder ModuleFin
  • 使用 AngularJS 和 Pattern/RegEx 验证

    我有一个数字类型的输入 我想确保它只接受数字 我可以在服务器端很好地做到这一点 但使用 AngularJS 我无法让它工作 这是代码
  • java类存储在Oracle中的哪里?

    加载的 Java 类的 Java 字节码存储在 Oracle 数据库中的哪里 具体来说 是否有一个视图或表可以用来获取 Oracle 中 java 类模式对象的原始字节 如果您已使用 CREATE JAVA SOURCE 命令将 Java
  • ShareKit 发生变化?

    我没有太多使用 ShareKit 但我只想拥有三个共享选项 Facebook Twitter 和电子邮件 ShareKit 提供了更多选项 包括 更多 按钮 但是 我不需要 更多 选项 只需要三个选项 In SHKActionSheet m
  • 删除带有嵌套因素的条形图中每个面板未使用的因素

    前段时间我问了一个问题如何删除条形图中未使用的因素 感谢 Aaron 我为这个问题找到了一个有用的解决方案 现在 我面临着一个非常相似的问题 但我过去使用的解决方案不适用于这种情况 这是重现我正在使用的数据框的代码 set seed 17
  • 如何编写接受管道输入的 PowerShell 脚本?

    我正在尝试编写一个可以获取管道输入的PowerShell脚本 并且预计会这样做 但尝试类似 ForEach Object do something 从命令行使用脚本时实际上不起作用 如下所示 1 20 test ps1 有办法吗 注意 我了
  • 替换2个字符串之间的所有文本python

    可以说我有 a r Example This is a very annoying string that takes up multiple lines and h s a kind s of stupid symbols in it o
  • django 的模型 get_or_create 方法不应该包装在事务中吗?

    我正在浏览 django 的源代码并查看获取或创建 难道不应该用交易来包装吗 Thanks 看着这个差异看起来像修订8315 已在get or create 方法 Update 正如 reshefm 指出的 这个问题已在rev 8670 w
  • wordpress URL 以数字结尾

    我不确定这是否是一个已知问题或应该像这样的表现 任何 WordPress 网站 如果您在 URL 末尾添加数字 例如 http perishablepress com wordpress multisite mamp 我们在末尾添加 1 或
  • 如何在 python 中使用reportlab、rtl 和 bidi 创建包含波斯语(波斯语)文本的 PDF

    我一直在尝试使用英语 波斯语 数字或它们的组合的内容创建 PDF 文件 波斯语文本存在一些问题 例如 1 文字必须从右向左书写 2 单词中不同位置的字符之间存在差异 意味着字符根据周围的字符改变形状 3 因为句子是从右向左阅读的 所以普通的