Skip to content

Text Markup Annotations

Text markup annotations visually mark existing PDF text. Foxit PDF SDK for Android provides highlight, underline, strikethrough, and squiggly via the TextMarkup base class and subtypes.

TypeConstantDescription
HighlightAnnot.e_HighlightSemi-transparent color over text
UnderlineAnnot.e_UnderlineUnderline below text
StrikethroughAnnot.e_StrikeOutLine through text
SquigglyAnnot.e_SquigglyWavy underline

QuadPoints

Text markup positioning uses QuadPoints—four points per region (usually one line). Multiple QuadPoints form a QuadPointsArray for multi-line or multi-region text.

first ──────── second
  │               │
third ──────── fourth
  • first — top-left
  • second — top-right
  • third — bottom-left
  • fourth — bottom-right

You can use an empty initial rect (0, 0, 0, 0); the annotation rect is computed from 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();

    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);
    }

    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);

Example: Underline Annotation

When text coordinates are known, build QuadPoints directly:

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();

Tip

Use Annot.e_StrikeOut or Annot.e_Squiggly instead of Annot.e_Underline for strikethrough or squiggly; the rest of the code is the same.

Common Properties

MethodDescription
getQuadPoints() / setQuadPoints(QuadPointsArray)QuadPoints array
setBorderColor(int)Mark color
setOpacity(float)Opacity (0.0 ~ 1.0)
setContent(String)Comment text in annotation panel
setTitle(String)Author/title
resetAppearanceStream()Update appearance