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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:48:23