美文网首页
Java PDFBox 添加高亮注释 PDF高亮

Java PDFBox 添加高亮注释 PDF高亮

作者: 都是自己人_ | 来源:发表于2023-11-19 14:23 被阅读0次

    1. 引入pom文件

        <dependency>
          <groupId>org.apache.pdfbox</groupId>
          <artifactId>pdfbox</artifactId>
          <version>2.0.28</version>
        </dependency>
    

    2. 创建坐标点实体

    通过四个点,确定一个高亮区域,创建一个实体方便输入坐标。

    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设置高亮区域

    添加设置PDF高亮区域分为以下几个步骤

    • 读取PDF文件
    • 获取添加注释的页对象
    • 获取页对象中已包含的注释集合
    • 创建文本标记注释,并设置标记类型为高亮
    • 设置PDF矩形大小
    • 设置注释的位置点
    • 设置注释的颜色
    • 添加创建的文本标记注释到注释集合
    • 输出文件流
    • 关闭流

    示例代码如下:

     public static void main( String[] args )
        {
            try {
                String inputPath = "your PDF input file path";
                String outputPath = "your PDF output file path";
    
                //创建需要添加高亮的区域块坐标
                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);
                }
    
                //创建文本标记注释,并设置标记类型为高亮
                PDAnnotationTextMarkup textMarkupAnnotation = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);
    
                //设置PDF矩形大小
                textMarkupAnnotation.setRectangle(PDRectangle.A4);
    
                //设置注释的位置点
                textMarkupAnnotation.setQuadPoints(pointArray);
    
                //设置注释的颜色
                textMarkupAnnotation.setColor(new PDColor(new float[]{0, 0, 0}, PDDeviceRGB.INSTANCE));
    
                //添加创建的文本标记注释
                annotations.add(textMarkupAnnotation);
    
                //输出流
                document.save(outputPath);
    
                //关闭流
                document.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    

    这段示例代码是在一个注释中添加了两个区域的黑色高亮块,可以通过修改PDColor中的RGB值控制高亮颜色;如需要添加多个高亮注释可以创建多个PDAnnotationTextMarkup类,设置属性并加入到注释集合中;另外PDFBox并不支持直接在文本上添加高亮,需要获取到对应文本的位置,计算坐标来添加高亮,或者有更好的方案小伙伴欢迎一起讨论!

    相关文章

      网友评论

          本文标题:Java PDFBox 添加高亮注释 PDF高亮

          本文链接:https://www.haomeiwen.com/subject/zofmwdtx.html