Skip to content
全新发布

PDF SDK 与 AI 文档处理

在 GitHub 获取完整的私有化部署SDK 包及 AI 智能文档处理能力,一键部署,快速构建您的文档处理工作流。

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 缩略图。

以下示例中的 pageIndexurirenderImageWidthrenderImageHeight 需要根据实际业务场景提供。

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)