1. 引入pom文件
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.28</version>
</dependency>
2. 創(chuàng)建坐標(biāo)點(diǎn)實(shí)體
通過四個點(diǎn)虚循,確定一個高亮區(qū)域嗓袱,創(chuàng)建一個實(shí)體方便輸入坐標(biāo)扫倡。
public class PositionPoint {
private float[] leftLower;
private float[] rightLower;
private float[] leftTop;
private float[] rightTop;
public PositionPoint(){
}
public float[] getLeftLower() {
return leftLower;
}
public PositionPoint setLeftLower(float x,float y) {
this.leftLower = new float[]{x, y};
return this;
}
public float[] getRightLower() {
return rightLower;
}
public PositionPoint setRightLower(float x,float y) {
this.rightLower = new float[]{x, y};
return this;
}
public float[] getLeftTop() {
return leftTop;
}
public PositionPoint setLeftTop(float x,float y) {
this.leftTop = new float[]{x, y};
return this;
}
public float[] getRightTop() {
return rightTop;
}
public PositionPoint setRightTop(float x,float y) {
this.rightTop = new float[]{x, y};
return this;
}
}
3. 通過PDFBox設(shè)置高亮區(qū)域
添加設(shè)置PDF高亮區(qū)域分為以下幾個步驟
- 讀取PDF文件
- 獲取添加注釋的頁對象
- 獲取頁對象中已包含的注釋集合
- 創(chuàng)建文本標(biāo)記注釋豹缀,并設(shè)置標(biāo)記類型為高亮
- 設(shè)置PDF矩形大小
- 設(shè)置注釋的位置點(diǎn)
- 設(shè)置注釋的顏色
- 添加創(chuàng)建的文本標(biāo)記注釋到注釋集合
- 輸出文件流
- 關(guān)閉流
示例代碼如下:
public static void main( String[] args )
{
try {
String inputPath = "your PDF input file path";
String outputPath = "your PDF output file path";
//創(chuàng)建需要添加高亮的區(qū)域塊坐標(biāo)
List<PositionPoint> groupPoint = new ArrayList<>();
PositionPoint positionPoint1 = new PositionPoint();
positionPoint1.setLeftLower(100,100);
positionPoint1.setLeftTop(100,200);
positionPoint1.setRightLower(200,100);
positionPoint1.setRightTop(200,200);
PositionPoint positionPoint2 = new PositionPoint();
positionPoint2.setLeftLower(300,100);
positionPoint2.setLeftTop(300,200);
positionPoint2.setRightLower(500,100);
positionPoint2.setRightTop(500,200);
groupPoint.add(positionPoint1);
groupPoint.add(positionPoint2);
float[] pointArray = new float[groupPoint.size()*8];
int index = 0;
for (int k = 0; k < groupPoint.size(); k++) {
PositionPoint point = groupPoint.get(k);
pointArray[index++] = point.getLeftLower()[0];
pointArray[index++] = point.getLeftLower()[1];
pointArray[index++] = point.getRightLower()[0];
pointArray[index++] = point.getRightLower()[1];
pointArray[index++] = point.getLeftTop()[0];
pointArray[index++] = point.getLeftTop()[1];
pointArray[index++] = point.getRightTop()[0];
pointArray[index++] = point.getRightTop()[1];
}
//讀取PDF文件
PDDocument document = PDDocument.load(new File(inputPath));
//獲取添加注釋的頁對象
PDPage page = document.getPage(0);
//獲取頁對象中已包含的注釋集合
List<PDAnnotation> annotations = page.getAnnotations();
if (annotations == null) {
annotations = new ArrayList<>();
page.setAnnotations(annotations);
}
//創(chuàng)建文本標(biāo)記注釋坟漱,并設(shè)置標(biāo)記類型為高亮
PDAnnotationTextMarkup textMarkupAnnotation = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);
//設(shè)置PDF矩形大小
textMarkupAnnotation.setRectangle(PDRectangle.A4);
//設(shè)置注釋的位置點(diǎn)
textMarkupAnnotation.setQuadPoints(pointArray);
//設(shè)置注釋的顏色
textMarkupAnnotation.setColor(new PDColor(new float[]{0, 0, 0}, PDDeviceRGB.INSTANCE));
//添加創(chuàng)建的文本標(biāo)記注釋
annotations.add(textMarkupAnnotation);
//輸出流
document.save(outputPath);
//關(guān)閉流
document.close();
}catch (Exception e){
e.printStackTrace();
}
}
這段示例代碼是在一個注釋中添加了兩個區(qū)域的黑色高亮塊鼠次,可以通過修改PDColor中的RGB值控制高亮顏色;如需要添加多個高亮注釋可以創(chuàng)建多個PDAnnotationTextMarkup類芋齿,設(shè)置屬性并加入到注釋集合中须眷;另外PDFBox并不支持直接在文本上添加高亮,需要獲取到對應(yīng)文本的位置沟突,計(jì)算坐標(biāo)來添加高亮花颗,或者有更好的方案小伙伴歡迎一起討論!