Guides
PDF 页面转图片
可通过代码将指定页码渲染为 Bitmap,用于保存、预览或显示在 ImageView 中。
通常有两种实现方式:
- 使用
renderPage手动渲染:适合需要控制渲染区域、背景色、注释和表单显示等细节的场景。 - 使用
Glide渲染:适合快速生成并显示 PDF 缩略图。
以下示例展示如何将文档第一页渲染为图片。
使用 renderPage 渲染页面
这种方式适合对输出尺寸、渲染区域和渲染参数进行细粒度控制。
java
// 使用子线程渲染 PDF 页为 Bitmap
new Thread(() -> {
CPDFPage cpdfPage = document.pageAtIndex(0);
RectF pageSize = cpdfPage.getSize();
int pageWidth = (int) pageSize.width();
int pageHeight = (int) pageSize.height();
int patchX = 0;
int patchY = 0;
int patchW = pageWidth;
int patchH = pageHeight;
int bgColor = 0xFFFFFFFF;
boolean isDrawAnnot = true;
boolean isDrawForm = true;
Bitmap bitmap = Bitmap.createBitmap(patchW, patchH, Bitmap.Config.RGB_565);
float scale = (float) pageWidth / pageSize.width();
boolean renderResult = cpdfPage.renderPage(
bitmap,
scale,
pageWidth,
pageHeight,
patchX,
patchY,
patchW,
patchH,
bgColor,
255,
0,
isDrawAnnot,
isDrawForm
);
runOnUiThread(() -> {
if (renderResult && bitmap != null) {
ivImage.setImageBitmap(bitmap);
}
});
}).start();kotlin
// 使用子线程渲染 PDF 页面为 Bitmap
Thread {
val cpdfPage: CPDFPage = document.pageAtIndex(0)
val pageSize: RectF = cpdfPage.size
val pageWidth: Int = pageSize.width().toInt()
val pageHeight: Int = pageSize.height().toInt()
val patchX = 0
val patchY = 0
val patchW = pageWidth
val patchH = pageHeight
val bgColor = 0xFFFFFFFF.toInt()
val isDrawAnnot = true
val isDrawForm = true
val bitmap = Bitmap.createBitmap(patchW, patchH, Bitmap.Config.RGB_565)
val scale = pageWidth.toFloat() / pageSize.width()
val renderResult = cpdfPage.renderPage(
bitmap,
scale,
pageWidth,
pageHeight,
patchX,
patchY,
patchW,
patchH,
bgColor,
255,
0,
isDrawAnnot,
isDrawForm
)
runOnUiThread {
if (renderResult) {
ivImage.setImageBitmap(bitmap)
}
}
}.start()使用 renderPage 时,建议优先关注以下几点:
- 渲染代码应放在子线程中执行,避免阻塞主线程。
- 输出
Bitmap的尺寸和格式会直接影响清晰度与内存占用。 - 如果只需要展示缩略图,通常使用
Glide方案会更直接。
使用 Glide 渲染缩略图
如果已集成 ComPDFKit_Tools 模块,并引入 Glide 相关依赖,可以直接通过 Glide 渲染 PDF 缩略图。
以下示例中的 pageIndex、uri、renderImageWidth 和 renderImageHeight 需要根据实际业务场景提供。
java
// 1. 使用 CPDFDocument 和指定页码渲染
Glide.with(this)
.asBitmap() // 以 Bitmap 形式加载
.load(CPDFWrapper.fromDocument(document, pageIndex)) // 从已加载的 CPDFDocument 获取指定页
.diskCacheStrategy(DiskCacheStrategy.NONE) // 不使用磁盘缓存
.skipMemoryCache(true) // 不使用内存缓存
.fitCenter() // 按比例缩放,使内容居中显示
.into(ivImage); // 渲染到 ImageView
// 2. 根据 PDF 文件路径渲染第一页
Glide.with(this)
.asBitmap()
.load(CPDFWrapper.fromFile("filePath")) // 从文件路径加载 PDF
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.fitCenter()
.into(ivImage);
// 3. 根据 Uri 渲染第一页
Glide.with(this)
.asBitmap()
.load(CPDFWrapper.fromUri(uri)) // 从 Uri 加载 PDF
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.fitCenter()
.into(ivImage);
// 4. 自定义 CPDFDocumentPageWrapper 渲染
CPDFDocumentPageWrapper pageWrapper = new CPDFDocumentPageWrapper(document, pageIndex);
pageWrapper.setDrawAnnotation(true); // 是否渲染注释
pageWrapper.setDrawForms(true); // 是否渲染表单
pageWrapper.setBackgroundColor(0xFFFFFFFF); // 设置背景色(白色)
// 创建 CPDFWrapper 对象,用于 Glide 加载
CPDFWrapper wrapper = new CPDFWrapper(pageWrapper);
Glide.with(this)
.load(wrapper)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.override((int) renderImageWidth, (int) renderImageHeight) // 指定输出 Bitmap 尺寸
.into(ivImage);kotlin
// 1. 使用 CPDFDocument 和指定页码渲染
Glide.with(this)
.asBitmap() // 以 Bitmap 形式加载
.load(CPDFWrapper.fromDocument(document, pageIndex)) // 从已加载的 CPDFDocument 获取指定页
.diskCacheStrategy(DiskCacheStrategy.NONE) // 不使用磁盘缓存
.skipMemoryCache(true) // 不使用内存缓存
.fitCenter() // 按比例缩放,使内容居中显示
.into(ivImage) // 渲染到 ImageView
// 2. 根据 PDF 文件路径渲染第一页
Glide.with(this)
.asBitmap()
.load(CPDFWrapper.fromFile("filePath")) // 从文件路径加载 PDF
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.fitCenter()
.into(ivImage)
// 3. 根据 Uri 渲染第一页
Glide.with(this)
.asBitmap()
.load(CPDFWrapper.fromUri(uri)) // 从 Uri 加载 PDF
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.fitCenter()
.into(ivImage)
// 4. 自定义 CPDFDocumentPageWrapper 渲染
val pageWrapper = CPDFDocumentPageWrapper(document, pageIndex).apply {
drawAnnotation = true // 是否渲染注释
drawForms = true // 是否渲染表单
backgroundColor = 0xFFFFFFFF.toInt() // 设置背景色(白色)
}
// 创建 CPDFWrapper 对象,用于 Glide 加载
val wrapper = CPDFWrapper(pageWrapper)
Glide.with(this)
.load(wrapper)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.override(renderImageWidth.toInt(), renderImageHeight.toInt()) // 指定输出 Bitmap 尺寸
.into(ivImage)