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

使用Android PdfDocument将单图转单页PDF时生成多页问题求助

问题原因

你遇到的单图生成PDF出现两页的问题,核心是两个常见的Android PdfDocument 开发误区:

  1. 代码未正确关闭PdfDocument实例,导致PDF文件结构不完整,生成冗余空白页
  2. 页面尺寸单位错误:PdfDocument.PageInfo.Builder接收的宽高单位是PostScript点(1点=1/72英寸),你直接传入Bitmap的像素宽高,会生成远超常规单页尺寸的超大页面,大部分PDF阅读器会自动将超大页拆分为多页渲染,看起来就像生成了两页。

解决步骤

  • 补全PdfDocument的关闭逻辑,建议放在finally块中保证一定会执行
  • 将Bitmap的像素宽高转换为正确的点单位,避免页面尺寸过大
  • 生成前先删除旧的目标PDF文件,避免旧内容残留

修改后的完整代码

android.graphics.pdf.PdfDocument document = new android.graphics.pdf.PdfDocument();
FileOutputStream fos = null;
try {
    // 先删除旧文件避免残留
    File targetPdf = new File("/storage/emulated/0/folder/img/test.pdf");
    if (targetPdf.exists()) {
        targetPdf.delete();
    }

    File item = new File("/storage/emulated/0/folder/img/test.png");
    Bitmap bitmap = BitmapFactory.decodeFile(item.getAbsolutePath());
    
    // 像素转PDF点单位:按72DPI标准转换,也可以按实际需求适配A4等标准尺寸
    float density = getResources().getDisplayMetrics().densityDpi;
    int pageWidth = (int) (bitmap.getWidth() * 72f / density);
    int pageHeight = (int) (bitmap.getHeight() * 72f / density);

    android.graphics.pdf.PdfDocument.PageInfo pageInfo = new android.graphics.pdf.PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create();
    android.graphics.pdf.PdfDocument.Page page = document.startPage(pageInfo);
    Canvas canvas = page.getCanvas();
    Paint paint = new Paint();
    paint.setColor(Color.parseColor("#ffffff"));
    canvas.drawPaint(paint);
    
    // 把Bitmap缩放到适配页面尺寸
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, pageWidth, pageHeight, true);
    canvas.drawBitmap(scaledBitmap, 0, 0, null);
    document.finishPage(page);
    
    fos = new FileOutputStream(targetPdf);
    document.writeTo(fos);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 关键:关闭文档和输出流,释放资源
    if (document != null) {
        document.close();
    }
    if (fos != null) {
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果修改后还是显示两页,可以用PdfRenderer加载生成的PDF打印实际页数,确认是生成问题还是PDF阅读器的拆分渲染问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:08