Android应用视图转PDF并打开:已生成Bitmap,求转PDF方案
将Android视图的Bitmap导出为PDF并打开
你已经成功生成了视图的Bitmap,接下来可以通过Android原生的PdfDocument类将Bitmap转换为PDF,然后调用系统PDF查看器打开文件。以下是修改后的完整实现:
1. 替换生成逻辑,创建PDF文件
把你原来保存图片的代码替换为以下生成PDF的逻辑:
val date = Date() val format = DateFormat.format("MM-dd-yyyy_hh:mm:ss", date) try { val mainDir = File( requireContext().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "FilShare" ) if (!mainDir.exists()) { mainDir.mkdirs() // 用mkdirs确保多级目录可创建 } // 定义PDF文件路径 val pdfPath = "$mainDir/$u_id-$format.pdf" val pdfFile = File(pdfPath) view?.isDrawingCacheEnabled = true val bitmap = view?.let { Bitmap.createBitmap(it.drawingCache) } view?.isDrawingCacheEnabled = false bitmap?.let { bmp -> // 初始化PDF文档 val pdfDocument = PdfDocument() // 配置PDF页面尺寸与Bitmap一致 val pageInfo = PdfDocument.PageInfo.Builder(bmp.width, bmp.height, 1).create() // 创建页面并获取画布 val page = pdfDocument.startPage(pageInfo) val canvas = page.canvas // 将Bitmap绘制到PDF页面 canvas.drawBitmap(bmp, 0f, 0f, null) // 完成页面编辑 pdfDocument.finishPage(page) // 写入PDF文件 pdfDocument.writeTo(FileOutputStream(pdfFile)) // 关闭文档 pdfDocument.close() // 打开生成的PDF openPdfFile(requireContext(), pdfFile) // 回收Bitmap释放内存 bmp.recycle() } } catch (e: IOException) { e.printStackTrace() }
2. 添加打开PDF的工具方法
实现调用系统PDF查看器的逻辑:
private fun openPdfFile(context: Context, pdfFile: File) { // 通过FileProvider获取文件Uri(适配Android 7.0+) val uri = FileProvider.getUriForFile( context, "${context.packageName}.fileprovider", // 替换为你的App的FileProvider权限名 pdfFile ) val intent = Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, "application/pdf") flags = Intent.FLAG_GRANT_READ_URI_PERMISSION // 授予临时读取权限 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } // 检查是否有可处理PDF的应用 if (intent.resolveActivity(context.packageManager) != null) { context.startActivity(intent) } else { Toast.makeText(context, "未找到PDF查看应用", Toast.LENGTH_SHORT).show() } }
3. 配置FileProvider(必填)
Android 7.0及以上需要配置FileProvider来安全共享文件:
- 在
AndroidManifest.xml的<application>标签内添加:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
- 在
res/xml目录下创建file_paths.xml文件:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-files-path name="documents" path="FilShare/" /> </paths>
内容的提问来源于stack exchange,提问作者Haseeb Javaid
相关产品推荐
相关产品推荐

