JAVA 使用Tesseract OCR识别图片型PDF

package util.ocr;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.imgproc.Imgproc;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;

public class PdfOcrOptimizer {

// 静态初始化块,用于加载OpenCV库
static {
try {
// 加载OpenCV库
OpenCV.loadLocally();
} catch (Exception e) {
System.err.println("无法加载OpenCV库: " + e.getMessage());
e.printStackTrace();
}
}

/**
* 提取图片型PDF中的文本
*
* @param pdfPath PDF文件路径
* @param page 页码0对应实际1
* @param flag 精度低(1)、中(2)、高(3),精度越高识时间越长。
* @return 文本内容
*/
public static String extractTextFromScannedPdf(String pdfPath, int page, int flag) {
File pdfFile = new File(pdfPath);

// 检查文件是否存在
if (!pdfFile.exists()) {
System.err.println("PDF文件不存在: " + pdfPath);
return "";
}

// 检查是否为文件(而不是目录)
if (!pdfFile.isFile()) {
System.err.println("指定路径不是文件: " + pdfPath);
return "";
}

// 检查文件是否可读
if (!pdfFile.canRead()) {
System.err.println("无法读取PDF文件: " + pdfPath);
return "";
}

try (PDDocument document = Loader.loadPDF(new File(pdfPath))) {
PDFRenderer renderer = new PDFRenderer(document);
Tesseract tesseract = new Tesseract();

// 配置Tesseract
tesseract.setDatapath("tessdata"); // 训练数据路径
tesseract.setLanguage("eng"); // 英文+简体中文 +chi_sim(注:英文对数字识别更准确)
tesseract.setVariable("preserve_interword_spaces", "1");
tesseract.setVariable("user_defined_dpi", "300");
tesseract.setPageSegMode(3); //可设置为6提高准确率

// 提高渲染DPI (300 DPI)
BufferedImage image = renderer.renderImage(page, 300f / 72f);

BufferedImage processedImage = null;
if (flag == 2) {
tesseract.setLanguage("eng+chi_sim");
// 图像预处理
processedImage = preprocessImage(image);
} else if (flag == 3) {
// 图像预处理 + 去噪
processedImage = preprocessDenoiseImage(image);
}else {
processedImage = image;
}

    //可选 只识别一半,提高识别效率。
    //processedImage=processedImage.getSubimage(0, 0, image.getWidth(), image.getHeight()/2);
    
    //打印识别区域(调试使用)
    //ImageIO.write(processedImage, "png", new File("C:\\Users\\lingt\\Desktop\\test\\004\\upperHalfImage.png"));
    
    // OCR识别
return tesseract.doOCR(processedImage);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* 图像预处理
*/
private static BufferedImage preprocessImage(BufferedImage image) {
// 1. 转换为灰度图
BufferedImage grayImage = ImageHelper.convertImageToGrayscale(image);

// 2. 提高对比度
grayImage = ImageHelper.convertImageToBinary(grayImage);

// 3. 缩放图像 (可选,根据实际需要)
grayImage = ImageHelper.getScaledInstance(grayImage, grayImage.getWidth() * 2, grayImage.getHeight() * 2);


return grayImage;
}

/**
* 图像预处理
*/
private static BufferedImage preprocessDenoiseImage(BufferedImage image) {
// 1. 转换为灰度图
BufferedImage grayImage = ImageHelper.convertImageToGrayscale(image);

// 2. 提高对比度
grayImage = ImageHelper.convertImageToBinary(grayImage);

// 3. 缩放图像 (可选,根据实际需要)
grayImage = ImageHelper.getScaledInstance(grayImage, grayImage.getWidth() * 2, grayImage.getHeight() * 2);

// 4. 去噪 (可选)
grayImage = denoiseImage(grayImage);

return grayImage;
}

/**
* 可选: 使用OpenCV进行高级图像处理
*/
private static BufferedImage denoiseImage(BufferedImage image) {
// 需要OpenCV库支持
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat src = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC1);
byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
src.put(0, 0, data);

// 中值滤波去噪
Mat dst = new Mat();
Imgproc.medianBlur(src, dst, 3);

BufferedImage result = new BufferedImage(dst.cols(), dst.rows(), BufferedImage.TYPE_BYTE_GRAY);
byte[] resultData = new byte[dst.cols() * dst.rows() * (int)dst.elemSize()];
dst.get(0, 0, resultData);
result.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), resultData);

return result;
}
}

1、tessdata下载路径:https://github.com/tesseract-ocr/tessdata;
2、新建”tessdata“目录把下载的中英文语言包放入其中。再把tessdata放到项目目录下(resouces)

-------------------------------------------------以上为windows环境-----------------------------------------------------------

-------------------------------------------------------linux环境------------------------------------------------------------
1、系统安装tessdata,注意版本一般直接安装不是最新版需要升级;例如我代码中jar包5.16.0,刚安装的是4.4.1 or 5.3.1就还需要再更新。
2、升级leptonica-1.85.0.tar.gz,原1.82不满足需求。 下载地址:http://www.leptonica.org/download.html

系统ubuntu22经多次测试无法用win自带tessdata的方式处理,所以改成安装tessdata系统环境。
注:tessdata(训练数据)ubuntu中下载一般不是最新,去git(https://github.com/tesseract-ocr/tessdata)下载

posted on 2025-08-25 10:59  0o好好先生o0  阅读(21)  评论(0)    收藏  举报

导航