Java用PDFTextStripper来解析pdf文件提取文字

打印 上一主题 下一主题

主题 861|帖子 861|积分 2593

Java解析pdf详细过程

最近搞到一个任务是要解析一套雅思题目并提取其中的高频单词。那怎样使用java来解析一个pdf文件呢?
首先我们要知道这需要springboot框架来进行创建,需要的PDFTextStripper是一个用于PDF文档中提取文本的类,它是Apache PDFBox的一个类用于处理PDF文档的开源的库。其主要功能是解析文档的内容流,所以我们需要定义一个流来提取其中的文字内容。
所以我们先引入pdfbox相关的依赖,详细如下:
  1. <dependency>
  2.     <groupId>org.apache.pdfbox</groupId>
  3.     <artifactId>fontbox</artifactId>
  4.     <version>2.0.0</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.apache.pdfbox</groupId>
  8.     <artifactId>jempbox</artifactId>
  9.     <version>1.8.11</version>
  10. </dependency>
  11. <dependency>
  12.     <groupId>org.apache.pdfbox</groupId>
  13.     <artifactId>xmpbox</artifactId>
  14.     <version>2.0.0</version>
  15. </dependency>
  16. <dependency>
  17.     <groupId>org.apache.pdfbox</groupId>
  18.     <artifactId>preflight</artifactId>
  19.     <version>2.0.0</version>
  20. </dependency>
  21. <dependency>
  22.     <groupId>org.apache.pdfbox</groupId>
  23.     <artifactId>pdfbox-tools</artifactId>
  24.     <version>2.0.0</version>
  25. </dependency>
复制代码
这是比较完整的一套依赖。我们把提交pdf和接收pdf用一种post的方式进行上传,这样会显得提交方式非常的灵活。
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Upload PDF</title>
  6. </head>
  7. <body>
  8. <h1>Upload PDF File</h1>
  9. <form action="/api/files/upload-pdf" method="post" enctype="multipart/form-data">
  10.     <input type="file" name="file" accept="application/pdf" required>
  11.     <button type="submit">Upload</button>
  12. </form>
  13. </body>
  14. </html>
复制代码
然后我们简单写一个controller
  1. @RestController
  2. @RequestMapping("/api/files")
  3. public class ReadFileController {
  4.     @Autowired
  5.     private ExtractService extractService;
  6.     @PostMapping("/upload-pdf")
  7.     public ResponseEntity<Object> uploadPdf(@RequestParam("file") MultipartFile file) {
  8.         // 验证文件是否为空
  9.         if (file.isEmpty()) {
  10.             return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File is empty");
  11.         }
  12.         // 验证文件类型是否为PDF
  13.         if (!"application/pdf".equals(file.getContentType())) {
  14.             return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Only PDF files are allowed");
  15.         }
  16.         String file_name = file.getOriginalFilename();
  17.         
  18.         String filePath = extractService.Run(file,file_name);
复制代码
我们可以看到表单提交的action就是我们controller里面的路径,提交之后我们在做一个简单的文件类型判断之后就返回给了业务层进行解析。
  1. private StringBuilder accumulatedText = new StringBuilder();
  2. public List<Map.Entry<String, Integer>> read_file(MultipartFile file) {
  3.         try (InputStream inputStream = file.getInputStream()) {
  4.             try (PDDocument doc = PDDocument.load(inputStream)) {
  5.                 PDFTextStripper textStripper = new PDFTextStripper();
  6.                 textStripper.setSortByPosition(true);
  7.                 String allText = textStripper.getText(doc);
  8.                 accumulatedText.append(allText).append("\n");
  9.             }
  10.         } catch (IOException e) {
  11.             e.printStackTrace();
  12.         }
  13.         return getSortedWordList(accumulatedText.toString());
  14.     }
复制代码
这段代码首先通过file.getInputStream()获取上传文件对应的输入流,这个过程就避免了我们先把文件存到磁盘,而是直接从文件中读数据。PDDocument是Apache 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 中的其他内容,如图像或矢量图形。现在我还没有效到,日后需要解析非文字内容再做解析。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表