使用iText7在Kotlin中生成PDF时谷歌印地语字体异常求助
Kotlin + iText7 生成含印地语PDF的字体问题修复方案
修正后的完整代码
import com.itextpdf.kernel.font.PdfFont import com.itextpdf.kernel.font.PdfFontFactory import com.itextpdf.kernel.pdf.PdfDocument import com.itextpdf.kernel.pdf.PdfWriter import com.itextpdf.layout.Document import com.itextpdf.layout.element.Paragraph fun generateHindiPdf() { val pdfOutputPath = "${System.getProperty("user.home")}/Downloads/Hindi_Document.pdf" val fontFilePath = "/absolute/path/to/martel_semibold.ttf" // 替换为实际字体文件路径 try { // 加载印地语字体,指定复杂脚本支持的编码和嵌入策略 val devanagariFont: PdfFont = PdfFontFactory.createFont( fontFilePath, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED, true, PdfFontFactory.IDENTITY_H ) // 初始化PDF写入器和文档 PdfWriter(pdfOutputPath).use { writer -> PdfDocument(writer).use { pdfDoc -> Document(pdfDoc).use { doc -> doc.defaultFont = devanagariFont // 添加印地语文本段落 val hindiParagraph = Paragraph("आपका नाम क्या है ?") doc.add(hindiParagraph) } } } println("PDF生成完成,路径:$pdfOutputPath") } catch (e: Exception) { println("PDF生成失败:${e.localizedMessage}") e.printStackTrace() } } // 调用生成函数 fun main() = generateHindiPdf()
关键修复点说明
- 字体路径正确性:必须确保
fontFilePath指向真实存在的martel_semibold.ttf文件。如果是Android项目,可将字体放在src/main/assets/fonts/目录下,通过assets.open("fonts/martel_semibold.ttf")获取输入流后传入PdfFontFactory.createFont。 - 复杂脚本编码支持:印地语(Devanagari脚本)依赖
IDENTITY_H编码才能正确渲染连写字符和复杂字形,省略此参数会导致乱码或字符断裂。 - 字体嵌入:设置
PREFER_EMBEDDED策略可将字体嵌入PDF,避免目标设备因缺少Martel字体导致显示异常。 - 资源自动释放:使用
use块自动管理PdfWriter、PdfDocument和Document的资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Aman Kumar Pandit
相关产品推荐
相关产品推荐

