Skip to content

文本标记注释

文本标记注释(Text Markup)用于对 PDF 文档中的现有文本进行视觉标记。福昕 PDF SDK 安卓版通过 TextMarkup 基类及其子类型提供高亮、下划线、删除线、波浪线四种标记方式。

类型类型常量说明
高亮Annot.e_Highlight以半透明色块覆盖文本
下划线Annot.e_Underline在文本下方添加下划线
删除线Annot.e_StrikeOut在文本中间添加删除线
波浪线Annot.e_Squiggly在文本下方添加波浪线

核心概念:QuadPoints

文本标记注释的定位依赖 QuadPoints(四点组),每个 QuadPoints 由四个点定义一个覆盖区域(通常对应一行文本的矩形),多个 QuadPoints 组成 QuadPointsArray 以覆盖多行或跨区域文本。

first ──────── second
  │               │
third ──────── fourth

四个点的对应关系:

  • first — 左上角
  • second — 右上角
  • third — 左下角
  • fourth — 右下角

创建文本标记注释时,可以将初始矩形设为空(0, 0, 0, 0),注释矩形会根据设置的 QuadPoints 自动计算。

示例:基于文本搜索结果创建高亮注释

以下示例演示先搜索页面中的目标文本,然后根据搜索结果的位置创建高亮注释。

java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.common.fxcrt.RectFArray;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.TextPage;
import com.foxit.sdk.pdf.TextSearch;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.QuadPoints;
import com.foxit.sdk.pdf.annots.QuadPointsArray;
import com.foxit.sdk.pdf.annots.TextMarkup;

PDFDoc doc = new PDFDoc("path/to/Sample.pdf");
doc.load(null);
PDFPage page = doc.getPage(0);

// 创建文本搜索对象
TextSearch textSearch = new TextSearch(doc, null, TextPage.e_ParseTextNormal);
textSearch.setPattern("foxit");

if (textSearch.findNext()) {
    // 获取匹配文本的矩形区域
    RectFArray rects = textSearch.getMatchRects();

    // 将每个矩形转换为 QuadPoints
    QuadPointsArray quadPointsArray = new QuadPointsArray();
    for (int i = 0; i < rects.getSize(); i++) {
        RectF rect = rects.getAt(i);
        QuadPoints qp = new QuadPoints();
        qp.setFirst(new PointF(rect.getLeft(), rect.getTop()));
        qp.setSecond(new PointF(rect.getRight(), rect.getTop()));
        qp.setThird(new PointF(rect.getLeft(), rect.getBottom()));
        qp.setFourth(new PointF(rect.getRight(), rect.getBottom()));
        quadPointsArray.add(qp);
    }

    // 创建高亮注释(初始矩形为空,将根据 QuadPoints 自动计算)
    RectF emptyRect = new RectF(0, 0, 0, 0);
    TextMarkup highlight = new TextMarkup(
        page.addAnnot(Annot.e_Highlight, emptyRect));

    highlight.setQuadPoints(quadPointsArray);
    highlight.setBorderColor(0xffff0000);  // 红色
    highlight.setOpacity(0.3f);            // 30% 透明度
    highlight.resetAppearanceStream();
}

doc.saveAs("path/to/output.pdf", PDFDoc.e_SaveFlagNormal);

示例:创建下划线注释

如果已知文本在页面上的坐标区域,可直接构造 QuadPoints 创建下划线注释:

java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.QuadPoints;
import com.foxit.sdk.pdf.annots.QuadPointsArray;
import com.foxit.sdk.pdf.annots.TextMarkup;

PDFPage page = doc.getPage(0);

QuadPoints qp = new QuadPoints();
qp.setFirst(new PointF(72, 750));
qp.setSecond(new PointF(300, 750));
qp.setThird(new PointF(72, 730));
qp.setFourth(new PointF(300, 730));

QuadPointsArray quadPointsArray = new QuadPointsArray();
quadPointsArray.add(qp);

TextMarkup underline = new TextMarkup(
    page.addAnnot(Annot.e_Underline, new RectF(0, 0, 0, 0)));
underline.setQuadPoints(quadPointsArray);
underline.setBorderColor(0xff00aa00);  // 绿色
underline.resetAppearanceStream();

提示

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

常用属性

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