无法从片段内的 res/font 加载字体以在 pdfDocument 中使用

问题描述 投票:0回答:1

我想在我的片段中生成一个pdf文档...我想更改字体,因为默认字体ammit波斯/阿拉伯字符...我使用下面的代码来加载字体:

val fontData = context.assets.open("font/yekanbakh.ttf").readBytes() val fontProgram = FontProgramFactory.createFont(fontData) val myFont = PdfFontFactory.createFont(fontProgram, PdfEncodings.IDENTITY_H, true)

                val document = Document(pdfDocument, PageSize.A4)


                document.add(Paragraph(line1).setFont(myFont))
                document.add(Paragraph(line2).setFont(myFont))

但是我遇到了以下错误:

ava.io.FileNotFoundException: font/yekanbakh.ttf

我仍然尝试 context.assets.open("fonts/yekanbakh.ttf").readBytes().

但是我失败了并得到了同样的错误......完整的代码是:

val 目录= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

        val name = "hoghugh${Random.nextInt(1..1000)}"
        val myFile = File(dir, "$name.pdf")

        try {
            val fileOutputStream = FileOutputStream(myFile)
            val pdfWriter = PdfWriter(fileOutputStream)
            val pdfDocument = PdfDocument(pdfWriter)

            val typeface = ResourcesCompat.getFont(requireContext(),R.font.yekanbakh)
            val context = requireContext()

            try {
                val fontData = context.assets.open("font/yekanbakh.ttf").readBytes()
                val fontProgram = FontProgramFactory.createFont(fontData)
                val myFont = PdfFontFactory.createFont(fontProgram, PdfEncodings.IDENTITY_H, true)

                val document = Document(pdfDocument, PageSize.A4)


                document.add(Paragraph(line1).setFont(myFont))
                document.add(Paragraph(line2).setFont(myFont))


                val table1 = Table(subHeaders1.size)
                    .useAllAvailableWidth()
                    .setFontSize(10f)

                subHeaders1.forEach { col ->
                    table1.addHeaderCell(col)
                }
                body1.forEach { row ->
                    row.forEach { col ->
                        table1.addCell(col.toString())
                    }
                }
                document.add(table1)


                val table2 = Table(subHeaders2.size)
                    .useAllAvailableWidth()
                    .setFontSize(10f)

                subHeaders2.forEach { col ->
                    table2.addHeaderCell(col.toString())
                }
                body2.forEach { row ->
                    row.forEach { col ->
                        table2.addCell(col.toString())
                    }
                }
                document.add(table2)


                val table3 = Table(subHeaders3.size)
                    .useAllAvailableWidth()
                    .setFontSize(10f)

                subHeaders3.forEach { col ->
                    table3.addHeaderCell(col)
                }
                body1.forEach { row ->
                    row.forEach { col ->
                        table3.addCell(col.toString())
                    }
                }
                document.add(table3)

                document.add(Paragraph(line3))

                document.close()
                fileOutputStream.close()
android kotlin pdf fonts
1个回答
0
投票

你的代码是正确的,你的字体在错误的目录中,你必须把它放在

assets
目录中。来自
AssetsManager
context
正在使用
assets
目录,而不是
res

使用 Android studio 创建资产文件夹,如下所示:文件 -> 新建 -> 文件夹 -> 资产文件夹,然后将字体放入其中。它应该如图所示:

目录

font
用于定义应用程序将用于显示文本的字体,您无法从那里将字体加载为字节数组。

© www.soinside.com 2019 - 2024. All rights reserved.