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

如何将View转换的长Bitmap按A4尺寸分页生成多页PDF?

解决方案

要将长Bitmap分割为A4尺寸的多页PDF,核心是按A4页面高度逐段截取Bitmap内容,逐页绘制到PDF中。以下是具体实现步骤和修改后的代码:

关键逻辑说明

  • 先根据屏幕密度计算A4页面的实际像素尺寸(A4标准尺寸为210mm×297mm)
  • 计算长Bitmap需要分割的总页数
  • 循环截取Bitmap的对应区域,逐页添加到PDF文档中

修改后的完整代码

1. 核心PDF生成方法

private void generatePdfFromView(View view) {
    Bitmap fullBitmap = getBitmapFromView(view);
    PdfDocument document = new PdfDocument();

    // 计算适配屏幕密度的A4像素尺寸
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    float mmToPx = displayMetrics.density * 0.03937f; // 1mm转像素的换算系数
    int a4WidthPx = (int) (210 * mmToPx); // A4宽度210mm
    int a4HeightPx = (int) (297 * mmToPx); // A4高度297mm

    // 计算总页数
    int totalHeight = fullBitmap.getHeight();
    int totalPages = (int) Math.ceil((float) totalHeight / a4HeightPx);

    // 逐页生成PDF
    for (int pageNum = 0; pageNum < totalPages; pageNum++) {
        // 创建A4规格的页面信息
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(a4WidthPx, a4HeightPx, pageNum + 1).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        Canvas canvas = page.getCanvas();

        // 计算当前页要绘制的Bitmap区域
        int startY = pageNum * a4HeightPx;
        int drawHeight = Math.min(a4HeightPx, totalHeight - startY);

        // 定义源区域(截取Bitmap的对应部分)和目标区域(PDF页面的绘制范围)
        Rect srcRect = new Rect(0, startY, fullBitmap.getWidth(), startY + drawHeight);
        Rect dstRect = new Rect(0, 0, a4WidthPx, drawHeight);

        // 将截取的区域绘制到PDF页面
        canvas.drawBitmap(fullBitmap, srcRect, dstRect, null);

        document.finishPage(page);
    }

    createFile(document); // 传递PDF文档给保存方法
}

2. 保留原有的View转Bitmap方法

private Bitmap getBitmapFromView(View view) {
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(returnedBitmap);

    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null) {
        bgDrawable.draw(canvas);
    } else {
        canvas.drawColor(Color.WHITE);
    }
    view.draw(canvas);

    return returnedBitmap;
}

3. 完善文件保存方法

private void createFile(PdfDocument document) {
    File pdfFile = new File(getExternalFilesDir(null), "output.pdf");
    try {
        document.writeTo(new FileOutputStream(pdfFile));
        // 可添加保存成功后的提示逻辑
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        document.close();
    }
}

额外注意事项

  • 如果View宽度超过A4宽度,可添加等比例缩放逻辑,将Bitmap缩放到A4宽度后再分页
  • 不同设备屏幕密度不同,通过mmToPx换算能保证A4尺寸的准确性
  • 注意权限申请:需要WRITE_EXTERNAL_STORAGE权限(Android 10及以上可使用应用私有目录,无需申请)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:25:00