如何将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
相关产品推荐
相关产品推荐

