使用Android PdfDocument将单图转单页PDF时生成多页问题求助
问题原因
你遇到的单图生成PDF出现两页的问题,核心是两个常见的Android PdfDocument 开发误区:
- 代码未正确关闭
PdfDocument实例,导致PDF文件结构不完整,生成冗余空白页 - 页面尺寸单位错误:
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
相关产品推荐
相关产品推荐

