Skip to content
ComPDF
Guides

PDF 页面转图片

您可以通过代码将指定页码渲染为 Bitmap,用于保存或显示在 ImageView 中。以下示例展示了如何获取文档第一页的缩略图。

java
// 使用子线程渲染 PDF 页为 Bitmap
new Thread(() -> {
    // 1. 获取文档的第一页
    CPDFPage cpdfPage = document.pageAtIndex(0);

    // 2. 获取页面尺寸
    RectF pageSize = cpdfPage.getSize();
    int pageWidth = (int) pageSize.width();
    int pageHeight = (int) pageSize.height(); // 注意:原代码 height 错写成 width,这里修正

    // 3. 设置渲染区域参数(可调整以渲染局部区域)
    int patchX = 0;               // 渲染起点 X 坐标
    int patchY = 0;               // 渲染起点 Y 坐标
    int patchW = pageWidth;       // 渲染区域宽度
    int patchH = pageHeight;      // 渲染区域高度

    // 4. 设置渲染参数
    int bgColor = 0xFFFFFFFF;     // 背景色白色
    boolean isDrawAnnot = true;   // 是否渲染注释
    boolean isDrawForm = true;    // 是否渲染表单内容

    // 5. 创建目标 Bitmap
    Bitmap bitmap = Bitmap.createBitmap(patchW, patchH, Bitmap.Config.RGB_565);

    // 6. 计算缩放比例(目标宽度 / 页面宽度)
    float scale = (float) pageWidth / pageSize.width();

    // 7. 渲染 PDF 页面到 Bitmap
    boolean renderResult = cpdfPage.renderPage(
            bitmap,    // 渲染目标 Bitmap
            scale,     // 缩放比例
            pageWidth, // 输出宽度
            pageHeight,// 输出高度
            patchX,    // 渲染区域 X 起点
            patchY,    // 渲染区域 Y 起点
            patchW,    // 渲染区域宽度
            patchH,    // 渲染区域高度
            bgColor,   // 背景色
            255,       // 渲染透明度
            0,         // 渲染旋转角度
            isDrawAnnot,// 是否绘制注释
            isDrawForm  // 是否绘制表单
    );

    // 8. 在主线程更新 UI
    runOnUiThread(() -> {
        if (renderResult && bitmap != null) {
            // 显示渲染后的 Bitmap
            ivImage.setImageBitmap(bitmap);
        }
    });
}).start();
kotlin
// 使用子线程渲染 PDF 页面为 Bitmap
Thread {
    // 1. 获取文档的第一页
    val cpdfPage: CPDFPage = document.pageAtIndex(0)

    // 2. 获取页面尺寸
    val pageSize: RectF = cpdfPage.size
    val pageWidth: Int = pageSize.width().toInt()
    val pageHeight: Int = pageSize.height().toInt() // 注意:原代码错误使用 width,这里已修正

    // 3. 设置渲染区域参数(可调整以渲染局部区域)
    val patchX = 0               // 渲染起点 X 坐标
    val patchY = 0               // 渲染起点 Y 坐标
    val patchW = pageWidth       // 渲染区域宽度
    val patchH = pageHeight      // 渲染区域高度

    // 4. 设置渲染参数
    val bgColor = 0xFFFFFFFF.toInt() // 背景色白色
    val isDrawAnnot = true          // 是否渲染注释
    val isDrawForm = true           // 是否渲染表单内容

    // 5. 创建目标 Bitmap
    val bitmap = Bitmap.createBitmap(patchW, patchH, Bitmap.Config.RGB_565)

    // 6. 计算缩放比例(目标宽度 / 页面宽度)
    val scale = pageWidth.toFloat() / pageSize.width()

    // 7. 渲染 PDF 页面到 Bitmap
    val renderResult = cpdfPage.renderPage(
        bitmap,       // 渲染目标 Bitmap
        scale,        // 缩放比例
        pageWidth,    // 输出宽度
        pageHeight,   // 输出高度
        patchX,       // 渲染区域 X 起点
        patchY,       // 渲染区域 Y 起点
        patchW,       // 渲染区域宽度
        patchH,       // 渲染区域高度
        bgColor,      // 背景色
        255,          // 渲染透明度
        0,            // 渲染旋转角度
        isDrawAnnot,  // 是否绘制注释
        isDrawForm    // 是否绘制表单
    )

    // 8. 在主线程更新 UI
    runOnUiThread {
        if (renderResult) {
            // 显示渲染后的 Bitmap
            ivImage.setImageBitmap(bitmap)
        }
    }
}.start()

如果集成使用了ComPDFKit_Tools模块 我们还提供了通过Glide库渲染PDF缩略图

java
// ================================
// 使用 Glide 渲染 PDF 页示例
// ================================

// 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
// ================================
// 使用 Glide 渲染 PDF 页面示例
// ================================

// 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)