文本标记注释
文本标记注释(Text Markup)用于对 PDF 文档中的现有文本进行视觉标记。福昕 PDF SDK iOS 版通过 FSTextMarkup 基类及其子类型提供高亮、下划线、删除线、波浪线四种标记方式。
| 类型 | 类型常量 | 说明 |
|---|---|---|
| 高亮 | FSAnnotHighlight | 以半透明色块覆盖文本 |
| 下划线 | FSAnnotUnderline | 在文本下方添加下划线 |
| 删除线 | FSAnnotStrikeOut | 在文本中间添加删除线 |
| 波浪线 | FSAnnotSquiggly | 在文本下方添加波浪线 |
核心概念:QuadPoints
文本标记注释的定位依赖 QuadPoints(四点组),每个 QuadPoints 由四个点定义一个覆盖区域(通常对应一行文本的矩形),多个 QuadPoints 组成 FSQuadPointsArray 以覆盖多行或跨区域文本。
first ──────── second
│ │
third ──────── fourth
四个点的对应关系:
first— 左上角second— 右上角third— 左下角fourth— 右下角
创建文本标记注释时,可以将初始矩形设为空(0, 0, 0, 0),注释矩形会根据设置的 QuadPoints 自动计算。
示例:基于文本搜索结果创建高亮注释
以下示例演示先搜索页面中的目标文本,然后根据搜索结果的位置创建高亮注释。
objc
#import <FoxitRDK/FSPDFObjC.h>
FSPDFDoc *doc = [[FSPDFDoc alloc] initWithPath:@"path/to/Sample.pdf"];
[doc load:nil];
FSPDFPage *page = [doc getPage:0];
// 创建文本搜索对象
FSTextSearch *textSearch = [[FSTextSearch alloc] initWithDocument:doc cancel_callback:nil];
[textSearch setPattern:@"foxit"];
if ([textSearch findNext]) {
// 获取匹配文本的矩形区域
FSRectFArray *rects = [textSearch getMatchRects];
// 将每个矩形转换为 QuadPoints
FSQuadPointsArray *quadPointsArray = [[FSQuadPointsArray alloc] init];
for (int i = 0; i < [rects getSize]; i++) {
FSRectF *rect = [rects getAt:i];
FSQuadPoints *qp = [[FSQuadPoints alloc] init];
FSPointF *first = [[FSPointF alloc] init];
[first set:[rect getLeft] y:[rect getTop]];
FSPointF *second = [[FSPointF alloc] init];
[second set:[rect getRight] y:[rect getTop]];
FSPointF *third = [[FSPointF alloc] init];
[third set:[rect getLeft] y:[rect getBottom]];
FSPointF *fourth = [[FSPointF alloc] init];
[fourth set:[rect getRight] y:[rect getBottom]];
[qp setFirst:first];
[qp setSecond:second];
[qp setThird:third];
[qp setFourth:fourth];
[quadPointsArray add:qp];
}
// 创建高亮注释(初始矩形为空,将根据 QuadPoints 自动计算)
FSRectF *emptyRect = [[FSRectF alloc] initWithLeft1:0 bottom1:0 right1:0 top1:0];
FSAnnot *annot = [page addAnnot:FSAnnotHighlight rect:emptyRect];
FSTextMarkup *highlight = [[FSTextMarkup alloc] initWithAnnot:annot];
[highlight setQuadPoints:quadPointsArray];
[highlight setBorderColor:0xFFFF0000]; // 红色
[highlight setOpacity:0.3f]; // 30% 透明度
[highlight resetAppearanceStream];
}
[doc saveAs:@"path/to/output.pdf" saveFlags:FSPDFDocSaveFlagNormal];
示例:创建下划线注释
如果已知文本在页面上的坐标区域,可直接构造 QuadPoints 创建下划线注释:
objc
FSPDFPage *page = [doc getPage:0];
FSQuadPoints *qp = [[FSQuadPoints alloc] init];
FSPointF *first = [[FSPointF alloc] init];
[first set:72 y:750];
FSPointF *second = [[FSPointF alloc] init];
[second set:300 y:750];
FSPointF *third = [[FSPointF alloc] init];
[third set:72 y:730];
FSPointF *fourth = [[FSPointF alloc] init];
[fourth set:300 y:730];
[qp setFirst:first];
[qp setSecond:second];
[qp setThird:third];
[qp setFourth:fourth];
FSQuadPointsArray *quadPointsArray = [[FSQuadPointsArray alloc] init];
[quadPointsArray add:qp];
FSRectF *emptyRect = [[FSRectF alloc] initWithLeft1:0 bottom1:0 right1:0 top1:0];
FSAnnot *annot = [page addAnnot:FSAnnotUnderline rect:emptyRect];
FSTextMarkup *underline = [[FSTextMarkup alloc] initWithAnnot:annot];
[underline setQuadPoints:quadPointsArray];
[underline setBorderColor:0xFF00AA00]; // 绿色
[underline resetAppearanceStream];
提示
将类型常量替换为 FSAnnotStrikeOut 或 FSAnnotSquiggly 即可创建删除线或波浪线注释,其余代码完全一致。
常用属性
| 方法 | 说明 |
|---|---|
getQuadPoints / setQuadPoints: | 获取/设置四点组数组 |
setBorderColor: | 设置标记颜色 |
setOpacity: | 设置透明度(0.0 ~ 1.0) |
setContent: | 设置注释的文本内容(注释面板中显示的批注文字) |
setTitle: | 设置作者/标题 |
resetAppearanceStream | 生成/更新外观 |