DocumentParse.java 3.4 KB
package com.aigeo.util;

import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;

import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Pattern;

public class DocumentParse {
    private final Tika tika;

    // 定义有意义字符的正则表达式
    private static final Pattern MEANINGFUL_CHAR_PATTERN = Pattern.compile("[\\s\\u4e00-\\u9fa5a-zA-Z0-9¥$€£¢₹₽₩₪₨₦₡₫₴₵₸₺₼₾₿.,;:'\"!?()-]*");

    // 字符限制
    private static final int CHINESE_CHAR_LIMIT = 30000;
    private static final int ENGLISH_CHAR_LIMIT = 100000;

    // 中文比例阈值
    private static final double CHINESE_THRESHOLD = 0.4;

    public DocumentParse() {
        this.tika = new Tika();
    }

//    public String parse(InputStream inputStream) throws TikaException, IOException, DocumentParseException {
//        // 使用Tika解析文档内容
//        String rawContent = this.tika.parseToString(inputStream);
//
//        // 过滤特殊字符,只保留有意义的字符
//        String filteredContent = filterMeaningfulCharacters(rawContent);
//
//        // 检查字符数是否超过限制
//        validateContentLength(filteredContent);
//
//        return filteredContent;
//    }

    /**
     * 过滤特殊字符,只保留有意义的字符
     * @param content 原始内容
     * @return 过滤后的内容
     */
    private String filterMeaningfulCharacters(String content) {
        if (content == null || content.isEmpty()) {
            return "";
        }
        // 使用正则表达式匹配有意义的字符
        StringBuilder result = new StringBuilder();
        java.util.regex.Matcher matcher = MEANINGFUL_CHAR_PATTERN.matcher(content);

        while (matcher.find()) {
            result.append(matcher.group());
        }

        return result.toString();
    }

    /**
     * 验证内容长度是否超过限制
     * @param content 过滤后的内容
     * @throws DocumentParseException 当内容超过限制时抛出异常
     */
//    private void validateContentLength(String content) throws DocumentParseException {
//        if (content == null || content.isEmpty()) {
//            return;
//        }
//
//        // 计算中文字符比例
//        double chineseRatio = calculateChineseRatio(content);
//
//        if (chineseRatio > CHINESE_THRESHOLD) {
//            // 中文文档处理
//            if (content.length() > CHINESE_CHAR_LIMIT) {
//                throw new DocumentParseException("您的文档字符超过限制,请缩减文档再次上传");
//            }
//        } else {
//            // 英文文档处理
//            if (content.length() > ENGLISH_CHAR_LIMIT) {
//                throw new DocumentParseException("您的文档字符超过限制,请缩减文档再次上传");
//            }
//        }
//    }

    /**
     * 计算中文字符在总字符中的比例
     * @param content 文档内容
     * @return 中文字符比例
     */
    private double calculateChineseRatio(String content) {
        if (content == null || content.isEmpty()) {
            return 0.0;
        }

        int totalChars = content.length();
        int chineseChars = 0;

        for (char c : content.toCharArray()) {
            // 判断是否为中文字符(基本汉字范围)
            if (c >= 0x4e00 && c <= 0x9fa5) {
                chineseChars++;
            }
        }

        return (double) chineseChars / totalChars;
    }
}