创建注释
ComPDFKit 支持全类型的注释,包括便签,链接,图形,标记,图章,手绘,音频注释等,满足多样的注释需求。
注意: 使用函数CPDFPage.convertRectToPage
将Android设备坐标转换为PDF页面坐标;使用函数CPDFPage.convertPointFromPage
将PDF页面坐标转换为Android设备坐标
创建便签注释
便签注释表现为小型图标或标签,用户点击后可以展开显示相关注释内容,这种注释类型用于添加个人笔记、提醒或备注,使用户能够在文档中添加个性化的附加信息,而不影响原始文本的可读性。
创建便签的步骤如下:
获取需要创建注释的页面对象。
在该页面上创建便签注释对象。
设置注释属性。
更新注释外观使其显示在文档上。
创建便签的代码如下:
// 插入页码。
int pageNumber = 0;
// 获取pdf的页面实例。
CPDFPage page = document.pageAtIndex(pageNumber);
CPDFTextAnnotation textAnnotation = (CPDFTextAnnotation) page.addAnnot(CPDFAnnotation.Type.TEXT);
// 获取要插入的页面的实际大小。
RectF pageSize = page.getSize();
RectF insertRect = new RectF(0, 0, 50, 50);
textAnnotation.setColor(Color.RED);
textAnnotation.setAlpha(255);
textAnnotation.setRect(insertRect);
textAnnotation.setContent("ComPDFKit");
textAnnotation.updateAp();
创建链接注释
链接注释使用户能够直接跳转到文档中的其他位置或外部资源,提供更丰富的导航体验。
创建链接注释的步骤如下:
- 获取需要创建注释的页面对象。
- 在该页面上创建链接注释对象。
- 通过
CPDFDestination
设置链接跳转到第2页。 - 设置注释属性,并将
CPDFDestination
对象附加到注释上。
创建链接的代码如下:
// 插入页码。
int pageNumber = 1;
// 获取pdf的页面实例。
CPDFPage page = document.pageAtIndex(pageNumber);
CPDFLinkAnnotation linkAnnotation = (CPDFLinkAnnotation) page.addAnnot(CPDFAnnotation.Type.LINK);
RectF insertRect = new RectF(0,0,100,100);
linkAnnotation.setRect(insertRect);
// 跳转到指定页码
CPDFGoToAction goToAction = new CPDFGoToAction();
CPDFDestination destination = new CPDFDestination(pageNumber,0,pageSize.height(),1f);
goToAction.setDestination(document, destination);
linkAnnotation.setLinkAction(goToAction);
// 打开指定网页
CPDFUriAction uriAction = new CPDFUriAction();
uriAction.setUri("website");
linkAnnotation.setLinkAction(uriAction);
// 将注释更新到文档上。
linkAnnotation.updateAp();
创建文本注释
文本注释允许用户在 PDF 文档中插入自由格式的文字,用于添加注解、评论或解释文档内容。
创建文本注释的步骤如下:
获取需要创建注释的页面对象。
在该页面上创建文本注释对象。
设置注释属性。
更新注释外观使其显示在文档上。
创建文本注释的代码如下:
// 插入页码。
int pageNumber = 0;
// 获取pdf的页面实例。
CPDFPage page = document.pageAtIndex(pageNumber);
CPDFFreetextAnnotation freetextAnnotation = (CPDFFreetextAnnotation) page.addAnnot(CPDFAnnotation.Type.FREETEXT, document);
RectF insertRect = new RectF(0,0,100,100);
freetextAnnotation.setRect(insertRect);
// 设置注释属性。
freetextAnnotation.setContent("Hello World!");
freetextAnnotation.setFreetextAlignment(CPDFFreetextAnnotation.Alignment.ALIGNMENT_LEFT);
CPDFTextAttribute textAttribute = freetextAnnotation.getFreetextDa();
textAttribute.setColor(Color.YELLOW.getRGB());
textAttribute.setFontSize(14);
textAttribute.setFontName("fontName");
freetextAnnotation.setFreetextDa(textAttribute);
freetextAnnotation.updateAp();
// 将注释更新到文档上。
freetextAnnotation.updateAp();
创建图形注释
图形注释包括矩形、圆形、线条和箭头等形状,用于在文档中绘制图形以突出或标记特定区域,表达文字不易描述的信息。
创建图形注释的步骤如下:
获取需要创建注释的页面对象。
在该页面上依次创建矩形,圆形,线段注释对象。
设置注释属性。
依次更新注释外观使其显示在文档上。
创建图形注释的代码如下:
// 插入页码。
int pageNumber = 0;
// 获取pdf的页面实例。
CPDFPage page = document.pageAtIndex(pageNumber);
// 在该页面上创建矩形释对象。
CPDFSquareAnnotation squareAnnotation = (CPDFSquareAnnotation) page.addAnnot(CPDFAnnotation.Type.SQUARE, document);
RectF insertRect = new RectF(0,0,100,100);
squareAnnotation.setRect(insertRect);
// 设置注释属性。
squareAnnotation.setBorderColor(Color.YELLOW.getRGB());
CPDFBorderStyle borderStyle = new CPDFBorderStyle(CPDFBorderStyle.Style.Border_Solid, 10, new float[]{8.0F, 0F});
borderStyle.setBorderWidth(10F);
squareAnnotation.setBorderStyle(borderStyle);
squareAnnotation.setBorderAlpha(255);
squareAnnotation.setFillColor(Color.RED.getRGB());
squareAnnotation.setFillAlpha(255);
// 将注释更新到文档上。
squareAnnotation.updateAp();
// 在该页面上创建圆形注释对象。
CPDFCircleAnnotation circleAnnotation = (CPDFCircleAnnotation) page.addAnnot(CPDFAnnotation.Type.CIRCLE, document);
RectF insertRect = new RectF(0,0,100,100);
circleAnnotation.setRect(insertRect);
// 设置注释属性。
circleAnnotation.setBorderColor(Color.YELLOW.getRGB());
CPDFBorderStyle borderStyle = new CPDFBorderStyle(CPDFBorderStyle.Style.Border_Solid, 10, new float[]{8.0F, 0F});
borderStyle.setBorderWidth(10F);
circleAnnotation.setBorderStyle(borderStyle);
circleAnnotation.setBorderAlpha(255);
circleAnnotation.setFillColor(Color.RED.getRGB());
circleAnnotation.setFillAlpha(255);
// 将注释更新到文档上。
circleAnnotation.updateAp();
// 在该页面上创建线段注释对象。
CPDFLineAnnotation lineAnnotation = (CPDFLineAnnotation) page.addAnnot(CPDFAnnotation.Type.LINE, document);
float lineWidth = 10f;
PointF startPoint = new PointF(0,0);
PointF endPoint = new PointF(200,200);
RectF area = new RectF(0,0,200,200);
lineAnnotation.setRect(area);
lineAnnotation.setLinePoints(startPoint, endPoint);
// 设置注释属性。
lineAnnotation.setLineType(CPDFLineAnnotation.LineType.LINETYPE_NONE, CPDFLineAnnotation.LineType.LINETYPE_ARROW);
CPDFBorderStyle borderStyle = new CPDFBorderStyle(CPDFBorderStyle.Style.Border_Solid,lineWidth,null);
lineAnnotation.setBorderStyle(borderStyle);
lineAnnotation.setBorderAlpha(255);
lineAnnotation.setBorderColor(Color.RED.getRGB())
// 将注释更新到文档上。
lineAnnptation.updateAp();
线段注释类型枚举
名称 | 描述 |
---|---|
LINETYPE_UNKNOWN | 非标准或无效的线段端点。 |
LINETYPE_NONE | 没有线段端点。 |
LINETYPE_ARROW | 两条短线以尖锐的角度相交,形成一个开放的箭头。 |
LINETYPE_CLOSEDARROW | 两条短线以尖锐的角度相交,就像样式一样,并通过第三条线连接,形成一个三角形闭合的箭头,内部填充了注释的内部颜色。 |
LINETYPE_SQUARE | 一个填充有注释内部颜色的正方形。 |
LINETYPE_CIRCLE | 一个填充有注释内部颜色的圆形。 |
LINETYPE_DIAMOND | 一个填充有注释内部颜色的菱形形状。 |
LINETYPE_BUTT | 一条与线本身垂直的短线,位于端点上。 |
LINETYPE_ROPENARROW | 两条与相反方向的短线。 |
LINETYPE_RCLOSEDARROW | 一个与相反方向的三角形闭合箭头。 |
LINETYPE_SLASH | 一条短线,位于端点上,大约比与线本身垂直的方向顺时针旋转30度。 |
创建标记注释
在 PDF 文档中添加标记,以突出、强调或说明特定内容,例如重要的段落、行或单词、关键词或表格等。ComPDFKit 提供高亮,下划线,波浪线,删除线四种标记注释。
创建标记注释的步骤如下:
获取需要创建注释的页面对象。
通过页面对象创建文本对象。
使用该文本对象取得需要添加标记的文本位置。
在该页面上创建对应的标记对象。
设置标记对象的属性。
更新注释外观使其显示在文档上。
以高亮注释为例,创建标记注释的代码如下:
// 首先,从页面上的特定区域获取TextSelection数组,选择文本。
CPDFPage pdfPage = douc.pageAtIndex(1);
CPDFTextPage pdfTextPage = pdfPage.getTextPage();
RectF selectRect = new RectF(0f, 0f, 500f, 500f);
// 然后,为特定区域添加高亮显示注释。
highlightAnnotation.setQuadRects(selectRect);
highlightAnnotation.setMarkedText("text");
highlightAnnotation.setRect(annotRect);
highlightAnnotation.updateAp();
创建图章注释
图章注释用于标识和验证文档的来源和真实性,ComPDFKit 支持标准图章,文字图章,图像图章。
创建图章注释的步骤如下:
获取需要创建注释的页面对象。
在该页面上创建对应的图章。
设置图章属性。
更新注释外观使其显示在文档上。
创建图章注释的代码如下:
// 获取需要创建注释的页面对象。
int pageNumber = 0;
CPDFPage pdfPage = document.pageAtIndex(pageNumber);
// 创建标准印章。
int yOffset = 50;
float lastOffset = 0;
for (int i = 0; i < CPDFStampAnnotation.StandardStamp.values().length; i++) {
CPDFPage page = document.pageAtIndex(4);
CPDFStampAnnotation.StandardStamp standardStamp = CPDFStampAnnotation.StandardStamp.values()[i];
if (standardStamp == null || standardStamp == CPDFStampAnnotation.StandardStamp.UNKNOWN) {
continue;
}
CPDFStampAnnotation standard = (CPDFStampAnnotation) page.addAnnot(CPDFAnnotation.Type.STAMP, document);
if (standard == null) {
continue;
}
standard.setStandardStamp(standardStamp);
RectF pageSize = page.getSize();
RectF insertRect = standard.getRect();
float defaultWidth = 100F;
int x = 50;
if (i == 10) {
lastOffset = 50;
}
if (i >= 10) {
x = 150;
}
yOffset = (int) lastOffset + 10;
PointF vertex = new PointF(x, yOffset);
insertRect.set(vertex.x, vertex.y, vertex.x + defaultWidth, vertex.y + defaultWidth * Math.abs(insertRect.height() / insertRect.width()));
lastOffset = insertRect.bottom;
standard.setRect(insertRect);
standard.updateAp();
}
// 创建文字印章。
CPDFPage page = document.pageAtIndex(4);
CPDFStampAnnotation stampAnnotation = (CPDFStampAnnotation) page.addAnnot(CPDFAnnotation.Type.STAMP, document);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = df.format(new Date());
stampAnnotation.setTextStamp(new CPDFStampAnnotation.TextStamp(
"ComPDFKit", date, CPDFStampAnnotation.TextStampShape.TEXTSTAMP_RECT.id,
CPDFStampAnnotation.TextStampColor.TEXTSTAMP_GREEN.id));
RectF insertRect = stampAnnotation.getRect();
insertRect.set( insertRect);
float defaultWidth = 150f;
PointF vertex = new PointF(300, 50);
insertRect.set(vertex.x, vertex.y, vertex.x + defaultWidth, vertex.y + defaultWidth * Math.abs(insertRect.height() / insertRect.width()));
stampAnnotation.setRect(insertRect);
stampAnnotation.updateAp();
// 创建图片印章。
CPDFStampAnnotation standard = (CPDFStampAnnotation) page.addAnnot(CPDFAnnotation.Type.STAMP, document);
String imagePath = rootDir + "/TestFiles/ComPDFKit.png";
RectF imageInsertRect = new RectF(457, 626.5f, 513, 570.5f);
standard.setRect(imageInsertRect);
if (imagePath.endsWith("png")) {
File imageFile = new File(imagePath);
BufferedImage image = null;
try {
image = ImageIO.read(imageFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
int[] pixel = getPixel(image);
standard.updateApWithBitmap(pixel, image.getWidth(), image.getHeight());
} else {
standard.setImageStamp(imagePath);
standard.updateAp();
}
创建手绘注释
手绘注释直接快捷,用于直接绘制标注。
创建手绘注释的步骤如下:
获取需要创建注释的页面对象。
在该页面上创建手绘注释。
设置手绘注释经过的路径。
设置注释其他属性。
更新注释外观使其显示在文档上。
创建手绘注释的代码如下:
// 获取需要创建注释的页面对象。
int pageNumber = 0;
CPDFPage page = document.pageAtIndex(pageNumber);
// 设置手绘注释经过的路径。
CPDFPage page1 = document.pageAtIndex(0);
ArrayList<ArrayList<PointF>> mDrawing = new ArrayList<>();
ArrayList<PointF> arc1 = new ArrayList<>();
arc1.add(new PointF(100, 100));
arc1.add(new PointF(110, 110));
arc1.add(new PointF(120, 120));
mDrawing.add(arc1);
ArrayList<PointF> arc2 = new ArrayList<>();
arc2.add(new PointF(115, 115));
arc2.add(new PointF(130, 130));
arc2.add(new PointF(160, 160));
mDrawing.add(arc2);
float scaleValue = 1F;
float borderWidth = 5F;
// 在该页面上创建手绘注释。
CPDFInkAnnotation inkAnnotation = (CPDFInkAnnotation) page1.addAnnot(CPDFInkAnnotation.Type.INK, document);
inkAnnotation.setColor(Color.RED.getRGB());
inkAnnotation.setAlpha(255);
inkAnnotation.setBorderWidth(borderWidth);
RectF rect = null;
RectF size = document.getPageSize(0);
if (size.isEmpty()) {
return;
}
int lineCount = mDrawing.size();
PointF[][] path = new PointF[lineCount][];
for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) {
ArrayList<PointF> line = mDrawing.get(lineIndex);
int pointCount = line.size();
PointF[] linePath = new PointF[pointCount];
for (int pointIndex = 0; pointIndex < pointCount; pointIndex++) {
PointF point = line.get(pointIndex);
/****** 计算路径所包围的最小矩形 ******/
if (rect == null) {
rect = new RectF(point.x, point.y, point.x, point.y);
} else {
rect.union(point.x, point.y);
}
/****** 计算转换为页面并存储在linePath集合中的坐标点 ******/
linePath[pointIndex] = point;
}
path[lineIndex] = linePath;
}
float dx = borderWidth / scaleValue / 2;
rect.inset(-dx, -dx);
rect.set(rect);
inkAnnotation.setInkPath(path);
inkAnnotation.setRect(rect);
inkAnnotation.updateAp();
创建回复注释
回复注释用于对注释进行评论回复。
创建回复注释的步骤如下:
获取需要创建回复的页面对象和注释。
在该页面注释上创建回复注释。
设置注释其他属性。
创建回复注释的代码如下:
// 创建回复注释
CPDFPage page = document.pageAtIndex(0);
CPDFFreetextAnnotation freetextAnnotation = (CPDFFreetextAnnotation) page.getAnnotations().get(0); CPDFAnnotation replyAnnotation = freetextAnnotation.createReplyAnnotation();
if (replyAnnotation.isReplyAnnot()) {
Date date = new Date();
CPDFDate cpdfDate = new CPDFDate(date.getYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 480);
replyAnnotation.setCreationDate(cpdfDate);
replyAnnotation.setRecentlyModifyDate(cpdfDate);
replyAnnotation.setTitle("Guest");
replyAnnotation.setContent("ComPDFKit Reply");
}