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
相关产品推荐
相关产品推荐

