使用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属于冗余参数,会被系统忽略,无需额外设置。
解决方法
- 替换为
insert_textbox方法:该方法对复杂脚本的连字处理更完善,能正确渲染古吉拉特语的组合字符。 - 确保字体文件路径正确:确认使用的Shruti字体文件完整且路径无误,也可替换为对复杂脚本支持更好的字体(如Noto Sans Gujarati)。
- 清理冗余参数:删除无效的
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
相关产品推荐
相关产品推荐

