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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:31:00