如何在 PDF 中正确渲染古吉拉特语(Gujarati)文本
发布时间 - 2026-01-22 00:00:00 点击率:次使用 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)。以下是适配您原始场景的修复版代码:
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'''
{text_to_add}
'''
# 关键:使用 inser
t_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 是必需的封装层:即使只插纯文本,也必须包裹在 或 中,并声明 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 文本注入——这是处理印度系文字、阿拉伯文、希伯来文等复杂书写系统的推荐标准方案。
# css
# html
# go
# adobe
# ai
# pdf
# 多语言
# google
# chrome
# 封装
# 字符串
# 古吉拉特
# 印度
# 不支持
# 这是
# 阿拉伯文
# 泰米尔
# 孟加拉
# 已有
# 并在
# 所需
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
浅谈redis在项目中的应用
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
JS弹性运动实现方法分析
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
如何自定义建站之星模板颜色并下载新样式?
想要更高端的建设网站,这些原则一定要坚持!
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何实现一对一模型关联?(Eloquent示例)
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
C++用Dijkstra(迪杰斯特拉)算法求最短路径
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
如何在IIS7上新建站点并设置安全权限?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
制作电商网页,电商供应链怎么做?
如何快速上传建站程序避免常见错误?
如何获取上海专业网站定制建站电话?
如何用狗爹虚拟主机快速搭建网站?
如何获取免费开源的自助建站系统源码?
简单实现Android验证码
如何用低价快速搭建高质量网站?
如何在建站之星网店版论坛获取技术支持?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
详解MySQL数据库的安装与密码配置
动图在线制作网站有哪些,滑动动图图集怎么做?
Laravel中的Facade(门面)到底是什么原理
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何用PHP快速搭建高效网站?分步指南
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
如何快速搭建安全的FTP站点?
如何快速启动建站代理加盟业务?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何用PHP工具快速搭建高效网站?
如何在Windows服务器上快速搭建网站?
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Python并发异常传播_错误处理解析【教程】
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法


