讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 PDF 中正确渲染古吉拉特语(Gujarati)文本

夏敏大大_2525

夏敏大大_2525

发布时间:2026-01-22 11:53:23

|

424人浏览过

|

来源于php中文网

原创

如何在 PDF 中正确渲染古吉拉特语(Gujarati)文本

使用 pymupdf(fitz)向 pdf 插入古吉拉特语等复杂脚本文字时,若直接调用 `insert_text()` 且未正确配置字体与渲染方式,易出现字符错位、连字断裂(如“રવ્ નિદર”而非“રવિન્દ્ર”),根本原因是 `insert_text()` 不支持 opentype 特性(如 gsub/gpos 表),无法处理印度系文字的上下文连字与元音附标定位。

要可靠渲染古吉拉特语(以及泰米尔语、印地语、孟加拉语等印度系文字),必须避免 page.insert_text(),而应改用 page.insert_htmlbox() —— 这是 PyMuPDF 内置的轻量级 HTML 渲染引擎,底层基于 MuPDF 的 HTML/CSS 解析器,原生支持 Unicode、双向文本(BIDI)、OpenType 字体特性(包括连字、元音位置调整、辅音簇组合),能准确还原复杂脚本的视觉呈现。

✅ 正确做法:使用 insert_htmlbox()

insert_htmlbox() 接收 HTML 字符串和一个矩形区域(rect),自动选择系统或嵌入字体,并启用完整文本整形(shaping)。以下是适配您原始场景的修复版代码:

free_google_search_with_browser
free_google_search_with_browser

使用 scrapling 搜索 Google 并返回结构化结果(标题、链接、摘要)。当用户要求搜索 Google 或在线查找信息时调用。

下载
import fitz
from googletrans import Translator

def add_gujarati_text_to_pdf(pdf_path, output_path, text_to_add):
    # 打开现有 PDF(注意:insert_htmlbox 可用于已有文档)
    doc = fitz.open(pdf_path)

    # 定义插入区域:x0, y0, x1, y1(左上→右下)
    # 示例:在第3页(索引2)的 (175, 215) 附近放置一个宽150高40的文本框
    rect = fitz.Rect(175, 215, 325, 255)  # 宽度=150, 高度=40

    for page_num in range(doc.page_count):
        if page_num == 2:  # 第三页(0-indexed)
            page = doc[page_num]

            # 构建带内联样式的 HTML(确保字体可读且支持 Gujarati)
            html = f'''
            <div style="
                font-family: 'Noto Sans Gujarati', 'Shruti', sans-serif;
                font-size: 13px;
                color: #000000;
                line-height: 1.2;
            ">{text_to_add}</div>
            '''

            # 关键:使用 insert_htmlbox 替代 insert_text
            page.insert_htmlbox(rect, html)
            break

    # 启用字体子集化(减小体积,保留所需字符)
    doc.subset_fonts()

    # 保存并压缩
    doc.save(output_path, garbage=3, deflate=True)
    doc.close()

# 使用示例
if __name__ == "__main__":
    input_pdf_path = "input.pdf"
    output_pdf_path = "output_with_gujarati.pdf"

    translator = Translator()
    result = translator.translate('Ravindra Nakrani', src='en', dest='gu')
    gujarati_name = result.text  # 如:રવિન્દ્ર નાકરાણી
    print("Translated:", gujarati_name)

    add_gujarati_text_to_pdf(input_pdf_path, output_pdf_path, gujarati_name)

⚠️ 关键注意事项

  • 字体选择:insert_htmlbox() 会自动查找系统中已安装的支持古吉拉特语的字体(如 Noto Sans Gujarati、Shruti、Lohit Gujarati)。若目标环境无合适字体,需提前将 .ttf 文件嵌入 PDF(通过 doc.embed_font()),并在 HTML 中指定 font-family。
  • 坐标与尺寸:insert_htmlbox() 使用 Rect(x0,y0,x1,y1),不是 (x,y) 点坐标;务必预留足够高度(≥ fontsize × 1.4)以容纳上下标与连字。
  • HTML 是必需的封装层:即使只插纯文本,也必须包裹在 <div> 或 <span> 中,并声明 font-family 和 font-size,否则可能回退到不支持的默认字体。
  • 不支持 fontfile= 参数:insert_htmlbox() 不接受 fontfile=,字体由 CSS 控制;如需强制使用特定字体文件,请先调用 doc.embed_font("path/to/NotoSansGujarati-Regular.ttf"),再在 HTML 中引用其 PostScript 名(可通过 fitz.Font(fontfile=...) 获取)。
  • 性能提示:insert_htmlbox() 比 insert_text() 略慢,但对单次插入完全可忽略;批量插入时建议复用 doc 实例,避免重复解析。

✅ 验证是否成功

生成 PDF 后,用 Adobe Acrobat 或最新版 Chrome 打开,检查:

  • “રવિન્દ્ર” 是否显示为连贯字符(િ 正确附着在 ર 下方,ન્ 正确形成辅音簇);
  • 无乱码、空格异常或字符分离现象;
  • 文本可被 PDF 阅读器正确复制粘贴为 Unicode 字符串。

通过 insert_htmlbox(),PyMuPDF 能真正实现多语言、多脚本的高质量 PDF 文本注入——这是处理印度系文字、阿拉伯文、希伯来文等复杂书写系统的推荐标准方案。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2466

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4339

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

3087

2026.03.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1538

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2204

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5724

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

4789

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

6514

2024.03.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.6万人学习

CSS教程
CSS教程

共754课时 | 93.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn