Tika 解析pdf时使用的内置TesseractOCRParser如何修改语言为简体中文

项目需求中需要对pdf文件进行解析提取文件中的文本内容,对比后选择使用tika库支持对多种文件自动进行解析,测试解析效果也不错。

但是遇到问题当解析扫描版pdf文件时,tika会去调用ocr工具TesseractOCRParser没有的话解析内容会为空,下载安装Tesseract后能解析出来但是内容都是乱码。

发现需要下载中文解析包并设置解析语言为中文,但是TesseractOCRParser的默认语言配置为英文,且没有看见使用tika如何去配置TesseractOCRParser的语言入口。

如果手动调用TesseractOCRParser方法去做解析的话,又得手动将pdf一页一页转换为图片后做处理比较麻烦。

通过网上查找发现两种方式,如果还有其他方法欢迎讨论指出。

方式一:修改tika包中的TesseractOCRConfig.properties文件配置

参考文档如何更改Tika传递给Tesseract OCR的语言参数?-腾讯云开发者社区-腾讯云

方式二:在创建Tika时通过反射修改TikaConfig中的TesseractOCRConfig语言字段

1、添加tika-config.xml配置



    
        
        
        
        
    

2、在创建Tika对象时使用反射修改TikaConfig中的language字段值后就可以可生效了

package com.lxh.ai.test;

import org.apache.tika.Tika;
import org.apache.tika.config.TikaConfig;
import org.apache.tika.exception.TikaException;
import org.apache.tika.parser.CompositeParser;
import org.apache.tika.parser.Parser;
import org.apache.tika.parser.ocr.TesseractOCRConfig;
import org.apache.tika.parser.ocr.TesseractOCRParser;
import org.xml.sax.SAXException;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.List;

/**
 * @author 11938
 * 将pdf、ppt、doc文件转换为txt文本
 */
public class FileConverterUtil {

    private static Tika tika;
    static {
        // 加载自定义 Tika 配置
        try {
            // 使用 ClassLoader 加载资源文件
            InputStream inputStream = new FileInputStream("D:\\work_project\\demo\\ai\\src\\main\\java\\com\\lxh\\ai\\test\\tika-config.xml");
            TikaConfig config = new TikaConfig(inputStream);
            reflect(config);
            tika = new Tika(config);
        } catch (TikaException | IOException | SAXException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void reflect(TikaConfig tikaConfig) throws Exception {
        // 获取 CompositeParser
        Field parserField = TikaConfig.class.getDeclaredField("parser");
        parserField.setAccessible(true);
        CompositeParser compositeParser = (CompositeParser) parserField.get(tikaConfig);
        // 获取 parsers 列表
        Field parsersField = CompositeParser.class.getDeclaredField("parsers");
        parsersField.setAccessible(true);
        List parsers = (List) parsersField.get(compositeParser);
        // 遍历 parsers 找到 TesseractOCRParser
        for (Parser parser : parsers) {
            if (parser instanceof TesseractOCRParser) {
                // 获取 defaultConfig 字段
                Field defaultConfigField = TesseractOCRParser.class.getDeclaredField("defaultConfig");
                defaultConfigField.setAccessible(true);
                TesseractOCRConfig defaultConfig = (TesseractOCRConfig) defaultConfigField.get(parser);
                // 修改 language 字段
                Field languageField = TesseractOCRConfig.class.getDeclaredField("language");
                languageField.setAccessible(true);
                languageField.set(defaultConfig, "chi_sim");
                // 输出修改后的值
                System.out.println("Updated language: " + defaultConfig.getLanguage());
            }
        }
    }

    public static String extractTextAndTrim(InputStream inputFile) {
        try {
            // 使用 Tika 自动检测文件类型并提取文本
            String content = tika.parseToString(inputFile);
            return content.trim();
        } catch (IOException | TikaException e) {
            System.err.println("文档处理失败: " + e.getMessage());
            return null;
        }
    }
}

你可能感兴趣的:(pdf,spring,boot)