• PDF转成图片并识别成文字输出记录java代码


    1. package com.example.demo.Image;
    2. import net.sourceforge.tess4j.ITesseract;
    3. import net.sourceforge.tess4j.Tesseract;
    4. import net.sourceforge.tess4j.TesseractException;
    5. import org.apache.pdfbox.pdmodel.PDDocument;
    6. import org.apache.pdfbox.rendering.PDFRenderer;
    7. import org.apache.pdfbox.rendering.ImageType;
    8. import java.awt.image.BufferedImage;
    9. import java.io.File;
    10. import java.io.IOException;
    11. public class PdfImageToText {
    12. public static void main(String[] args) {
    13. try {
    14. // 载入PDF文件
    15. PDDocument document = PDDocument.load(new File("D:\\foucus\\img\\01.pdf"));
    16. // 创建Tesseract实例
    17. ITesseract tesseract = new Tesseract();
    18. // 设置Tesseract OCR数据文件的路径(根据您的安装位置)
    19. tesseract.setDatapath("D:\\foucus\\tessdata-main\\");
    20. // 指定要识别的语言(中文)
    21. tesseract.setLanguage("chi_sim");
    22. // 创建PDF渲染器
    23. PDFRenderer pdfRenderer = new PDFRenderer(document);
    24. for (int page = 0; page < document.getNumberOfPages(); ++page) {
    25. // 渲染PDF页为图像
    26. BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
    27. // 使用Tesseract进行OCR识别
    28. String text = tesseract.doOCR(bufferedImage);
    29. // 输出识别的文本
    30. System.out.println("Page " + (page + 1) + " 识别的文本: \n" + text);
    31. }
    32. // 关闭PDF文档
    33. document.close();
    34. } catch (IOException | TesseractException e) {
    35. e.printStackTrace();
    36. }
    37. }
    38. }
    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>3.1.4version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.examplegroupId>
    12. <artifactId>demoartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>demoname>
    15. <description>demodescription>
    16. <properties>
    17. <java.version>17java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-webartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. <dependency>
    30. <groupId>net.sourceforge.tess4jgroupId>
    31. <artifactId>tess4jartifactId>
    32. <version>5.8.0version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.apache.pdfboxgroupId>
    36. <artifactId>pdfboxartifactId>
    37. <version>2.0.29version>
    38. dependency>
    39. dependencies>
    40. <build>
    41. <plugins>
    42. <plugin>
    43. <groupId>org.springframework.bootgroupId>
    44. <artifactId>spring-boot-maven-pluginartifactId>
    45. plugin>
    46. plugins>
    47. build>
    48. project>

    需要语言训练包

    GitHub - tesseract-ocr/tessdata: Trained models with fast variant of the "best" LSTM models + legacy models

    改写的代码以实现递归处理指定目录下的PDF文件,并将每个PDF文件的每个图像提取为一个文本文件,并将每个PDF的所有文本文件保存在一个单独的目录中,您需要进行一些修改。以下是修改后的Java代码示例:

    1. public class RecursivePdfImageToText {
    2. public static void main(String[] args) {
    3. String inputDirectory = "D:\\foucus\\input"; // 指定输入目录
    4. String outputBaseDirectory = "D:\\foucus\\output"; // 指定输出基础目录
    5. // 创建Tesseract实例
    6. ITesseract tesseract = new Tesseract();
    7. // 设置Tesseract OCR数据文件的路径(根据您的安装位置)
    8. tesseract.setDatapath("D:\\foucus\\tessdata-main\\");
    9. // 指定要识别的语言(中文)
    10. tesseract.setLanguage("chi_sim");
    11. processDirectory(new File(inputDirectory), new File(outputBaseDirectory), tesseract);
    12. }
    13. private static void processDirectory(File inputDir, File outputBaseDir, ITesseract tesseract) {
    14. if (inputDir.isDirectory()) {
    15. File[] files = inputDir.listFiles();
    16. if (files != null) {
    17. for (File file : files) {
    18. if (file.isDirectory()) {
    19. // 递归处理子目录
    20. processDirectory(file, outputBaseDir, tesseract);
    21. } else if (file.isFile() && file.getName().toLowerCase().endsWith(".pdf")) {
    22. // 处理PDF文件
    23. processPDF(file, outputBaseDir, tesseract);
    24. }
    25. }
    26. }
    27. }
    28. }
    29. private static void processPDF(File pdfFile, File outputBaseDir, ITesseract tesseract) {
    30. try {
    31. // 创建输出目录
    32. String pdfName = pdfFile.getName().replace(".pdf", "");
    33. File pdfOutputDir = new File(outputBaseDir, pdfName);
    34. pdfOutputDir.mkdirs();
    35. // 读取PDF文件
    36. PDDocument document = PDDocument.load(pdfFile);
    37. PDFRenderer pdfRenderer = new PDFRenderer(document);
    38. for (int page = 0; page < document.getNumberOfPages(); ++page) {
    39. // 渲染PDF页为图像
    40. BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
    41. // 使用Tesseract进行OCR识别
    42. String text = tesseract.doOCR(bufferedImage);
    43. // 输出识别的文本
    44. System.out.println("Page " + (page + 1) + " 识别的文本: \n" + text);
    45. // 指定要保存文本的文件路径
    46. String outputFilePath = new File(pdfOutputDir, "page_" + (page + 1) + ".txt").getAbsolutePath();
    47. // 将识别到的文本保存到文本文件
    48. try (FileWriter writer = new FileWriter(outputFilePath)) {
    49. writer.write(text);
    50. System.out.println("识别的文本已保存到: " + outputFilePath);
    51. } catch (IOException e) {
    52. e.printStackTrace();
    53. }
    54. }
    55. // 关闭PDF文档
    56. document.close();
    57. } catch (IOException | TesseractException e) {
    58. e.printStackTrace();
    59. }
    60. }
    61. }

    指定每个目录生成,每个目录中的内容生成一个txt文件

    1. package com.example.demo.Image;
    2. import net.sourceforge.tess4j.ITesseract;
    3. import net.sourceforge.tess4j.Tesseract;
    4. import net.sourceforge.tess4j.TesseractException;
    5. import org.apache.pdfbox.pdmodel.PDDocument;
    6. import org.apache.pdfbox.rendering.PDFRenderer;
    7. import org.apache.pdfbox.rendering.ImageType;
    8. import java.awt.image.BufferedImage;
    9. import java.io.File;
    10. import java.io.FileWriter;
    11. import java.io.IOException;
    12. public class ExtractPdfTextToSingleTxt {
    13. public static void main(String[] args) {
    14. // 指定要处理的根目录
    15. String rootDirectory1 = "D:\\foucus\\input\\f1"; // 请替换成您的目录路径 31
    16. processDirectory(new File(rootDirectory1));
    17. // 指定要处理的根目录
    18. String rootDirectory2 = "D:\\foucus\\input\\f2"; // 请替换成您的目录路径
    19. processDirectory(new File(rootDirectory2));
    20. // 指定要处理的根目录
    21. String rootDirectory3 = "D:\\foucus\\input\\f3"; // 请替换成您的目录路径
    22. processDirectory(new File(rootDirectory3));
    23. }
    24. private static void processDirectory(File directory) {
    25. File[] files = directory.listFiles();
    26. if (files != null) {
    27. for (File file : files) {
    28. if (file.isDirectory()) {
    29. // 如果是子目录,递归处理
    30. processDirectory(file);
    31. } else if (file.isFile() && file.getName().toLowerCase().endsWith(".pdf")) {
    32. // 如果是PDF文件,提取文字并保存到txt文件
    33. extractPdfTextToTxt(file, directory.getName());
    34. }
    35. }
    36. }
    37. }
    38. private static void extractPdfTextToTxt(File pdfFile, String directoryName) {
    39. try {
    40. // 载入PDF文件
    41. PDDocument document = PDDocument.load(pdfFile);
    42. // 创建Tesseract实例
    43. ITesseract tesseract = new Tesseract();
    44. // 设置Tesseract OCR数据文件的路径(根据您的安装位置)
    45. tesseract.setDatapath("D:\\foucus\\tessdata-main\\");
    46. // 指定要识别的语言(中文)
    47. tesseract.setLanguage("chi_sim");
    48. // 创建PDF渲染器
    49. PDFRenderer pdfRenderer = new PDFRenderer(document);
    50. StringBuilder textContent = new StringBuilder();
    51. for (int page = 0; page < document.getNumberOfPages(); ++page) {
    52. // 渲染PDF页为图像
    53. BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(page, 300, ImageType.GRAY);
    54. // 使用Tesseract进行OCR识别
    55. String text = tesseract.doOCR(bufferedImage);
    56. // 将识别的文本追加到内容中
    57. textContent.append("Page ").append(page + 1).append(" 识别的文本:\n").append(text).append("\n");
    58. }
    59. // 关闭PDF文档
    60. document.close();
    61. // 构建txt文件路径,以目录名称作为文件名
    62. String txtFileName = directoryName + ".txt";
    63. String txtFilePath = new File(pdfFile.getParent(), txtFileName).getAbsolutePath();
    64. // 将所有页面的文字内容保存到txt文件中
    65. try (FileWriter writer = new FileWriter(txtFilePath,true)) {
    66. writer.write(textContent.toString());
    67. System.out.println("PDF文本已保存到: " + txtFilePath);
    68. } catch (IOException e) {
    69. e.printStackTrace();
    70. }
    71. } catch (IOException | TesseractException e) {
    72. e.printStackTrace();
    73. }
    74. }
    75. }

  • 相关阅读:
    关于网络流
    【趣学算法】Day1 算法简介+斐波那契数列
    ansible
    Spring Bean 生命周期 (核心)(荣耀典藏版)
    深入浅出:npm常用命令详解与实战
    高数 | 旋转体体积计算方法汇总、二重积分计算旋转体体积
    【Node.js】深度解析常用核心模块-fs模块
    关于大型客户端项目的思考
    2.7 配置Keepalived提高吞吐量
    19.Spring源码解读之简单手写spring框架
  • 原文地址:https://blog.csdn.net/oMangGuoBuDing1/article/details/133694760