java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。

  1. Apache PDFBox:这是一个开源的 PDF 库,可以用来提取 PDF 文件中的文本内容。

  2. iText:这是一个用于创建和处理 PDF 文件的库,可以用来提取 PDF 文件中的文本内容。

  3. Tesseract OCR:这是一个开源的 OCR 引擎,可以用来识别图片中的文本。可以使用 Java Tesseract API 将 Tesseract 集成到 Java 项目中。

  4. ABBYY FineReader:这是一个商业 OCR 软件,可以识别多种文件格式中的文本内容,包括 PDF 和图片格式。可以使用 Java API 将 ABBYY FineReader 集成到 Java 项目中。

对于图片文档不好转的情况,可以尝试以下方法:

  1. 尝试使用更高分辨率的图片。更高的分辨率可以提高 OCR 引擎的识别精度。

  2. 尝试使用更清晰的图片。使用更清晰的图片可以减少识别错误。

  3. 尝试手动调整图片的亮度和对比度,以便更好地展示图片中的文本。

  4. 尝试使用更高级的 OCR 引擎,如 ABBYY FineReader,它具有更高的识别精度和更好的处理能力。

请注意,无论使用哪种方法,文本提取可能存在误差,需要手动进行校对和修正。

以下是使用 Apache PDFBox 库将 PDF 文档转换为文本的示例代码:

import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;public class PdfToTextConverter {public static void main(String[] args) {PDDocument document = null;try {// 读取 PDF 文件document = PDDocument.load(new File("path/to/pdf"));// 创建 PDFTextStripper 对象PDFTextStripper stripper = new PDFTextStripper();// 设置文本提取的起始页和结束页stripper.setStartPage(1);stripper.setEndPage(document.getNumberOfPages());// 提取文本内容String text = stripper.getText(document);System.out.println(text);} catch (IOException e) {e.printStackTrace();} finally {if (document != null) {try {document.close();} catch (IOException e) {e.printStackTrace();}}}}
}

以下是使用 Tesseract OCR 库将图片文档转换为文本的示例代码:

PDF 文件中的页面只包含图像,而没有可选的文字层。这意味着,不能直接使用 Tesseract OCR 引擎来提取文本内容,因为 OCR 引擎需要文本层才能进行文字识别。

在这种情况下,需要使用 PDF 图像提取工具将每个页面转换为单独的图像文件(如 PNG 或 JPEG 格式),然后再使用 Tesseract OCR 引擎对每个图像文件进行 OCR 文字识别。

<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version>
</dependency>

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;public class PdfToTextConverter {public static void main(String[] args) {String tessData = "C:\\Program Files\\Tesseract-OCR\\tessdata"; // 修改为实际的路径// 设置 Tesseract OCR 引擎的语言Tesseract tesseract = new Tesseract();tesseract.setLanguage("chi_sim");//chi_sim  简体中文  chi_tra繁体中文 注意:在安装tesseract-ocr-w64-setup-v5.0.0.20190623.exe 的时候,是勾选了中文的。tesseract.setDatapath(tessData);tesseract.setPageSegMode(3);//PageSegMode.PSM_AUTO == 3tesseract.setTessVariable("user_defined_dpi", "300");// 设置字体tesseract.setTessVariable("textonly_pdf", "1");tesseract.setTessVariable("tessedit_create_pdf", "1");tesseract.setTessVariable("pdf_font_name", "Arial"); //选项来将不可识别的字符替换为占位符。// 定义 PDF 文件路径和输出文本文件路径String pdfFilePath = "C:\\Users\\admin\\Desktop\\bookdemo\\javaTest.pdf";String outputPdfFilePath  = "C:\\Users\\admin\\Desktop\\bookdemo\\javaTestOut.pdf";//这是输出路径,不是图片储存路径String outputTextFilePath  = "C:\\Users\\admin\\Desktop\\bookdemo\\javaTestOut.txt";//这是输出路径,不是图片储存路径try {// 将 PDF 文件转换为图像文件,并保存在指定目录中PdfToImageConverter pdfToImageConverter = new PdfToImageConverter(pdfFilePath, 300);pdfToImageConverter.convertToImage("C:\\Users\\admin\\Desktop\\bookdemo\\folder");//            //==========输出到PDF
//            PDDocument document = new PDDocument();
//            for (int i = 1; i <= 1; i++) {
//            //for (int i = 1; i <= pdfToImageConverter.getPageCount(); i++) {
//                String imagePath = "C:\\Users\\admin\\Desktop\\bookdemo\\folder\\page" + i + ".png";
//                File imageFile = new File(imagePath);
//                BufferedImage image = ImageIO.read(imageFile);
//                String ocrText = tesseract.doOCR(image);
//
//                PDPage page = new PDPage();
//                document.addPage(page);
//                PDPageContentStream contentStream = new PDPageContentStream(document, page);
//                contentStream.beginText();
//                //contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);
//                //contentStream.setFont(PDType1Font.HELVETICA, 12);
//                PDType0Font font = PDType0Font.load(document, new File("C:\\Windows\\Fonts\\simhei.ttf"));
//                contentStream.setFont(font, 12);
//                contentStream.newLineAtOffset(100, 700);
//                //contentStream.showText(ocrText);
//                String[] lines = ocrText.split("\\r?\\n");
//                for (String line : lines) {
//                    contentStream.showText(line);
//                    contentStream.newLine();
//                }
//                contentStream.endText();
//                contentStream.close();
//            }
//
//            document.save(outputPdfFilePath );
//            document.close();//==========初始化输出文本文件File outputTextFile = new File(outputTextFilePath);if (outputTextFile.exists()) {outputTextFile.delete();}outputTextFile.createNewFile();// 逐个处理图像文件,并将 OCR 文本输出到文本文件中for (int i = 1; i <= pdfToImageConverter.getPageCount(); i++) {String imagePath = "C:\\Users\\admin\\Desktop\\bookdemo\\folder\\page" + i + ".png";File imageFile = new File(imagePath);// 使用 Tesseract OCR 引擎提取文本内容String ocrText = tesseract.doOCR(imageFile);// 将 OCR 文本追加到输出文本文件中FileUtils.writeStringToFile(outputTextFile, ocrText, "UTF-8", true);}System.out.println("PDF 文件转换完成。");} catch (Exception e) {e.printStackTrace();}}
}

其中用到的类:


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;public class PdfToImageConverter {private String pdfFilePath;/*** DPI 取值越高,输出的图片文件大小和渲染时间就越大(取值范围是 72 到 300)** 72 DPI:适用于屏幕显示和网络共享的低分辨率图片,例如 Web 图片、电子邮件附件等。* 96 DPI:适用于打印机打印和屏幕显示的中等分辨率图片,例如办公文档、幻灯片、简单的海报等。* 150 DPI:适用于打印机打印的高质量图片,例如印刷品、照片等。* 300 DPI:适用于高质量打印、印刷和出版,例如印刷品、高质量照片、艺术品等。*/private int dpi;public PdfToImageConverter(String pdfFilePath, int dpi) {this.pdfFilePath = pdfFilePath;this.dpi = dpi;}public void convertToImage(String outputImageFolder) throws IOException {PDDocument document = null;try {// 加载 PDF 文件document = PDDocument.load(new File(pdfFilePath));// 初始化 PDF 渲染器PDFRenderer pdfRenderer = new PDFRenderer(document);// 逐页将 PDF 文件渲染成图片,并保存到指定目录中for (int i = 0; i < document.getNumberOfPages(); i++) {//for (int i = 0; i < 1; i++) {BufferedImage image = pdfRenderer.renderImageWithDPI(i, dpi);String imagePath = outputImageFolder + File.separator + "page" + (i + 1) + ".png";ImageIO.write(image, "png", new File(imagePath));}} finally {if (document != null) {document.close();}}}public int getPageCount() throws IOException {PDDocument document = null;try {document = PDDocument.load(new File(pdfFilePath));return document.getNumberOfPages();} finally {if (document != null) {document.close();}}}
}

以下是关于Tesseract的常用网址
下载地址:https://digi.bib.uni-mannheim.de/tesseract/
官方网站:https://github.com/tesseract-ocr/tesseract
官方文档:https://github.com/tesseract-ocr/tessdoc
语言包地址:https://github.com/tesseract-ocr/tessdata

注意事项:
1.尽量不要下载dev(开发中的版本),alpha(内部测试版,一般不向外部发布,会有很多Bug),beta(公测版本,即针对所有用户公开的测试版本)等版本。

2.建议下载最新稳定版本:
tesseract-ocr-w64-setup-v5.0.0.20190623.exe 2019-06-23 11:30 38M

3.注意:安装好后,先用命令行测试是否可以把单独的图片转成文字,如果可以再跑代码

安装好中文简体语言包chi_sim.traineddata

tesseract image_file.png output_file.txt  -l chi_sim --psm 6
//其中 -l chi_sim 指定识别中文,--psm 6 指定页面分割模式为单独的一个文本行。

其他的请参考这个:Tesseract-OCR 下载安装和使用_tesseract-ocr下载_半濠春水的博客-CSDN博客

java 把pdf图片文档和文章文档转成文字的方法(此方法不好用,转换成文字可以,转成pdf不行)相关推荐

  1. java imageio删除图片_Java 提取、替换、删除PDF文档中的图片

    在一篇文章里,配有与文本信息相得益彰的图片,不仅能够活跃与美化版面,同时也有利于提高文章的可读性和阅读效果,从而增强其吸引力.同时,对文档中已存在图片的处理也尤为重要.本文将通过使用Java程序来演示 ...

  2. 使用java将多种类型的文件如Word、PDF、JPG汇总到一个文档中(Word或者PDF)

    // 以下为两个文件的代码: 可直接下载运行,下载页面:(http://download.csdn.net/detail/lmf462696585/8800097)执行文件是WordUtil4.jav ...

  3. java计算机毕业设计-图片展示及购买网站-源码+数据库+系统+lw文档+mybatis+运行部署

    java计算机毕业设计-图片展示及购买网站-源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计-图片展示及购买网站-源码+数据库+系统+lw文档+mybatis+运行部署 ...

  4. Java web/springboot上传word/doc/docx文档(含图片)与HTML富文本导入/导出互相转换解析!附项目源码

    测试效果 先看下效果 文档内容如下: 上传 上传docx文档 查看解析内容 <html><head><style>p{margin-top:0pt;margin-b ...

  5. java freemarker word_Java 用Freemarker完美导出word文档(带图片)(示例代码)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  6. java计算机毕业设计-图片展示及购买网站-源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计-图片展示及购买网站-源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计-图片展示及购买网站-源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目 ...

  7. java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署

    java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署 java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署 项目架构:B/S架构 ...

  8. java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  9. 实现pdf图片格式转换成txt文档的方法

    怎样才能将PDF转换成TXT文本? 遇到PDF与TXT转换的问题,我们该怎么办呢?之前尝试过手动用键盘打字,但是花费了很多的时间,完全不符合现代社会人的节奏,在这里,我主要讲解一种方法,就是关于如何从 ...

最新文章

  1. 趣味编程:C#中Specification模式的实现(参考答案 - 下)
  2. 由奥迪车灯想到的前端动画
  3. 引起Java序列化失败的常见原因
  4. LeetCode之Reverse Integer
  5. linux系统可以使用ppt功能不,Linux操作系统使用5.ppt
  6. C语言中 二维数组在内存中的存放顺序是,在计算机中二维数组的元素是按行顺序存放的,即在内存中,先顺序存放二维数组第一行的元素,再顺序存放二维数组第二行的元素,以此类推 答案:对...
  7. 详解:Sqoop的导入和导出数据
  8. 每天CookBook之Python-004
  9. Sandbox简介和路径获取
  10. 如何配置 Windows XP SP2 中的 Internet Explorer 增强安全功能
  11. Atitit 提升开发效率的方法 提升语言级别 目录 1. 提升语言级别到4gl 1 1.1. 语言的代际关系 sql 》script 》java 1 1.2. 使用4gl dsl语言与api 1
  12. python request.get_Python request.get_data方法代码示例
  13. 第六章、面向对象(oop)
  14. VMware安装VyOS
  15. QListView自定义Item
  16. DLL load failed while importing _imaging怎么处理
  17. 本地文件上传到github
  18. pyhanlp 繁简转换,拼音转换与字符正则化
  19. C# Environment
  20. android中英文切换功能,Android开发之中英文切换

热门文章

  1. 不起眼的暴利项目,月利润上万
  2. 相同字母异序词 向量哈希
  3. java基础知识点(一)
  4. 【Linux工具】13款Linux实用工具
  5. Ubuntu22 04右上角网络图标消失
  6. VB.NET编程的几个小技巧
  7. 3D建模靠自学很难学成功吗?
  8. 我和计算机比本领教案反思,《比本领》的教学反思(精选3篇)
  9. Linux远程桌面连接黑屏
  10. 计算机网络有哪些工作组,局域网工作组有什么作用?怎么判断两台电脑是不是在一个工作组内...