You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Fitz库插入古吉拉特语文本至PDF时渲染异常求助

古吉拉特语文本在PyMuPDF(Fitz)中渲染异常的解决方法

使用Fitz(PyMuPDF子模块)向PDF插入经googletrans翻译的古吉拉特语文本时,渲染出现错误:实际输出为રવ્ નિદર નાકરાણી,但预期应为રવિન્દ્ર નાકરાણી。相关代码如下:

import fitz

def add_text_to_pdf(pdf_path, output_path,  text_to_add):
    # Open the PDF
    pdf_document = fitz.open(pdf_path)
    # set coordinnates for text
    coordinates = (175,215)

    # Get the number of pages in the PDF
    num_pages = pdf_document.page_count

    for page_num in range(num_pages):
        # Get the page
        if page_num == 2:
            page = pdf_document[page_num]
            new_ste = text_to_add
                
            page.insert_text((coordinates[0], coordinates[1]), str(new_ste),fontfile = font_path ,fontsize = 13,color = (0,0,0),fontname = 'Shruti')
    
    # Save the modified PDF
    pdf_document.save(output_path)
    pdf_document.close()
    
# Example usage
if __name__ == "__main__": 
    input_pdf_path = file_path
    output_pdf_path = "Outpugt.pdf"
    translator = Translator()
    result = translator.translate('Ravindra Nakrani', src='en',dest='gu')
    print(result.text)
    text_to_add = result.text
    add_text_to_pdf(input_pdf_path, output_pdf_path, text_to_add)

问题原因

  • 古吉拉特语属于复杂脚本语言,存在字符连字(Ligature)组合规则,insert_text方法对这类字符组合的支持有限,无法正确拼接成预期的完整字符。
  • 指定fontfile参数时,fontname属于冗余参数,会被系统忽略,无需额外设置。

解决方法

  1. 替换为insert_textbox方法:该方法对复杂脚本的连字处理更完善,能正确渲染古吉拉特语的组合字符。
  2. 确保字体文件路径正确:确认使用的Shruti字体文件完整且路径无误,也可替换为对复杂脚本支持更好的字体(如Noto Sans Gujarati)。
  3. 清理冗余参数:删除无效的fontname参数,避免潜在冲突。

修改后的代码

import fitz
from googletrans import Translator

def add_text_to_pdf(pdf_path, output_path, text_to_add):
    # 打开PDF文档
    pdf_document = fitz.open(pdf_path)
    # 文本起始坐标与文本框尺寸(可按需调整)
    x, y = 175, 215
    box_width, box_height = 200, 50

    for page_num in range(pdf_document.page_count):
        if page_num == 2:
            page = pdf_document[page_num]
            # 使用insert_textbox处理复杂脚本字符
            page.insert_textbox(
                fitz.Rect(x, y, x + box_width, y + box_height),
                text_to_add,
                fontfile=font_path,
                fontsize=13,
                color=(0, 0, 0),
                align=fitz.TEXT_ALIGN_LEFT
            )
    
    # 保存并关闭文档
    pdf_document.save(output_path)
    pdf_document.close()

if __name__ == "__main__":
    input_pdf_path = "你的输入PDF路径.pdf"
    output_pdf_path = "Output.pdf"
    font_path = "你的Shruti字体文件路径.ttf"  # 替换为实际字体路径
    translator = Translator()
    result = translator.translate('Ravindra Nakrani', src='en', dest='gu')
    print(result.text)  # 先确认翻译结果无误
    add_text_to_pdf(input_pdf_path, output_pdf_path, result.text)

额外注意事项

  • 若仍有渲染问题,尝试升级PyMuPDF到最新版本:pip install --upgrade pymupdf
  • 测试字体是否能正常加载:可通过fitz.Font(fontfile=font_path)验证,无报错则说明字体有效

内容的提问来源于stack exchange,提问作者Vijay Bokade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:32:54