已删除用户
发布于 2023-08-30 / 2 阅读 / 0 评论 / 0 点赞

用pdf分段读取pdf文件

用pdfbox实现分段读取pdf文件

导入依赖

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

读取内容示例

代码示例

                    List<CoordinatesEntity> response = new ArrayList<>();
                    // 处理PDF文档
                    PDDocument doc = PDDocument.load(inputStream);
                    int pageNumber = doc.getNumberOfPages();
                    PDFTextStripper stripper = new PDFTextStripper() {
                        @Override
                        protected void writeString(String text1, List<TextPosition> textPositions) {
                            for (TextPosition text : textPositions) {
                                CoordinatesEntity one = new CoordinatesEntity(text.getUnicode(), text.getXDirAdj(),                            text.getYDirAdj());
                                response.add(one);
                            }
                        }
                    };
                    stripper.setSortByPosition(true);
                    stripper.setStartPage(1);
                    stripper.setEndPage(pageNumber);
                    stripper.getText(doc);
                    Float x = response.get(0).getX();
                    Float y = response.get(0).getY();
                    String line = response.get(0).getLine();
                    float contentFirstX = -1;
                    float contentFirstY = -1;
                    float contentX;
                    float contentY;
                    float lastY = -1;
                    StringBuilder title = new StringBuilder();
                    title.append(line);
                    StringBuilder content = new StringBuilder();
                    for (CoordinatesEntity entity : response) {
                        if (entity.getX() > x && Objects.equals(entity.getY(), y)) {
                            title.append(entity.getLine());
                        } else if (!Objects.equals(entity.getY(), y) && !Objects.equals(entity.getX(), x)) {
                            if (contentFirstX == -1 && contentFirstY == -1) {
                                // 起始段落x
                                contentFirstX = entity.getX();
                                // 起始段落y
                                contentFirstY = entity.getY();
                            }
                            // 内容体x
                            contentX = entity.getX();
                            // 内容体y
                            contentY = entity.getY();
                            if (contentX == contentFirstX && contentY != lastY) {
                                content.append("/n").append(entity.getLine());
                            } else {
                                content.append(entity.getLine());
                            }
                            lastY = contentY;
                        }

                    }
                    String[] split = content.toString().split("/n");
                    List<String> list = Arrays.asList(split);
                    list = list.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
                    result.put("title", title);
                    result.put("content", list);
                    doc.close();

思路:

  1. 先获取每个字的 line 字段值 x x坐标 y y坐标 封装成对象 放到集合中

  2. 开启排序 设置 开始 结束页

  3. 第一行内容体就是文本的标题, 读取到的第一个字记录它的x y 为标题的开始坐标 titleX 和 titleY 遍历集合 比对 x y 如果 x>titleX && y == titleY 拼接line 就是文本的title 当y发生变化时 就时换行

  4. 记录读取的换行的第一个字的坐标 x y 为 contentFirstX contentFirstY 并设置 lastY 记录上一个字的y坐标 如果 contentX == contentFirstX && contentY != lastY 段落开始的x坐标相等并且y坐标不等于上一个字的y坐标即换行的第一个字

  5. 最后封装title 和 content 返回

结果:



评论