Skip to content
全新发布

PDF SDK 与 AI 文档处理

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

Guides

页面缩略图

ComPDF Flutter SDK 支持将 PDF 页面渲染为缩略图,适用于页面预览、缩略图导航、文档目录、页面选择器以及自定义 PDF 管理界面等场景。

两种接入方式:

  • 使用 CPDFPageThumbnailProvider 作为 Flutter Image 组件的图片来源。
  • 使用 CPDFPageThumbnail 快速构建带占位图和错误图的缩略图 Widget。

如果应用已经打开了 PDF 文档,建议基于现有 CPDFDocument 渲染缩略图,避免重复打开文件。

快速开始

以下示例将一个已打开文档的第一页渲染为缩略图:

dart
final CPDFDocument document = await CPDFDocument.createInstance();
await document.open('/path/to/sample.pdf');

CPDFPageThumbnail.document(
  document: document,
  pageIndex: 0,
  options: const CPDFPageThumbnailOptions(width: 240),
)

API 概览

用途
CPDFPageThumbnailProvider作为 ImageProvider 传入 Flutter Image 组件
CPDFPageThumbnail快速缩略图 Widget,自带占位图和错误处理
CPDFPageThumbnailOptions渲染参数:尺寸、背景、图片格式、缓存策略
CPDFPageThumbnailService缓存管理与页面度量
CPDFPageThumbnailCachePolicy缓存策略:内存、磁盘、两者、或禁用

使用 CPDFPageThumbnailProvider

CPDFPageThumbnailProvider 是一个 ImageProvider,直接传入 Flutter 的 Image 组件。

dart
import 'package:compdfkit_flutter/compdfkit.dart';
import 'package:flutter/material.dart';

class ThumbnailView extends StatelessWidget {
  const ThumbnailView({
    super.key,
    required this.document,
    required this.pageIndex,
  });

  final CPDFDocument document;
  final int pageIndex;

  @override
  Widget build(BuildContext context) {
    return Image(
      image: CPDFPageThumbnailProvider.document(
        document: document,
        pageIndex: pageIndex,
        options: const CPDFPageThumbnailOptions(
          width: 300,
          compression: CPDFPageCompression.jpeg,
        ),
      ),
      fit: BoxFit.contain,
      errorBuilder: (context, error, stackTrace) {
        return const Icon(Icons.broken_image_outlined);
      },
    );
  }
}

使用 CPDFPageThumbnail

CPDFPageThumbnail 封装了 CPDFPageThumbnailProvider,内置占位和错误状态处理。

dart
CPDFPageThumbnail.document(
  document: document,
  pageIndex: 0,
  options: const CPDFPageThumbnailOptions(width: 300),
  fit: BoxFit.contain,
  placeholderBuilder: (context) {
    return const Center(child: CircularProgressIndicator());
  },
  errorBuilder: (context, error, stackTrace) {
    return const Icon(Icons.broken_image_outlined);
  },
)

从文件路径生成缩略图

如果没有 CPDFDocument 实例,也可以从本地 PDF 文件路径创建缩略图。

dart
Image(
  image: CPDFPageThumbnailProvider.file(
    filePath: '/path/to/sample.pdf',
    pageIndex: 0,
    password: '',
    options: const CPDFPageThumbnailOptions(width: 240),
  ),
)

当应用中已打开文档时,建议优先使用 document 来源。

渲染选项

通过 CPDFPageThumbnailOptions 控制缩略图尺寸、背景、图片格式和缓存策略。

dart
const options = CPDFPageThumbnailOptions(
  width: 600,
  backgroundColor: Colors.white,
  drawAnnot: true,
  drawForm: true,
  compression: CPDFPageCompression.jpeg,
  jpegQuality: 85,
  cachePolicy: CPDFPageThumbnailCachePolicy.memoryAndDisk,
);
参数说明
width / height缩略图目标尺寸,单位为像素。只设置一个值时,另一个值按页面比例计算
scale未设置 widthheight 时,按页面原始尺寸缩放
backgroundColor页面背景色
drawAnnot是否在缩略图中绘制注释
drawForm是否在缩略图中绘制表单控件
compression图片格式,支持 pngjpeg
jpegQualityJPEG 图片质量,范围为 1-100
cachePolicy缩略图缓存策略
diskCacheTtl磁盘缓存有效期
maxPixelCount单张缩略图允许的最大像素数

在缩略图列表中,建议设置明确的 widthheight,避免渲染尺寸过大。

缓存机制

缩略图默认启用缓存,以减少重复渲染并提升列表滑动体验。

缓存策略

策略说明
memoryOnly仅使用内存缓存
memoryAndDisk默认策略,同时使用内存和磁盘缓存
diskOnly仅使用磁盘缓存
noCache不使用 SDK 缓存

缓存标识

缓存键根据文档来源、页面索引、页面旋转角度、渲染尺寸、背景色、注释/表单开关、图片格式等信息生成。页面旋转或渲染参数变化时,会自动使用新的缓存条目。

缓存目录

磁盘缓存存放在 ComPDFKit.getTemporaryDirectory() 下的专用目录中:

text
<temporaryDirectory>/compdfkit_page_thumbnails/

缓存文件名经过 hash 处理,不保留页面索引或原始扩展名。缓存内容不会被加密。

清理缓存

dart
await CPDFPageThumbnailService.shared.clearCache();

文档更新后的刷新

如果文档内容发生变更且文件修改时间无法反映该变化(例如内存中编辑尚未保存),通过 cacheVersion 强制刷新缩略图:

dart
var cacheVersion = 0;

final provider = CPDFPageThumbnailProvider.document(
  document: document,
  pageIndex: pageIndex,
  cacheVersion: cacheVersion,
);

// 文档内容变化后,递增版本号。
cacheVersion++;

页面旋转发生变化时,缓存会自动区分不同旋转角度。

错误处理

缩略图加载可能因文件路径无效、密码错误、页面索引无效或渲染失败而失败。建议始终提供错误占位。

dart
Image(
  image: CPDFPageThumbnailProvider.document(
    document: document,
    pageIndex: pageIndex,
  ),
  errorBuilder: (context, error, stackTrace) {
    return const Icon(Icons.broken_image_outlined);
  },
)

CPDFPageThumbnail 也支持 errorBuilder

dart
CPDFPageThumbnail.document(
  document: document,
  pageIndex: pageIndex,
  errorBuilder: (context, error, stackTrace) {
    return const Text('Thumbnail failed');
  },
)

使用建议

  • 已打开文档时,优先使用 CPDFPageThumbnailProvider.documentCPDFPageThumbnail.document
  • 在已有 CPDFReaderWidgetController 的页面中,使用 controller.document 作为文档来源。
  • 缩略图列表中设置固定宽度或高度。
  • 长列表建议保留默认缓存策略,减少重复渲染。
  • 文档内存编辑后缩略图未刷新时,更新 cacheVersion
  • 始终配置 errorBuilder,保证加载失败时界面有明确反馈。