注释概述
福昕 PDF SDK iOS 版支持 PDF 规范中定义的大多数注释(Annotation)类型,通过 Core SDK 提供注释的创建、属性访问与修改、外观生成与绘制等能力。
UI Extensions 内置注释功能
如果您使用的是完整阅读器(UI Extensions),常用注释(高亮、便笺、绘图、图章等)的创建与编辑已通过工具栏内置,用户可直接在 UI 中操作,无需额外编码。本文档主要面向需要通过代码操控注释的场景。
注释类型
下表列出了 PDF 规范定义的注释类型、是否属于 Markup 注释以及 SDK 的支持情况。
| 注释类型 | 类型常量 | 描述 | Markup | SDK 支持 |
|---|---|---|---|---|
| Text (Note) | FSAnnotNote | 便笺/文本批注 | 是 | 支持 |
| Link | FSAnnotLink | 链接跳转注释 | 否 | 支持 |
| FreeText | FSAnnotFreeText | 自由文本(打字机/文本框/标注框) | 是 | 支持 |
| Line | FSAnnotLine | 直线/箭头等线条标注 | 是 | 支持 |
| Square | FSAnnotSquare | 矩形框标注 | 是 | 支持 |
| Circle | FSAnnotCircle | 圆形/椭圆标注 | 是 | 支持 |
| Polygon | FSAnnotPolygon | 多边形标注 | 是 | 支持 |
| PolyLine | FSAnnotPolyLine | 折线标注 | 是 | 支持 |
| Highlight | FSAnnotHighlight | 文本高亮标注 | 是 | 支持 |
| Underline | FSAnnotUnderline | 文本下划线标注 | 是 | 支持 |
| Squiggly | FSAnnotSquiggly | 波浪下划线标注 | 是 | 支持 |
| StrikeOut | FSAnnotStrikeOut | 删除线标注 | 是 | 支持 |
| Stamp | FSAnnotStamp | 图章/印章标注 | 是 | 支持 |
| Caret | FSAnnotCaret | 插入符号标注 | 是 | 支持 |
| Ink | FSAnnotInk | 手绘墨迹/自由笔迹 | 是 | 支持 |
| Popup | FSAnnotPopup | 弹出窗口(显示/编辑注释内容) | 否 | 支持 |
| FileAttachment | FSAnnotFileAttachment | 文件附件注释 | 是 | 支持 |
| Sound | FSAnnotSound | 声音注释 | 是 | 不支持 |
| Movie | FSAnnotMovie | 影片注释 | 否 | 不支持 |
| Widget | FSAnnotWidget | 表单字段控件注释 | 否 | 支持 |
| Screen | FSAnnotScreen | 屏幕/媒体播放注释 | 否 | 支持 |
| PrinterMark | FSAnnotPrinterMark | 印刷标记注释 | 否 | 不支持 |
| TrapNet | FSAnnotTrapNet | 陷印网注释 | 否 | 不支持 |
| Watermark | FSAnnotWatermark | 水印注释 | 否 | 不支持 |
| 3D | FSAnnot3D | 3D 注释 | 否 | 不支持 |
| Redact | FSAnnotRedact | 密文脱敏注释 | 是 | 支持 |
备注
SDK 额外支持一种自定义注释类型 PSI(Pressure Sensitive Ink,压感笔迹),对应常量 FSAnnotPSInk。该类型在 PDF 规范中未定义,通常用于手写场景。
SDK 不支持 PDF 规范中的 Watermark(水印注释)类型,但支持以页面内容形式添加的水印,详见水印。
基础类层次
SDK 注释类采用继承结构,不同类型的注释从公共基类派生:
FSAnnot ← 所有注释的基类
├── FSMarkup ← 支持标记特性的注释基类(标题、主题、透明度、回复、分组等)
│ ├── FSTextMarkup ← 文本标记注释基类(Highlight / Underline / StrikeOut / Squiggly)
│ ├── FSFreeText ← 自由文本注释
│ ├── FSNote ← 便笺注释
│ ├── FSLine ← 直线注释
│ ├── FSSquare ← 矩形注释
│ ├── FSCircle ← 圆形注释
│ ├── FSInk ← 墨迹注释
│ ├── FSStamp ← 图章注释
│ ├── FSCaret ← 插入符注释
│ ├── FSFileAttachment ← 文件附件注释
│ └── FSRedact ← 密文脱敏注释
├── FSLink ← 链接注释
├── FSScreen ← 屏幕注释
├── FSWidget ← 表单控件注释
└── FSPopup ← 弹出窗口注释
FSAnnot 基类 — 通用属性
所有注释共享以下 FSAnnot 基类方法:
| 方法 | 说明 |
|---|---|
getType | 获取注释类型(返回 FSAnnotType 常量) |
getPage | 获取注释所在页面 |
getRect / setRect: | 获取/设置注释矩形区域 |
move: | 移动注释到新位置 |
getContent / setContent: | 获取/设置注释文本内容 |
getBorderColor / setBorderColor: | 获取/设置边框颜色 |
getBorderInfo / setBorderInfo: | 获取/设置边框信息(宽度、样式、虚线模式) |
getFlags / setFlags: | 获取/设置注释标志位(如不可见、锁定等) |
getUniqueID / setUniqueID: | 获取/设置注释唯一标识 |
getModifiedDateTime / setModifiedDateTime: | 获取/设置修改时间 |
resetAppearanceStream | 重新生成注释外观流(属性修改后需调用) |
isEmpty | 检查注释对象是否为空 |
注意
修改注释属性后,必须调用 resetAppearanceStream 才能使外观更新生效。
FSMarkup 基类 — 标记注释扩展属性
Markup 注释在 FSAnnot 基础上提供以下扩展能力:
| 方法 | 说明 |
|---|---|
getTitle / setTitle: | 获取/设置作者/标题 |
getSubject / setSubject: | 获取/设置主题 |
getOpacity / setOpacity: | 获取/设置透明度(0.0 ~ 1.0) |
getIntent / setIntent: | 获取/设置意图(如 FreeText 的打字机/标注框子类型) |
getCreationDateTime / setCreationDateTime: | 获取/设置创建时间 |
getPopup / setPopup: | 获取/设置关联的弹出窗口 |
getReplyCount | 获取回复数量 |
getReply: / addReply / removeReply: | 获取/添加/删除回复(回复为 FSNote 类型) |
removeAllReplies | 删除所有回复 |
isGrouped | 判断注释是否在分组中 |
getGroupHeader / getGroupElements / ungroup | 获取分组头/分组成员/取消分组 |
getStateAnnots: / addStateAnnot:stateModel:state: | 获取/添加状态注释(审阅、标记状态) |
创建注释
通过 [FSPDFPage addAnnot:rect:] 方法在页面上创建注释:
objc
#import <FoxitRDK/FSPDFObjC.h>
FSPDFDoc *doc = [[FSPDFDoc alloc] initWithPath:@"path/to/Sample.pdf"];
[doc load:nil];
FSPDFPage *page = [doc getPage:0];
// 指定类型常量和矩形区域创建注释
FSRectF *rect = [[FSRectF alloc] initWithLeft1:100 bottom1:100 right1:130 top1:130];
FSAnnot *annot = [page addAnnot:FSAnnotNote rect:rect];
FSNote *note = [[FSNote alloc] initWithAnnot:annot];
// 设置属性
[note setIconName:@"Comment"];
[note setBorderColor:0xFF0000FF];
[note setContent:@"这是一条便笺注释。"];
// 生成外观(必须调用)
[note resetAppearanceStream];
[doc saveAs:@"path/to/output.pdf" saveFlags:FSPDFDocSaveFlagNormal];
删除注释
通过 [FSPDFPage removeAnnot:] 方法删除页面上的注释:
objc
FSAnnot *annot = [page getAnnot:0];
if (annot && ![annot isEmpty]) {
[page removeAnnot:annot];
}
注释事件监听
通过 UIExtensionsManager 注册 IAnnotEventListener,可以监听注释的添加、修改、删除等事件:
objc
[extensionsManager registerAnnotEventListener:self];
// IAnnotEventListener
- (void)onAnnotAdded:(FSPDFPage *)page annot:(FSAnnot *)annot {
NSLog(@"注释已添加: %@", [annot getContent]);
}
- (void)onAnnotDeleted:(FSPDFPage *)page annot:(FSAnnot *)annot {
NSLog(@"注释已删除");
}
- (void)onAnnotModified:(FSPDFPage *)page annot:(FSAnnot *)annot {
NSLog(@"注释已修改");
}
备注
取消注册使用 unregisterAnnotEventListener: 方法。建议在 ViewController 生命周期结束时取消注册,避免内存泄漏。
更多注释类型
各注释类型的详细用法请参阅:
- 文本标记注释 — 高亮、下划线、删除线、波浪线
- 便笺与自由文本 — 便笺、打字机、文本框、标注框、插入符
- 形状与绘图 — 直线、矩形、圆形、多边形、折线、墨迹
- 图章 — 标准图章、自定义图章
- 链接 — URI 链接、页面跳转链接
- 密文脱敏 — 创建与应用涂黑注释
- 导入与导出 — FDF/XFDF 导入导出、注释扁平化
API 参考
FSAnnot、FSMarkup、FSNote、FSLine、FSTextMarkup 等注释类的完整接口说明请参阅 API 手册。