Skip to content

形状与绘图

本文档介绍直线(Line)、矩形(Square)、圆形(Circle)、多边形(Polygon)、折线(PolyLine)以及墨迹(Ink)注释的创建和属性设置。

直线注释(Line)

直线注释用于在页面上绘制一条从起点到终点的线段,支持箭头等端点样式,常用于标注和测量。

端点样式

通过 Markup 类定义的常量设置起点/终点样式:

常量说明
Markup.e_EndingStyleNone0无端点
Markup.e_EndingStyleSquare1方形端点
Markup.e_EndingStyleCircle2圆形端点
Markup.e_EndingStyleDiamond3菱形端点
Markup.e_EndingStyleOpenArrow4开放箭头
Markup.e_EndingStyleClosedArrow5封闭箭头
Markup.e_EndingStyleButt6平头端点
Markup.e_EndingStyleROpenArrow7反向开放箭头
Markup.e_EndingStyleRClosedArrow8反向封闭箭头
Markup.e_EndingStyleSlash9斜线端点

核心方法

方法说明
getStartPoint() / setStartPoint(PointF)获取/设置起点坐标
getEndPoint() / setEndPoint(PointF)获取/设置终点坐标
getLineStartStyle() / setLineStartStyle(int)获取/设置起点端点样式
getLineEndStyle() / setLineEndStyle(int)获取/设置终点端点样式
getStyleFillColor() / setStyleFillColor(int)获取/设置端点填充颜色
hasCaption() / enableCaption(boolean)是否有标题/启用标题
getCaptionOffset() / setCaptionOffset(PointF)获取/设置标题偏移

示例:创建带箭头的直线注释

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.Line;
import com.foxit.sdk.pdf.annots.Markup;

PDFPage page = doc.getPage(0);

RectF rect = new RectF(100, 300, 400, 350);
Line line = new Line(page.addAnnot(Annot.e_Line, rect));

line.setStartPoint(new PointF(100, 325));
line.setEndPoint(new PointF(400, 325));

// 起点无端点,终点为封闭箭头
line.setLineStartStyle(Markup.e_EndingStyleNone);
line.setLineEndStyle(Markup.e_EndingStyleClosedArrow);

line.setBorderColor(0xffff0000);
line.setContent("请关注此区域。");
line.resetAppearanceStream();

矩形注释(Square)与圆形注释(Circle)

矩形和圆形注释用于在页面上绘制框选标记,均支持边框颜色和内部填充颜色。

示例:创建矩形注释

java
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.Square;

PDFPage page = doc.getPage(0);

RectF rect = new RectF(100, 600, 300, 700);
Square square = new Square(page.addAnnot(Annot.e_Square, rect));

square.setBorderColor(0xff0000ff);       // 蓝色边框
square.setFillColor(0x330000ff);         // 半透明蓝色填充
square.setOpacity(0.8f);
square.setContent("标记区域");
square.resetAppearanceStream();

示例:创建圆形注释

java
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.Circle;

PDFPage page = doc.getPage(0);

RectF rect = new RectF(100, 400, 250, 500);
Circle circle = new Circle(page.addAnnot(Annot.e_Circle, rect));

circle.setBorderColor(0xffff6600);       // 橙色边框
circle.setFillColor(0x22ff6600);         // 半透明橙色填充
circle.setContent("重点内容");
circle.resetAppearanceStream();

多边形注释(Polygon)与折线注释(PolyLine)

多边形和折线注释由多个顶点定义:多边形自动闭合首尾形成封闭区域,折线则保持开放。

示例:创建多边形注释

java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.PointFArray;
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.Markup;

PDFPage page = doc.getPage(0);

RectF rect = new RectF(100, 200, 300, 350);
Markup polygon = new Markup(page.addAnnot(Annot.e_Polygon, rect));

// 设置顶点
PointFArray vertices = new PointFArray();
vertices.add(new PointF(150, 200));
vertices.add(new PointF(300, 250));
vertices.add(new PointF(280, 350));
vertices.add(new PointF(120, 330));
polygon.setVertexes(vertices);

polygon.setBorderColor(0xff009900);
polygon.resetAppearanceStream();

墨迹注释(Ink)

墨迹注释记录用户的手绘轨迹,是手写批注、自由绘图等场景的基础。Ink 注释通过 Path 对象描述笔迹路径。

Path 对象

Path 是描述墨迹笔画的核心数据结构,支持以下操作:

方法说明
moveTo(PointF)开始新笔画(移动到起点)
lineTo(PointF)从当前位置画直线到指定点
cubicBezierTo(PointF, PointF, PointF)从当前位置画三次贝塞尔曲线
closeFigure()关闭当前图形路径
getPointCount() / getPoint(int)获取点数量/指定索引的点

示例:创建墨迹注释

java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.common.Path;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.Ink;

PDFPage page = doc.getPage(0);

RectF rect = new RectF(50, 100, 350, 300);
Ink ink = new Ink(page.addAnnot(Annot.e_Ink, rect));

// 构造笔迹路径
Path path = new Path();
path.moveTo(new PointF(60, 150));
path.lineTo(new PointF(120, 200));
path.lineTo(new PointF(200, 160));
path.lineTo(new PointF(300, 250));

ink.setInkList(path);
ink.setBorderColor(0xff000000);
ink.setOpacity(0.9f);
ink.resetAppearanceStream();

提示

如果希望使用贝塞尔曲线实现更平滑的手绘效果,可调用 ink.enableUseBezier(true) 启用贝塞尔模式。