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