Skip to content
全新发布

PDF SDK 与 AI 文档处理

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

Guides

复制页面

ComPDF Flutter SDK 提供页面复制接口,用于复制当前 PDF 文档中的指定页面,并将复制后的页面插入到目标位置。这个接口适合用于页面重排、模板页复用和快速生成相似内容页面的场景。

API 概览

页面复制接口位于 CPDFDocument

dart
Future<bool> copyPage({
  required int pageIndex,
  required int insertIndex,
});

参数说明:

参数说明
pageIndex要复制的源页面索引,从 0 开始
insertIndex复制页面插入位置,从 0 开始;传入 -1 时表示追加到文档末尾

返回值为 bool

  • true:页面复制并插入成功。
  • false:页面索引无效、插入位置无效,或原生平台复制失败。

复制指定页面

使用 copyPage(pageIndex, insertIndex) 可以复制当前文档中的某一页,并将副本插入到指定位置。

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

final bool result = await document.copyPage(
  pageIndex: 0,
  insertIndex: 1,
);

print('Copy page result: $result');

上面示例会将第 1 页复制一份,并插入到第 2 页之前。

如果将 insertIndex 设为 -1,则会把复制页追加到文档末尾:

dart
final bool result = await document.copyPage(
  pageIndex: 0,
  insertIndex: -1,
);

在 CPDFReaderWidget 中使用

在阅读器页面中,可以通过 CPDFReaderWidgetController.document 调用相同接口。复制完成后,通常需要刷新阅读器页面以显示新的页数。

dart
Future<void> copyCurrentPage(CPDFReaderWidgetController controller) async {
  final int pageIndex = await controller.getCurrentPageIndex();

  final bool result = await controller.document.copyPage(
    pageIndex: pageIndex,
    insertIndex: -1,
  );

  if (result) {
    controller.reloadPages();
  }
}

这个方式适用于在自定义工具栏、页面菜单或批量页面操作中提供页面复制能力。

完整示例

下面示例演示如何打开 PDF,将第一页复制并追加到文档末尾。

dart
import 'package:compdfkit_flutter/document/cpdf_document.dart';

Future<void> duplicateFirstPage(String filePath) async {
  final CPDFDocument document = await CPDFDocument.createInstance();
  await document.open(filePath);

  final bool result = await document.copyPage(
    pageIndex: 0,
    insertIndex: -1,
  );

  if (!result) {
    throw Exception('Copy page failed.');
  }

  print('Page copied successfully.');
}

注意事项

  • pageIndex 必须是当前文档中存在的页面索引,否则接口会返回 false
  • insertIndex 支持 0..pageCount,传入 -1 时表示追加到文档末尾。
  • 页面复制会改变文档页数,如果你在阅读器中使用该接口,请在成功后刷新页面状态。
  • 当文档为空、页面索引无效或原生 SDK 不支持当前文档状态时,接口会返回 false
  • 如果需要复制多页,请按业务顺序多次调用 copyPage,或先将目标页整理后再执行复制。