You need to enable JavaScript to run this app. Android开发:如何将Bitmap图像转换为PDF文件 解决生成空PDF问题
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何将Bitmap图像转换为PDF文件 解决生成空PDF问题

导致生成PDF为空的具体代码问题
  • Canvas对象与PDF页面完全脱节:代码中Canvas canvas = new Canvas()创建的是独立空画布,和正在编辑的PDF页面没有任何绑定关系,所有drawBitmap的操作都只会绘制在内存中的空画布上,完全不会写入PDF文档内容,这是PDF无内容的核心原因。PdfDocument的页面画布必须通过page.getCanvas()从Page对象中获取,才能和文档的绘制上下文打通。
  • 页面尺寸设置严重不合理:PageInfo.Builder(100, 100, 1)定义的页面尺寸单位是PDF标准点(1/72英寸),100pt仅约3.5厘米见方,远小于常规选取图片的实际尺寸。哪怕画布获取逻辑正确,绘制Bitmap时也没有做缩放适配,超出页面边界的内容会被完全截断,甚至因为坐标偏移全部落在页面可视范围外。
  • Bitmap引用存在失效风险:
    • onActivityResult中加载完Bitmap后,直接执行getContentResolver().delete(uri, null, null)删除图片对应的存储条目,该逻辑仅适用于应用自身创建的临时扫描文件,直接删除图库公共图片属于逻辑错误;
    • 代码没有提前校验返回的URI是否为null,也没有判断Bitmap是否加载成功,一旦图片读取失败、被系统内存回收,绘制操作就不会产出任何内容。
  • 存储写入权限未适配:代码直接向公共外部存储根目录写入PDF文件,没有适配Android各版本的存储规则:Android 6.0以上需要动态申请存储权限,Android 10以上需申请分区存储访问权限,Android 11以上需申请所有文件访问权限。权限不足时写入操作会被系统拦截,最终生成0字节的空文件,而代码仅对IO异常做日志打印,没有给用户反馈错误提示。
  • 缺少前置状态校验:转换流程没有校验Bitmap是否有效、目标路径是否有写入权限就直接执行写入,所有异常分支都不会中断流程,最终会生成没有实际内容的空PDF。

修正关键逻辑参考:

  • 按常规PDF尺寸(如A4规格595pt宽、842pt高)初始化页面,根据Bitmap的宽高比做缩放适配再绘制;
  • 通过page.getCanvas()获取绑定PDF页面的画布实例完成绘制;
  • 去掉图库图片的误删逻辑,增加Bitmap有效性判断;
  • 按当前系统版本适配存储权限,优先使用应用专属目录或MediaStore接口写入文件,避免权限拦截。

内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 22:36:06