java中识别文字使用的软件是tesseractocr(使用的版本是3.02,3以后的版本才支持中文),这个软件需要安装在本地电脑中,安装的过程中全部都按照默认进行安装(以便于Java直接调用),
想要完整的程序私信我或者直接下载https://download.csdn.net/download/qq_35571894/12040072 ,打包下载完成后导入即可运行测试。
另外想要读取PDF文件信息的请点击链接:https://download.csdn.net/download/qq_35571894/12038360 spireOCR 可以识别PDF上文字信息
代码片
代码片
.
public class ImageIOHelper {
//设置语言
private Locale locale = Locale.CHINESE;
//自定义语言构造的方法
public ImageIOHelper(Locale locale){
this.locale=locale;
}
//默认构造器Locale.CHINESE
public ImageIOHelper(){
}
/**
* 创建临时图片文件防止损坏初始文件
* @param imageFile
* @param imageFormat like png,jps .etc
* @return TempFile of Image
*/
public File createImage(File imageFile, String imageFormat) throws IOException {
//读取图片文件
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);
ImageReader reader = readers.next();
//获取文件流
ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
reader.setInput(iis);
IIOMetadata streamMetadata = reader.getStreamMetadata();
//设置writeParam
TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED); //设置可否压缩
//获得tiffWriter和设置output
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");
ImageWriter writer = writers.next();
BufferedImage bi = reader.read(0);
IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
File tempFile = tempImageFile(imageFile);
ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
writer.setOutput(ios);
writer.write(streamMetadata, image, tiffWriteParam);
ios.close();
iis.close();
writer.dispose();
reader.dispose();
return tempFile;
}
/**
* 给tempfile添加后缀
* @param imageFile
* @throws IOException
*/
private File tempImageFile(File imageFile) throws IOException {
String path = imageFile.getPath();
StringBuffer strB = new StringBuffer(path);
strB.insert(path.lastIndexOf('.'),"_text_recognize_temp");
String s=strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");
Runtime.getRuntime().exec("attrib "+"\""+s+"\""+" +H"); //设置文件隐藏
return new File(strB.toString());
}
工具类
package utils;
import controller.ImageIOHelper;
import org.jdesktop.swingx.util.OS;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class OCRUtil {
private final String LANG_OPTION = "-l"; //英文字母小写l,并非阿拉伯数字1
private final String EOL = System.getProperty("line.separator");
private String tessPath = "D://Tesseract//Tsseract-OCR//Tesseract-OCR";//ocr的安装路径
public OCRUtil(String tessPath,String transFileName){
this.tessPath=tessPath;
}
//OCRUtil的构造方法,默认路径是"C://Program Files (x86)//Tesseract-OCR"
public OCRUtil(){ }
public String getTessPath() {
return tessPath;
}
public void setTessPath(String tessPath) {
this.tessPath = tessPath;
}
public String getLANG_OPTION() {
return LANG_OPTION;
}
public String getEOL() {
return EOL;
}
/**
* @param imageFile 需要识别的文件
* @param imageFormat 文件的格式
* @return
* @throws Exception
*/
public String recognizeText(File imageFile,String imageFormat)throws Exception{
File tempImage = new ImageIOHelper().createImage(imageFile,imageFormat);
return ocrImages(tempImage, imageFile);
}
//可以自定义语言
public String recognizeText(File imageFile, String imageFormat, Locale locale)throws Exception{
File tempImage = new ImageIOHelper(locale).createImage(imageFile,imageFormat);
return ocrImages(tempImage, imageFile);
}
/**
* @param tempImage 临时文件
* @param imageFile 需要识别的文件
* @return 识别后的内容
* @throws IOException
* @throws InterruptedException
*/
private String ocrImages(File tempImage,File imageFile) throws IOException, InterruptedException{
//设置输出文件的保存的文件目录,以及文件名
File outputFile = new File(imageFile.getParentFile(),"test");
StringBuffer strB = new StringBuffer();
//设置命令行内容
List<String> cmd = new ArrayList<String>();
if(OS.isWindowsXP()){
cmd.add(tessPath+"//tesseract");
}else if(OS.isLinux()){
cmd.add("tesseract");
}else{
cmd.add(tessPath+"//tesseract");
}
cmd.add("");
cmd.add(outputFile.getName());
cmd.add(LANG_OPTION);
cmd.add("chi_sim");//中文包
cmd.add("equ");//常用数学公式包
cmd.add("eng");//英语包
//创建操作系统进程
ProcessBuilder pb = new ProcessBuilder();
pb.directory(imageFile.getParentFile());//设置此进程生成器的工作目录
cmd.set(1, tempImage.getName());
pb.command(cmd);//设置要执行的cmd命令
pb.redirectErrorStream(true);//设置后续子进程生成的错误输出都将与标准输出合并
long startTime = System.currentTimeMillis();
System.out.println("开始时间:" + startTime);
Process process = pb.start();//开始执行,并返回进程实例
//最终执行命令为:tesseract 1.png test -l chi_sim+equ+eng
int w = process.waitFor();
tempImage.delete();//删除临时正在工作文件
if(w==0){ // 0代表正常退出
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
String str;
while((str = in.readLine())!=null){
strB.append(str).append(EOL);
}
in.close();
long endTime = System.currentTimeMillis();
System.out.println("结束时间:" + endTime);
System.out.println("耗时:" + (endTime - startTime) + "毫秒");
}else{
String msg;
switch(w){
case 1:
msg = "Errors accessing files.There may be spaces in your image's filename.";
break;
case 29:
msg = "Cannot recongnize the image or its selected region.";
break;
case 31:
msg = "Unsupported image format.";
break;
default:
msg = "Errors occurred.";
}
tempImage.delete();
throw new RuntimeException(msg);
}
new File(outputFile.getAbsolutePath()+".txt");//.delete();
return strB.toString().replaceAll("\\s*", "");
}
}