当前位置: 首页 > article >正文

如何使用java来解析一个pdf文件呢?

最近搞到一个任务是要解析一套雅思题目并提取其中的高频单词。那如何使用java来解析一个pdf文件呢?

首先我们要知道这需要springboot框架来进行创建,需要的PDFTextStripper是一个用于PDF文档中提取文本的类,它是Apache PDFBox的一个类用于处理PDF文档的开源的库。其主要功能是解析文档的内容流,所以我们需要定义一个流来提取其中的文字内容。

所以我们先引入pdfbox相关的依赖,具体如下:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>jempbox</artifactId>
    <version>1.8.11</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>xmpbox</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>preflight</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-tools</artifactId>
    <version>2.0.0</version>
</dependency>

这是比较完整的一套依赖。我们把提交pdf和接收pdf用一种post的方式进行上传,这样会显得提交方式非常的灵活。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Upload PDF</title>
</head>
<body>
<h1>Upload PDF File</h1>
<form action="/api/files/upload-pdf" method="post" enctype="multipart/form-data">
    <input type="file" name="file" accept="application/pdf" required>

    <button type="submit">Upload</button>
</form>
</body>
</html>

然后我们简单写一个controller

@RestController
@RequestMapping("/api/files")
public class ReadFileController {
    @Autowired
    private ExtractService extractService;
    @PostMapping("/upload-pdf")
    public ResponseEntity<Object> uploadPdf(@RequestParam("file") MultipartFile file) {
        // 验证文件是否为空
        if (file.isEmpty()) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File is empty");
        }

        // 验证文件类型是否为PDF
        if (!"application/pdf".equals(file.getContentType())) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Only PDF files are allowed");
        }
        String file_name = file.getOriginalFilename();
        
        String filePath = extractService.Run(file,file_name);

我们可以看到表单提交的action就是我们controller里面的路径,提交之后我们在做一个简单的文件类型判断之后就返回给了业务层进行解析。

private StringBuilder accumulatedText = new StringBuilder();
public List<Map.Entry<String, Integer>> read_file(MultipartFile file) {
        try (InputStream inputStream = file.getInputStream()) {
            try (PDDocument doc = PDDocument.load(inputStream)) {
                PDFTextStripper textStripper = new PDFTextStripper();
                textStripper.setSortByPosition(true);

                String allText = textStripper.getText(doc);
                accumulatedText.append(allText).append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return getSortedWordList(accumulatedText.toString());
    }

这段代码首先通过file.getInputStream()获取上传文件对应的输入流,这个过程就避免了我们先把文件存到磁盘,而是直接从文件中读数据。PDDocumentApache PDFBox库中的一个类,用于表示PDF文档。此语句确保了PDDocument对象在使用后会被正确关闭。PDFTextStripper 是 Apache PDFBox 库中的一个类,用于从 PDF 文档中提取文本。它提供了一种简单而有效的方法来遍历 PDF 的内容,并将其中的文本元素抽取出来形成字符串。PDFTextStripper 可以解析 PDF 页面上的文本对象,并将它们转换为可读的字符串格式。通过设置 setSortByPosition(true),可以确保提取的文本按照其在页面上的实际位置进行排序,这有助于保持文本的自然阅读顺序。默认情况下,PDFTextStripper 按照文本对象在 PDF 文件中的出现顺序提取文本,这可能会导致文本顺序混乱。

StringBuilder 是 Java 中的一个类,它提供了可变的字符序列,允许你高效地构建、修改和操作字符串。与 String 类不同,String 是不可变的(immutable),每次对 String 的修改都会创建一个新的 String 对象,而 StringBuilder 是可变的(mutable),可以在同一个对象上进行多次修改而不创建新的对象。这使得 StringBuilder 在需要频繁修改字符串的情况下更加高效。

尽管 PDFTextStripper 主要用于文本提取,但它也可以与 PDFStreamEngine 结合使用,以处理 PDF 中的其他内容,如图像或矢量图形。目前我还没有用到,日后需要解析非文字内容再做解析。


http://www.kler.cn/a/446097.html

相关文章:

  • 电商数据流通的未来:API接口的智能化与自动化趋势
  • 【使用MCP协议连接本地和远程数据——以Claude的Windows客户端为例】
  • 项目搭建+删除(单/批)
  • CH340系列芯片驱动电路·CH340系列芯片驱动!!!
  • uniapp自定义树型结构数据弹窗,给默认选中的节点,禁用所有子节点
  • Mamba安装环境和使用,anaconda环境打包
  • 12_HTML5 Video(视频) --[HTML5 API 学习之旅]
  • 嵌入的律动,科技的心跳
  • 【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
  • react 项目打包二级目 使用BrowserRouter 解决页面刷新404 找不到路由
  • [Unity Shader]【图形渲染】【游戏开发】 Unity Shader与原始Shader的区别
  • 电脑除尘更换cpu和显卡硅脂过程及安装win11系统中遇到的问题
  • Django 中的 reverse 【反向/逆转/扭转/逆向】使用详解以及使用案例
  • C# 模式匹配
  • C++打小怪游戏
  • Dhatim FastExcel 读写 Excel 文件
  • MFC/C++学习系列之简单记录3——不同IDE版本和MSFlexGrid的使用
  • java 根据路径下载文件转换为MultipartFile,并且上传到服务器
  • ttf字体文件转化为pf2字体文件
  • 使用 Django 和 AWS ECR 实现容器化应用的管理
  • Qt创建自定义Help文档步骤
  • FFmpeg 安装教程(Windows 系统)
  • 【Mysql】函数有哪些
  • 深度学习模型中增加随机性可以通过多种方式实现,以下是一些可以应用到你的 `TCNAttentionLSTM`
  • 【路径规划】原理及实现
  • ESXi安装【真机和虚拟机】(超详细)