为何使用PdfRenderer生成Bitmap时会出现黑色边框?
解决PdfRenderer生成Bitmap出现不明黑色边框的问题
我帮你分析了几个可能导致黑色边框出现的原因,结合你提供的Android代码来看:
1. 尺寸计算的精度偏差
你当前用(int)(203.0 / 72.0 * mCurrentPage.getWidth() + 0.5)来做DPI转换取整,这种手动加0.5的方式可能因为浮点运算的精度问题,导致Bitmap尺寸和实际渲染内容的尺寸差1像素,未被填充的空白区域就会显示Bitmap默认的黑色背景。
建议改用Math.round()来做更精准的取整:
float dpiScale = 203.0f / 72.0f; int width = Math.round(mCurrentPage.getWidth() * dpiScale); int height = Math.round(mCurrentPage.getHeight() * dpiScale);
2. 渲染区域未明确指定
你调用mCurrentPage.render()时传入的第二个参数是null,让系统自动适配渲染区域,有时候这种自动适配会出现细微偏移,导致边缘出现未填充的黑色区域。
可以手动指定和Bitmap完全匹配的渲染矩形,确保内容填满整个Bitmap:
Rect destRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); mCurrentPage.render(bitmap, destRect, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT);
3. PDF页面本身存在隐藏边距
有些PDF文件自带默认的空白边距(即使视觉上看不到),PdfRenderer会完整渲染这些边距区域,转换为Bitmap后就显示成了黑色边框。
你可以通过getCropBox()获取PDF页面的实际内容区域,只渲染这个区域的内容:
RectF cropBox = mCurrentPage.getCropBox(); float scaleX = bitmap.getWidth() / cropBox.width(); float scaleY = bitmap.getHeight() / cropBox.height(); Rect srcRect = new Rect( (int)cropBox.left, (int)cropBox.top, (int)cropBox.right, (int)cropBox.bottom ); Rect destRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); mCurrentPage.render(bitmap, destRect, srcRect, PdfRenderer.Page.RENDER_MODE_FOR_PRINT);
4. Bitmap默认背景为黑色
你创建的ARGB_8888 Bitmap默认背景是黑色,如果渲染的PDF内容没有完全覆盖整个Bitmap(比如尺寸计算有偏差),就会露出黑色背景。
可以在渲染前给Bitmap填充白色背景,从根源避免黑色边框:
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // 先填充白色背景 Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); // 再执行渲染 mCurrentPage.render(bitmap, destRect, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT);
内容的提问来源于stack exchange,提问作者fralbo
相关产品推荐
相关产品推荐

