Skip to content

文本标记注释

文本标记注释(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];

提示

将类型常量替换为 FSAnnotStrikeOutFSAnnotSquiggly 即可创建删除线或波浪线注释,其余代码完全一致。

常用属性

方法说明
getQuadPoints / setQuadPoints:获取/设置四点组数组
setBorderColor:设置标记颜色
setOpacity:设置透明度(0.0 ~ 1.0)
setContent:设置注释的文本内容(注释面板中显示的批注文字)
setTitle:设置作者/标题
resetAppearanceStream生成/更新外观