Skip to content

PDF 生成模板编辑器

开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。

查看 GitHub
Guides

自定义注释创建流程

以下 API 看起来都与“注释事件”有关,但用途不同:

目标API对 SDK 默认行为的影响
被动得知注释已创建CPDFEvent.annotationsCreated不改变默认行为。
用 Flutter UI 替换签名、图片、图章、链接或 Note 的默认创建弹窗onAnnotationCreationPreparedCallback关闭对应自动弹窗后,应用必须完成或取消创建流程。
接管已有 Note 或 Link 的点击行为onInterceptAnnotationActionCallback开启拦截后,SDK 不再执行默认编辑或跳转行为。
接管指定表单字段的点击行为onInterceptWidgetActionCallback开启拦截后,SDK 不再执行该字段的默认行为。

接管注释创建流程

注释类型需要关闭的配置annotation 参数应用后续操作
CPDFAnnotationType.signatureautoShowSignPicker: falsenull选择图片后调用 prepareNextSignature()
CPDFAnnotationType.stampautoShowStampPicker: falsenull选择图章后调用 prepareNextStamp()
CPDFAnnotationType.picturesautoShowPicPicker: falsenull选择图片后调用 prepareNextImage()
CPDFAnnotationType.linkautoShowLinkDialog: false已创建的 CPDFLinkAnnotation设置 action 后调用 document.updateAnnotation();取消时移除该注释。
CPDFAnnotationType.noteautoShowNoteEditDialog: false已创建的 CPDFNoteAnnotation设置 content 后调用 document.updateAnnotation();取消时移除该注释。
dart
final configuration = CPDFConfiguration(
  annotationsConfig: const CPDFAnnotationsConfig(
    autoShowSignPicker: false,
    autoShowStampPicker: false,
    autoShowPicPicker: false,
    autoShowLinkDialog: false,
    autoShowNoteEditDialog: false,
  ),
);

签名、图章和图片在回调触发时尚未添加到页面:

dart
await controller.prepareNextSignature(signaturePath);
await controller.prepareNextImage(imagePath);
await controller.prepareNextStamp(
  standardStamp: CPDFStandardStamp.approved,
);

Link 和 Note 在回调触发时已经创建。修改 Dart 对象不会自动写回 PDF,必须显式更新或移除:

dart
if (annotation is CPDFNoteAnnotation) {
  annotation.content = 'Updated note content';
  await controller.document.updateAnnotation(annotation);
}

// 用户取消自定义弹窗时:
if (annotation != null) {
  await controller.document.removeAnnotation(annotation);
}

自定义 Note 的创建、确认和取消完整示例参见创建注释

拦截已有注释的操作

CPDFAnnotationsConfig 中将 interceptNoteActioninterceptLinkAction 设为 true。启用拦截后,应用需要在 onInterceptAnnotationActionCallback 中处理 Note 编辑、网页链接或页面跳转。若只想观察点击而不替换默认行为,不要开启拦截。

拦截表单字段操作

CPDFFormsConfig.interceptFormWidgetActions 中只列出需要自定义处理的 CPDFFormType。在回调中修改 CPDFWidget 后,调用 controller.document.updateWidget(widget) 将结果写回 PDF。只有当应用为所有表单类型都提供了完整处理逻辑时,才使用 interceptAllFormWidgetActions: true