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

Android Studio Kotlin实现Word转PDF功能需求

Android Kotlin:将生成的Docx转换为高质量PDF(替代原Word文件)

一、免费本地转换方案(推荐,无网络依赖)

使用Docx4J的Android适配版,它能精准保留Docx格式,生成高质量PDF,完全免费且无需联网。

1. 添加依赖

在build.gradle(Module)中添加以下依赖:

implementation 'org.docx4j:docx4j-core:11.4.1'
implementation 'org.docx4j:docx4j-JAXB-ReferenceImpl:11.4.1'
implementation 'org.docx4j:docx4j-export-fo:11.4.1'
implementation 'com.github.docx4j:docx4j-android:11.4.1'

2. 修改原函数逻辑

先修正原函数参数的语法错误(date: String assetsName: String需改为date: String, assetsName: String),再添加PDF转换、替换原Word文件的逻辑:

private fun editWordFile(context: Context, name: String, date: String, assetsName: String) {
    try {
        val assetManager = applicationContext.assets
        val wordFileName = assetsName.toString()
        val inputStream: InputStream = assetManager.open(wordFileName)
        val outputDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
        val outputName = "${name}_${date}"

        try {
            // 读取并编辑Word文件
            val document = XWPFDocument(inputStream)
            for (paragraph: XWPFParagraph in document.paragraphs) {
                for (run: XWPFRun in paragraph.runs) {
                    val text = run.text()
                    if (text.contains("XDATEX")) {
                        run.setText(text.replace("XDATEX", date), 0)
                    }
                    if (text.contains("XLAMAX")) {
                        run.setText(text.replace("XLAMAX", name), 0)
                    }
                }
            }

            // 临时保存修改后的Word文件
            val tempDocxFile = File(outputDir, "${outputName}_temp.docx")
            val fos = FileOutputStream(tempDocxFile)
            document.write(fos)
            fos.close()
            inputStream.close()

            // 转换为PDF
            val pdfOutputFile = File(outputDir, "${outputName}.pdf")
            convertDocxToPdf(tempDocxFile, pdfOutputFile)

            // 删除临时Word文件
            if (tempDocxFile.exists()) {
                tempDocxFile.delete()
            }

            Toast.makeText(this, "PDF文件 ${outputName}.pdf 已下载", Toast.LENGTH_SHORT).show()

        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(context, "处理失败: ${e.message}", Toast.LENGTH_SHORT).show()
        } finally {
            if (inputStream.available() > 0) {
                inputStream.close()
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
        Toast.makeText(context, "错误: ${e.message},请联系开发者", Toast.LENGTH_SHORT).show()
    }
}

3. 实现PDF转换函数

添加转换逻辑,配置字体避免格式错乱:

private fun convertDocxToPdf(inputDocx: File, outputPdf: File) {
    try {
        val configuration = org.docx4j.configuration.Configuration()
        // 配置字体路径(可选,若Android系统字体不全,可提前放入自定义字体)
        val fontDir = "${context.getExternalFilesDir(null)}/fonts/"
        File(fontDir).mkdirs()
        configuration.setFontDir(fontDir)
        configuration.setUseFontSubstitution(true)

        val wordMLPackage = org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(inputDocx)
        val exporter = org.docx4j.convert.out.pdf.PdfSettings()
        org.docx4j.convert.out.pdf.PdfConversionUtil.convert(wordMLPackage, outputPdf, exporter)
    } catch (e: Exception) {
        e.printStackTrace()
        Toast.makeText(this, "PDF转换失败: ${e.message}", Toast.LENGTH_SHORT).show()
    }
}

4. 权限适配

  • Android 9及以下:添加WRITE_EXTERNAL_STORAGE权限到AndroidManifest.xml,并动态申请。
  • Android 10+:推荐使用MediaStore保存文件,或者申请MANAGE_EXTERNAL_STORAGE权限(针对公共下载目录),也可改用context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)作为输出目录,无需额外权限。

二、免费API方案(适合轻量场景)

若本地库适配复杂,可使用带免费额度的转换API:

  • Convertio Free Tier:每月最多10次免费转换,支持Docx转PDF,需网络请求。
  • LibreOffice Online:自行搭建开源转换服务,完全免费,适合有服务器资源的场景。

API调用逻辑示例(以文件上传转换下载流程为例):

private fun convertViaApi(inputDocx: File, outputName: String) {
    // 1. 上传Docx文件到API服务器
    // 2. 发起Docx转PDF的转换请求
    // 3. 轮询转换状态,完成后下载PDF到本地
    // 4. 删除原Docx文件
    // 注:需处理网络请求、文件上传下载的异常逻辑,且受免费额度限制
}

内容的提问来源于stack exchange,提问作者Rushi Mayur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:59:51